SpringBoot使用RedisTemplate操作Redis时,key值出现 -xac-xed-x00-x05t-x00-tb

原因分析

原因与RedisTemplate源码中的默认序列化方式有关

1defaultSerializer = new JdkSerializationRedisSerializer( 2 classLoader != null ? classLoader : this.getClass().getClassLoader());`

默认序列化使用的是JdkSerializationRedisSerializer,我们进去看看

1 public JdkSerializationRedisSerializer(ClassLoader classLoader) { 2 this(new SerializingConverter(), new DeserializingConverter(classLoader)); 3 }

可以看到这里使用了SerializingConverter对象,再进去看看,
这里的convert方法就是这个对象传入JdkSerializationRedisSerializer后会被调用的方法

1public byte[] convert(Object source) { 2 ByteArrayOutputStream byteStream = new ByteArrayOutputStream(1024); 3 4 try { 5 this.serializer.serialize(source, byteStream); 6 return byteStream.toByteArray(); 7 } catch (Throwable var4) { 8 throw new SerializationFailedException("Failed to serialize object using " + this.serializer.getClass().getSimpleName(), var4); 9 } 10 }

可以看出来这里使用普通的serializer的serialize方法,并没有什么特别的
但是问题就在于,这里的source是Object对象,
JdkSerializationRedisSerializer把传入的值当Object对象进行序列化,所以可以猜测这里key出现的\xac\xed\x00\x05t\x00\tb其实可能是对象头信息。


解决方案

我们可以使用下面这种方法设置其他序列化方式,这样就不会出现问题:

1redisTemplate.setKeySerializer(new StringRedisSerializer()); 2redisTemplate.setValueSerializer(new StringRedisSerializer()); 3redisTemplate.setHashKeySerializer(new StringRedisSerializer()); 4redisTemplate.setHashValueSerializer(new StringRedisSerializer());

但是这种方法明显很不优雅,所以我们应该直接使用StringRedisTemplate类来解决问题:

1@Autowired 2private StringRedisTemplate stringRedisTemplate;

它帮我们进行了设置序列化方式的封装,我们可以看看它的构造方法:

1public StringRedisTemplate() { 2 RedisSerializer<String> stringSerializer = new StringRedisSerializer(); 3 setKeySerializer(stringSerializer); 4 setValueSerializer(stringSerializer); 5 setHashKeySerializer(stringSerializer); 6 setHashValueSerializer(stringSerializer); 7 }

当然也可以使用配置的方式设置序列化方法,不过这里就不作出说明了。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid

SpringBoot整合Redis乱码原因及解决方案

问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa