【redis笔记】

Redis简介

安装步骤

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:

字符串string

哈希hash 适合存储对象
列表list 按照插入顺序排序,可以有重复元素
集合set 无序集合,没有重复元素
有序集合sorted set 有序集合,没有重复元素

Redis常用通用命令,任何类型都可以使用

keys * :查看所有的key

ttl name:如果返回-1,说明存活时间是永久的

在java种操作redis

使用客户端Jedis

jedis的maven坐标

xml 复制代码
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.8.0</version>
</dependency>

使用jedis操作redis的步骤:

①获取链接

②执行操作

③关闭链接

java 复制代码
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;

import java.util.Set;

public class TestRedis {
    @Test
    public void test01(){
//        1获取链接
        Jedis jedis = new Jedis("localhost", 6379);


//        2执行具体的操作
        jedis.set("username","xiaoming");
        String username = jedis.get("username");
        System.out.println(username);

        jedis.del(username);

        String s = jedis.get(username);
        System.out.println(s);

        jedis.hset("hset1","value","1");
        String hget = jedis.hget("hset1", "value");
        System.out.println(hget);

        Set<String> keys = jedis.keys("*");
        for(String key:keys){
            System.out.println(key);
        }
//        3关闭连接
        jedis.close();
    }
}

在Java种操作redis进阶

使用spring data redis

redis相关配置
yml 复制代码
spring:
  application:
    #应用的名称,可选
    name: reggie_take_out
  redis:
    host: localhost
    prot: 6379
    #password: 123456
    #默认是0号数据库 换数据库命令  select 1 进入1号数据库
    #最多有16个数据库
    database: 0
    jedis:
#      redis连接池配置
      pool:
        max-active: 8
        max-wait: 1ms
        max-idle: 4
        min-idle: 0

导入依赖包

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

改变序列化方式

提供配置类

java 复制代码
package com.xue.reggie.config;

import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory connectionFactory){
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

//        默认的key序列化器为:JdkSerializationRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
//        把hash的field的序列化也改成string
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        redisTemplate.setConnectionFactory(connectionFactory);

        return redisTemplate;

    }
}

使用

java 复制代码
import com.xue.reggie.ReggieApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;
import org.springframework.test.context.junit4.SpringRunner;
import redis.clients.jedis.Jedis;

import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@SpringBootTest(classes = ReggieApplication.class)
//测试启动器
@RunWith(SpringRunner.class)
public class TestRedis {

    @Resource
    private RedisTemplate redisTemplate;

    @Test
    public void test01(){
//        1获取链接
        Jedis jedis = new Jedis("localhost", 6379);


//        2执行具体的操作
        jedis.set("username","xiaoming");
        String username = jedis.get("username");
        System.out.println(username);

        jedis.del(username);

        String s = jedis.get(username);
        System.out.println(s);

        jedis.hset("hset1","value","1");
        String hget = jedis.hget("hset1", "value");
        System.out.println(hget);

        Set<String> keys = jedis.keys("*");
        for(String key:keys){
            System.out.println(key);
        }
//        3关闭连接
        jedis.close();
    }

    /**
     * 操作普通string
     */
    @Test
    public void test02(){
//        普通
        ValueOperations valueOperations = redisTemplate.opsForValue();

//        set 无序不重复
        SetOperations setOperations = redisTemplate.opsForSet();
//        有序 可重复
        ListOperations listOperations = redisTemplate.opsForList();
//        有序 不可重复
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

        valueOperations.set("city","beijing");
        String city = (String)valueOperations.get("city");

//        设置只存在10秒钟
        valueOperations.set("k1","value1",10l, TimeUnit.SECONDS);
        System.out.println(city);

        Boolean b = valueOperations.setIfAbsent("city", "1234");
        System.out.println(b);
//        此时输出false,证明redis里面已经有"city"这个key了,虽然值不一样把

    }
    /**
     * 操作hash
     */
    @Test
    public void test03(){
        //        哈希 key-feild-value
//        存值
        HashOperations hashOperations = redisTemplate.opsForHash();
        hashOperations.put("key1","hashkey1","value1");
        hashOperations.put("key1","hashkey2","value2");

//        取值
        String o = (String) hashOperations.get("key1", "hashkey1");
        System.out.println(o);

//        获得hash结构种的所有字段
        Set keys = hashOperations.keys("key1");
        for (Object key : keys) {
            System.out.println(key);
        }
//        获得hash结构种的所有值  返回值是List
        List values = hashOperations.values("key1");
        for (Object value : values) {
            System.out.println(value);
        }
    }
    /**
     * 操作list
     */
    @Test
    public void test04(){
        ListOperations listOperations = redisTemplate.opsForList();
        listOperations.leftPushAll("mylist","a","b","v");

//        取值
        List<String> mylist = listOperations.range("mylist", 0, -1);
        for (String o : mylist) {
            System.out.println(o);//v b a
        }

        Object o = listOperations.leftPop("mylist");
        System.out.println(o);

//        获得列表长度len
        Long mylist1 = listOperations.size("mylist");
        int llist = mylist1.intValue();
        for (int i = 0; i < llist; i++) {
            String mylist2 =(String) listOperations.rightPop("mylist");
            System.out.println(mylist2);
        }

    }

