SpringDataRedis 使用

  • 1. SpringDataRedis 特点
  • 2. 使用 SpringDataRedis 步骤
  • 3. 自定义 RedisTemplate 序列化
  • 4. SpringDataRedis 操作对象

1. SpringDataRedis 特点

  • 提供了对不同 Redis 客户端的整合(Lettuce 和 Jedis)
  • 提供了 RedisTemplate 统一 API 来操作 Redis
  • 支持 Redis 的发布订阅模型
  • 支持 Redis 哨兵和 Redis 集群
  • 支持基于 Lettuce 的响应式编程
  • 支持基于 JDK、JSON、字符串、Spring 对象的数据序列化及反序列化
  • 支持基于 Redis 的 JDKCollection 实现

SpringDataRedis 中提供了 RedisTemplate 工具类,其中封装了各种对 Redis 的操作。并将不同数据类型的操作 API 封装到了不同的类型中:

API 返回值类型 说明
redisTemplate.opsForvalue() valueOperations 操作 String 类型数据
redisTemplate.opsForHash() HashOperations 操作 Hash 类型数据
redisTemplate.opsForList() ListOperations 操作 List 类型数据
redisTemplate.opsForSet() SetOperations 操作 Set 类型数据
redisTemplate.opsForZSet() ZSetOperations 操作 SortedSet 类型数据

2. 使用 SpringDataRedis 步骤

1. 创建项目

SpringDataRedis 使用_第1张图片

这里注意选2的版本

SpringDataRedis 使用_第2张图片

2. 引入依赖

<dependency>
            <groupId>org.apache.commonsgroupId>
            <artifactId>commons-pool2artifactId>
             dependency>

SpringDataRedis 使用_第3张图片

3. 配置 Redis

spring:
  redis:
    host: 140.210.207.112
    port: 6379
    password: 123456
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 0
        max-wait: 100ms

4. 注入 RedisTemplate,编写测试用例

@Autowired
    private RedisTemplate redisTemplate;

    @Test
    void testString() {
        //写入一条 string 数据
        redisTemplate.opsForValue().set("name","李四");
        //获取 string 数据
        Object name = redisTemplate.opsForValue().get("name");
        //打印
        System.out.println("name = "+name);
    }

SpringDataRedis 使用_第4张图片

SpringDataRedis 使用_第5张图片

但我们发现 redis 里面没有存进去

SpringDataRedis 使用_第6张图片

用可视化工具查看一下:

SpringDataRedis 使用_第7张图片

这个是序列化的问题,RedisTemplate 可以接收任意 Object 作为值写入 Redis,只不过写入前会把 Object 序列化为字节形式,默认就是采用 JDK 序列化。

SpringDataRedis 使用_第8张图片

3. 自定义 RedisTemplate 序列化

先引入 Jackson 依赖:

<dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-databindartifactId>
        dependency>
@Configuration
public class RedisConfig {

    @Resource
    RedisConnectionFactory connectionFactory;

    @Bean
    public RedisTemplate<String, Object> redisTemplate(){
        // 创建RedisTemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 设置连接工厂
        template.setConnectionFactory(connectionFactory);
        // 创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer =
                new GenericJackson2JsonRedisSerializer();
        // 设置Key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        // 设置Value的序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        // 返回
        return template;
    }
}

SpringDataRedis 使用_第9张图片

这样就可以读取到了:

SpringDataRedis 使用_第10张图片

但在服务器上值还是乱码:

在这里插入图片描述

我们启动服务器命令在后面加上 --raw就好了

在这里插入图片描述

在这里插入图片描述

redisTemplate 可以操作着不同的数据类型,api 和我们的指令是一样的。
opsForValue:操作字符串 -> String
opsForList:操作 List -> List
opsForSet:操作 Set -> Set
opsForHash:操作 Hash
opsForZSet:操作 ZSet
opsForGeo:操作 Geospatial
opsForHyperLogLog: 操作 HyperLogLog
除了基本的操作,我们常用的方法都可以直接通过 redisTemplate 操作,比如事务,和基本的 CRUD。

SpringDataRedis 使用_第11张图片

4. SpringDataRedis 操作对象

SpringDataRedis 使用_第12张图片

这里不使用无参构造方法会报错,注意一下:

SpringDataRedis 使用_第13张图片

SpringDataRedis 使用_第14张图片

这里采用了 JSON 序列化来代替默认的 JDK 序列化方式:

SpringDataRedis 使用_第15张图片

整体可读性有了很大提升,并且能将Java对象自动的序列化为 JSON 字符串,并且查询时能自动把 JSON 反序列化为 Java 对象。不过,其中记录了序列化时对应的 class 名称,目的是为了查询时实现自动反序列化。这会带来额外的内存开销。

所以我们为了节省内存空间,我们可以不使用 JSON 序列化器来处理 value,而是统一使用 String 序列化器,要求只能存储 String 类型的 key 和 value。当需要存储 Java 对象时,手动完成对象的序列化和反序列化。

SpringDataRedis 使用_第16张图片

这样我们存入和读取时的序列化及反序列化都是我们自己实现的,SpringDataRedis 就不会将 class 信息写入Redis了。

这种用法比较普遍,因此 SpringDataRedis 就提供了 RedisTemplate 的子类:StringRedisTemplate,它的 key 和 value 的序列化方式默认就是 String 方式。
SpringDataRedis 使用_第17张图片

@Autowired
    private StringRedisTemplate stringRedisTemplate;
    // JSON序列化工具
    private static final ObjectMapper mapper = new ObjectMapper();

    @Test
    void testSaveUser2() throws JsonProcessingException {
        // 创建对象
        User user = new User("张三", 22);
        // 手动序列化
        String JSON = mapper.writeValueAsString(user);
        // 写入数据
        stringRedisTemplate.opsForValue().set("user", JSON);

        // 获取数据
        String jsonUser = stringRedisTemplate.opsForValue().get("user");
        // 手动反序列化
        User user1 = mapper.readValue(jsonUser, User.class);
        System.out.println("user1 = " + user1);
    }

SpringDataRedis 使用_第18张图片

SpringDataRedis 使用_第19张图片

你可能感兴趣的:(Redis,java,spring,boot,redis)