简单记录一下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(还有很多),如下:
@Configuration public class RedisConfig { @Bean @ConditionalOnMissingBean(name = "redisTemplate") public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<Object, Object> template = new RedisTemplate<>(); //使用fastjson序列化 Jackson2JsonRedisSerializer<Object> fastJsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class); //value的序列化采用fastJsonRedisSerializer template.setValueSerializer(fastJsonRedisSerializer); template.setHashValueSerializer(fastJsonRedisSerializer); //key的序列化采用StringRedisSerializer template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setConnectionFactory(redisConnectionFactory); return template; } }
与默认的JdkSerializationRedisSerializer相比,好处之一是存取对象不用实现Serializable接口,Jackson2Json中已做处理。
使用示例:
... ... @Autowired private RedisTemplate<Object,Object> redisTemplate; public void testSetUser() { User user=new User(1,"哈哈",20); redisTemplate.opsForValue().set("user",user); } public void testGetUser() { User user=(User)redisTemplate.opsForValue().get("user"); System.out.println(user.getName()); }
原文:https://www.cnblogs.com/javasl/p/13629149.html