1.起因

在本地搭建了一个项目用来测试SpringBoot利用SpringCache整合Redis哨兵模式,写了如下配置类:

  1. @Configuration
  2. @ConditionalOnClass(RedisOperations.class)
  3. @EnableConfigurationProperties(RedisProperties.class)
  4. @EnableCaching
  5. public class RedisConfig {
  6. @Bean
  7. public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
  8. RedisTemplate<String, Object> template = new RedisTemplate<>();
  9. template.setConnectionFactory(factory);
  10. // 使用Jackson2JsonRedisSerialize 替换默认的jdkSerializeable序列化
  11. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  12. ObjectMapper om = new ObjectMapper();
  13. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  14. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  15. jackson2JsonRedisSerializer.setObjectMapper(om);
  16. StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
  17. // key采用String的序列化方式
  18. template.setKeySerializer(new StringRedisSerializer(StandardCharsets.UTF_8));
  19. // hash的key也采用String的序列化方式
  20. template.setHashKeySerializer(stringRedisSerializer);
  21. // value序列化方式采用jackson
  22. template.setValueSerializer(jackson2JsonRedisSerializer);
  23. // hash的value序列化方式采用jackson
  24. template.setHashValueSerializer(jackson2JsonRedisSerializer);
  25. template.afterPropertiesSet();
  26. return template;
  27. }
  28. }

然后在可视化工具中,看到的却是乱码:
image.png

2.解决办法

上网查了一下,如果整合了SpringCache的话,还需要修改CacheManager的序列化方式,在配置类中新增如下代码

  1. @Bean
  2. public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
  3. // 根据 Redis 连接工厂构建 Redis 缓存管理器
  4. return RedisCacheManager.builder(redisConnectionFactory)
  5. // 默认的缓存配置
  6. .cacheDefaults(RedisCacheConfiguration.defaultCacheConfig()
  7. // 序列化key
  8. .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string()))
  9. // 序列化value
  10. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json())))
  11. // 启用 Redis 缓存,使缓存放置/驱逐操作与正在进行的 Spring 管理的事务同步。
  12. .transactionAware()
  13. // 构建
  14. .build();
  15. }

我们再放入一条数据查看
image.png
搞定~