    /**
     * set类型的数据
     */
    @Test
    public void test05(){
        SetOperations setOperations = redisTemplate.opsForSet();
        setOperations.add("myset","a","b","c","a");
//        取值
        Set myset = setOperations.members("myset");
        for (Object o : myset) {
            System.out.println(o);
        }

//        删除成员
        Long remove = setOperations.remove("myset", "a");
        System.out.println(remove);
    }
    /**
     * 操作zset
     */
    @Test
    public void test06(){
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
        zSetOperations.add("myzset","a",10.0);
        zSetOperations.add("myzset","b",12.0);
        zSetOperations.add("myzset","a",11.0);

        Set<String> myzset = zSetOperations.range("myzset", 0, -1);
        for (String s : myzset) {
            System.out.println(s);
        }

//        修改分数
        zSetOperations.incrementScore("myset","b",-5.0);

        zSetOperations.remove("myset","a");

    }
        /**
     * 通用操作
     */
    @Test
    public void testCommon(){
        Set<String> keys = redisTemplate.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }
//判断是否存在
        Boolean myset = redisTemplate.hasKey("myset");
//        删除指定的key
        redisTemplate.delete("myset");
//        获取指定key对应的value的数据类型
        DataType myset1 = redisTemplate.type("myset");
        System.out.println(myset1);
    }
}
使用redis
1、RedisTemplate和StringRedisTemplate的区别

区别 在于StringRedisTemplate只操作字符串 ,而RedisTemplate操作对象

  1. 两者的关系是StringRedisTemplate继承RedisTemplate。

  2. 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。

  3. SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。

StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。

RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

RedisTemplate默认使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示,类似下面

当然从Redis获取数据的时候也会默认将数据当做字节数组转化,这都是根据序列化策略来决定的。

而stringredistemplate,默认存入的数据就是原文,因为stringRedistemplate默认使用的是string序列化策略,使用stringredistemplate默认存入数据长这个样:

2、setKeySerializer和setHashKeySerializer
  • setEnableDefaultSerializer(false);

    关闭redis默认序列化器

  • setKeySerializer();

    设置string字符串的key的序列化器

  • setValueSerializer();

    设置string字符串的value的序列化器

  • setStringSerializer();

    设置String的序列化器

  • setHashKeySerializer();

    设置hash的value的序列化器

  • setHashValueSerializer();

    设置hash的value的序列化器

相关推荐
热心网友俣先生4 分钟前
2026年第二十三届五一数学建模竞赛C题超详细解题思路+各问题可用模型推荐+部分模型结果展示
c语言·开发语言·数学建模
01漫游者8 分钟前
JavaScript函数与对象增强知识
开发语言·javascript·ecmascript
GottdesKrieges9 分钟前
OceanBase恢复常见问题
java·数据库·oceanbase
IGAn CTOU9 分钟前
Java高级开发进阶教程之系列
java·开发语言
leo825...13 分钟前
Claude Code Skills 清单(本地)
java·python·ai编程
csbysj202016 分钟前
SQL NULL 函数详解
开发语言
其实防守也摸鱼19 分钟前
CTF密码学综合教学指南--第三章
开发语言·网络·python·安全·网络安全·密码学
NGSI vimp19 分钟前
Java进阶——如何查看Java字节码
java·开发语言
其实防守也摸鱼21 分钟前
CTF密码学综合教学指南--第四章
网络·笔记·安全·网络安全·密码学·ctf
We་ct1 小时前
深度剖析浏览器跨域问题
开发语言·前端·浏览器·跨域·cors·同源·浏览器跨域