为什么选择写这篇这主要是之前采用的redis引入方式的变更问题。
变更前采用经典的自定义连接池:自定义配置类,将其注入到自定义连接池中配置Redis,算是参考springboot的自动装配原理吧。单机模式部分,直接启动即可,意义不大,官方直接拷贝运行配置即可。
实验环境:
java version "1.8.0_202"
IntelliJ_IDEA 2019.1
先抛出一个问题:
关于默认配置下的设置取值问题,虽然网上文章也不乏这类解释,但是自己去操作一遍就是自己的感受了,这是我在以往方式中是没有遇到过的(因为相当于外置了):设置值与预期不一致
其实下面这段代码与内部的取设值是完全没有问题的,问题在于我用管理工具查看时,
发现值与我通常相当于外置的redis时有出入,会多出一些类似16进制前缀,对应的值也不是我能看懂的值
redisTemplate.opsForValue().set("kk",666);
然而通过管理工具发现:莫名出现前缀

通过源码发现,只要没有设置默认值,则所有方法都
采用JdkSerializationRedisSerializer 的序列化方式对其序列化

调用set的方法内:

待与远程端设置值后,就有了开头那个键值对。
与我们自行测试的方式是一样的。

如何避免?
既然前面提到源码中
public void afterPropertiesSet() 中会进行校验是否有设置值,那么就让我们来进行设置序列化方式,这样就能替代默认序列化的问题(理论上)
下方列出了四种不同的序列化方式,当然也可以自定义序列化方式,来避免默认方式造成的问题
(谨记要想成功顶替需要满足):
参考 org.springframework.boot.autoconfigure.data.redis 下的 RedisAutoConfiguration类
1、要么@Bean("redisTemplate")
2、要么方法名及其参数返回类型一致才可以
@Configuration
public class RedisConfig {
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
之后:(我们想要的结果就回来了)

对于配置类可能无法自动提醒补充的话可以附带依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
笼统的序列化方式基本是如下几种:
RedisSerializer redis序列化的接口类
OxmSerializer xml到object的序列化/反序列化
StringRedisSerializer string字符串的序列化/反序列化
JacksonJsonRedisSerializer json到object的序列化/反序列化
Jackson2JsonRedisSerializer json到object的序列化/反序列化
JdkSerializationRedisSerializer java对象的序列化/反序列化
如果存在不能理解的地方可以留言

本文探讨了在使用Spring Boot框架时,如何解决Redis默认序列化导致的数据格式问题。通过自定义Redis配置类,实现了对RedisTemplate的序列化方式的替换,有效避免了默认序列化方式带来的数据解读困难。
2586

被折叠的 条评论
为什么被折叠?



