最近封装一个redis工具类,Spring Boot 版本2.2.5;最初考虑仅封装一些API满足业务需求,想着一切从简,使用默认配置。最后发现key值在rdm工具上显示乱码
最初使用的rdm版本是0.8.3,当key值乱码的时候,无法直接通过工具删除缓存的数据;必须把key值改掉才可以。 后来升级了rdm到0.9.3,才能正常删除数据。
虽然可以正常操作缓存数据,但可读性不高。
查看RedisTemplate源码,keySerializer 就是序列键值使用到的序列化器。
@SuppressWarnings("rawtypes") private @Nullable RedisSerializer keySerializer = null;
@SuppressWarnings("rawtypes") private @Nullable RedisSerializer valueSerializer = null;
@SuppressWarnings("rawtypes") private @Nullable RedisSerializer hashKeySerializer = null;
@SuppressWarnings("rawtypes") private @Nullable RedisSerializer hashValueSerializer = null;
继续查看源码:
@Override
public void afterPropertiesSet() {
super.afterPropertiesSet();
boolean defaultUsed = false;
// 如果默认的序列化器为空,就创建一个
if (defaultSerializer == null) {
defaultSerializer = new JdkSerializationRedisSerializer(
classLoader != null ? classLoader : this.getClass().getClassLoader());
}
// 是否启用默认序列化器 // 默认为 true
if (enableDefaultSerializer) {
// 如果序列化器为空,则使用默认序列化器
if (keySerializer == null) {
keySerializer = defaultSerializer;
defaultUsed = true;
}
if (valueSerializer == null) {
valueSerializer = defaultSerializer;
defaultUsed = true;
}
if (hashKeySerializer == null) {
hashKeySerializer = defaultSerializer;
defaultUsed = true;
}
if (hashValueSerializer == null) {
hashValueSerializer = defaultSerializer;
defaultUsed = true;
}
}
if (enableDefaultSerializer && defaultUsed) {
Assert.notNull(defaultSerializer, "default serializer null and not all serializers initialized");
}
if (scriptExecutor == null) {
this.scriptExecutor = new DefaultScriptExecutor<>(this);
}
initialized = true;
}
通过这段代码,可以看到如果全部使用默认配置,最终key值序列化使用的是 JdkSerializationRedisSerializer
解决方案:
1、可以新建一个配置类,覆盖默认的配置。本人为了简便,暂时没有这样处理
2、在服务加载完成后设置
@Resource
private RedisTemplate<String, Object> redisTemplate;
@PostConstruct
private void init() {
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());
redisTemplate.setValueSerializer(RedisSerializer.json());
}
建议:本文为了简化配置,处理相对简单。建议还是使用配置类覆盖默认的配置