Spring Boot整合Redis——自定义RedisSerializer

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014745069/article/details/86559881

引言

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 {
    
    @Bean
    public RedisCacheManager cacheManager(RedisTemplate<String, Object> redisTemplate) {
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
        cacheManager.setUsePrefix(true);
        return cacheManager;
    }
    
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory)
                    throws UnknownHostException {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setKeySerializer(new StringRedisSerializer());
        template.setConnectionFactory(factory);
        // 自定义Jackson2JsonRedisSerializer
        Jackson2JsonRedisSerializer<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对象。 

 综上,就是关于自定义序列化器的简单配置,欢迎文末留言。

猜你喜欢

转载自blog.csdn.net/u014745069/article/details/86559881