RedisTemplate 保存数据的键值通过rdm可视化工具查看乱码
生活随笔
收集整理的這篇文章主要介紹了
RedisTemplate 保存数据的键值通过rdm可视化工具查看乱码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近封裝一個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;繼續查看源碼:
@Overridepublic void afterPropertiesSet() {super.afterPropertiesSet();boolean defaultUsed = false;// 如果默認的序列化器為空,就創建一個 if (defaultSerializer == null) {defaultSerializer = new JdkSerializationRedisSerializer(classLoader != null ? classLoader : this.getClass().getClassLoader());}// 是否啟用默認序列化器 // 默認為 trueif (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
解決方案:
添加配置類
package com.ctsi.config;import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration public class RedisConfig {@Bean@SuppressWarnings("all")public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){RedisTemplate<String,Object> template=new RedisTemplate<>();template.setConnectionFactory(factory);//配置具體的序列化方式Jackson2JsonRedisSerializer objectJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper mapper = new ObjectMapper();mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);objectJackson2JsonRedisSerializer.setObjectMapper(mapper);StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();//key 采用string 的序列化方式template.setKeySerializer(stringRedisSerializer);//hash的key也采用string的序列化方式template.setHashKeySerializer(stringRedisSerializer);//value序列化方式采用jacksontemplate.setValueSerializer(objectJackson2JsonRedisSerializer);//hash的value序列化方式采用jacksontemplate.setHashValueSerializer(objectJackson2JsonRedisSerializer);template.afterPropertiesSet();return template;} }總結
以上是生活随笔為你收集整理的RedisTemplate 保存数据的键值通过rdm可视化工具查看乱码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RDM原始设备映射
- 下一篇: 2022年全球市场单相交流变频器总体规模