SpringDataRedis中RedisTemplate的使用

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:https://spring.io/projects/spring-data-redis

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

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

使用

  1. 引入redis依赖
  2. 在application中配置redis
  3. 注入redisTemplate进行使用

序列化

问题

RedisTemplate可以接收任意Object作为key和value写入redis:
image

但是默认是使用JDK序列化,写入前会把Object序列化为字节形式:
image

这样导致可读性差,容易出现问题

自定义序列化解决

把默认的JDK序列化改为JSON序列化:

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){
        // 创建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;
    }
}

image
这样可读性提升了,而且能够将Java对象序列化为字符串。
缺点是字符串记录了class名称,用于实现反序列化,占用了大量内存

使用String序列化器

为了节省内存,选择不适用JSON序列化器,而是使用String序列化器。
String序列化器只能存储String类型的key和value。当需要存储Java对象时,手动进行序列化和反序列化。

相当于节省了内存,复杂化了存储过程,需要手动编写序列化和反序列化的代码
自己实现的序列化和反序列化,就能够控制不将class信息写入redis了

SpringDataRedis提供了RedisTemplate的子类:StringRedisTemplate,它的key和value的序列化方式默认就是String方式,可以直接使用。
image

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

@Test
void testSaveUser() throws JsonProcessingException {
    // 创建对象
    User user = new User("虎哥", 21);
    // 手动序列化
    String json = mapper.writeValueAsString(user);
    // 写入数据
    stringRedisTemplate.opsForValue().set("user:200", json);

    // 获取数据
    String jsonUser = stringRedisTemplate.opsForValue().get("user:200");
    // 手动反序列化
    User user1 = mapper.readValue(jsonUser, User.class);
    System.out.println("user1 = " + user1);
}
posted @ 2024-02-27 18:10  ︶ㄣ演戲ㄣ  阅读(14)  评论(0)    收藏  举报