引言
spring boot简单引入redis依赖,并使用RedisTemplate进行对象存储时,需要使存储对象实现Serializable接口,这样才能够成功将对象进行序列化。
RedisTemplate默认使用的序列化机制是JdkSerializationRedisSerializer,但实际开发中,往往会以json的形式来保存数据。那么可以通过两种方式来实现这种要求,第一就是将保存的对象通过一些方法先转换成JsonString的形式,然后再通过redis保存;第二种方式,就是今天将要总结的自定义RedisSerializer的方式。
Jackson2JsonRedisSerializer
如果你使用IDE如Eclipse使用Ctrl + T 查看RedisSerializer的实现类,就可以看到很多可供选择的序列化器:
因此,根据项目实际使用场景,可以尝试选择不同的序列化器,这里也可以看到,StringRedisSerializer是专门用于序列化字符串的,以及刚才提到的jdk序列化器,还有阿里的FastJsonRedisSerializer等等。
这里我选择Jackson2JsonRedisSerializer举例演示。
@Configuration
public class RedisConfig {@Beanpublic RedisCacheManager cacheManager(RedisTemplate<String, Object> redisTemplate) {RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);cacheManager.setUsePrefix(true);return cacheManager;}@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory)throws UnknownHostException {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setKeySerializer(new StringRedisSerializer());template.setConnectionFactory(factory);// 自定义Jackson2JsonRedisSerializerJackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);// ObjectMapper om = new ObjectMapper();
// om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
// serializer.setObjectMapper(om);template.setValueSerializer(serializer);template.afterPropertiesSet();return template;}}
测试自定义序列化
注入redisTemplate:
@Autowired
private RedisTemplate<String, Object> redisTemplate;
存储对象关键代码:
ValueOperations<String, Object> opsForValue = redisTemplate.opsForValue();
String key = "emp-01";
opsForValue.set("emp-01", new Emp("张红玉", 23));
观察redis中的数据:
其中Object是一个没有实现Serializer接口的员工类,可以看到redis中依然成功保存了这个json对象。
综上,就是关于自定义序列化器的简单配置,欢迎文末留言。