简单记录一下java处理redis的几种序列化策略,这里使用的环境是springboot 2.0.4
springboot中提供了StringRedisTemplate和RedisTemplate两种序列化类,它们都只能读自己存的数据,即数据互不相通。
主要区别如下:
1、采用的序列化策略不同
StringRedisTemplate采用的是String的序列化策略;RedisTemplate默认采用的是jdk的序列化策略
2、存的数据形式不同
StringRedisTemplate存的是字符串;RedisTemplate存的是字节数组,在redis-cli中看好像乱码
3、使用范围不同
StringRedisTemplate只能处理字符串类型的数据,如果存取复杂的对象,又不想做额外的处理,最好用RedisTemplate
改写RedisTemplate:
我们可以改写RedisTemplate的序列化策略,比如使用Jackson2JsonRedisSerializer(还有很多),如下:
@Configurationpublic classRedisConfig {
@Bean
@ConditionalOnMissingBean(name= "redisTemplate")public RedisTemplateredisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate template = new RedisTemplate<>();//使用fastjson序列化
Jackson2JsonRedisSerializer fastJsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);//value的序列化采用fastJsonRedisSerializer
template.setValueSerializer(fastJsonRedisSerializer);
template.setHashValueSerializer(fastJsonRedisSerializer);//key的序列化采用StringRedisSerializer
template.setKeySerializer(newStringRedisSerializer());
template.setHashKeySerializer(newStringRedisSerializer());
template.setConnectionFactory(redisConnectionFactory);returntemplate;
}
}
与默认的JdkSerializationRedisSerializer相比,好处之一是存取对象不用实现Serializable接口,Jackson2Json中已做处理。
使用示例:
... ...
@Autowiredprivate RedisTemplateredisTemplate;public voidtestSetUser() {
User user=new User(1,"哈哈",20);
redisTemplate.opsForValue().set("user",user);
}public voidtestGetUser() {
User user=(User)redisTemplate.opsForValue().get("user");
System.out.println(user.getName());
}