当前位置:网站首页>redis键值出现 xacxedx00x05tx00&的解决方法
redis键值出现 xacxedx00x05tx00&的解决方法
2022-08-03 07:51:00 【m0_67401606】
笔者在使用redis存放键值对时,发现存放的key和value多了?ít&的前缀,笔者存放的是字符串,结果如下图所示,出现非预期的前缀。
出现该问题的原因是, redis template向redis存放使用java对象序列化的值,序列化方式和string的一般方式不同。
明明指定的另一个引文字符串作为key,但是实际存储后却多出来一串奇异字符串,这让笔者好奇心顿时升起来了,决定debug调试一下
从set()方法进入一路对execute()的重载方法向下跟踪,最终来到了一个T result = action.doInRedis(connToExpose);代码处

step into 进入doInRedis方法,
可以看到在一开始传入的匿名对象就是这个ValueDeserializingRedisCallback抽象类的一个匿名子类,并实现了set方法的最后一步,将数据存入redis。
来看看我的字符串key是怎么转化成byte数组的。对rawKey方法向下追踪…
获取Key的序列化器,然后对我们的key进行序列化


进入
serialize(key)方法,执行了JdkSerializationRedisSerializer类中的serialize方法。继续向下跟踪…


最终!!!!,原来是使用了JDK自带的ObjectOutPutStream将我们的String对象序列化成了byte[],
来看看我们把byte数组转回字符串key发现在我原本的key之前确实拼接了乱码的字符串。
RedisTemplate对Key的序列化了解了后,我们在看看对Value的序列化是怎么一回事?

最终结果是同样的使用JDK自带的对象输出流对其进行序列化。
在Key和Value都序列化后,将数据存入Redis。最终总结可以发现一切原因都是这个默认的JdkSerializationRedisSerializerJDKRedis序列化器的序列化方式不能让人接受。
知道了问题所在,这个问题就已经解决了一半了。
我们能不能不使用这个默认的JDKRedis序列化器,自己实现一个或者换一个呢?
很幸运,Spring已经为我们提供了许多类型的序列化器了
一般我们常用的序列化器是Jackson2JsonRedisSerializer和StringRedisSerializer这两种。看名字就知道Jackson2JsonRedisSerializer是将对象序列化成JSON形式的序列化器了。
Jackson2JsonRedisSerializer:常用来直接序列化Value对象为JSON字符串。内部使用ObjectMapperStringRedisSerializer:常用来序列化Key,也可以用来序列化Value。
于是乎我们对RedisTemplate进行配置:
/**
* 如果key和value都使用的StringRedisSerializer序列化器,则推荐使用StringRedisTemplate
*
* 配置Redis的Key和Value的序列化器
* @param redisTemplate 从容器中获取RedisTemplate
* @return 修改后的RedisTemple
*/
@Bean
public RedisTemplate<Object, Object> redisStringTemplate(RedisTemplate<Object, Object> redisTemplate) {
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
// 如果手动将Value转换成了JSON,就不要再用JSON序列化器了。
// redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
redisTemplate.setValueSerializer(stringRedisSerializer);
return redisTemplate;
}
查验结果:key和value的序列化和反序列化都正常了。
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- 基于SSM开发的的小区物业管理系统小程序源码
- redis AOF持久化个人理解
- Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例
- Docker启动mysql
- 五、《图解HTTP》报文首部和HTTP缓存
- 安装mysql-workbench
- - display image API OpenCV 】 【 imshow () to a depth (data type) at different image processing methods
- 0day_Topsec上网行为管理RCE
- 跨域嵌套传递信息(iframe)
- [Kaggle combat] Prediction of the number of survivors of the Titanic (from zero to submission to Kaggle to model saving and restoration)
猜你喜欢
随机推荐
数仓4.0(二)------ 业务数据采集平台
jolt语法
Docker starts mysql
AI中台序列标注任务:三个数据集构造过程记录
并发之固定运行和交替运行方案
加载properties文件,容器总结
AI mid-stage sequence labeling task: three data set construction process records
ArcEngine (2) loading the map document
Evaluate: A detailed introduction to the introduction of huggingface evaluation indicator module
ArcEngine(五)用ICommand接口实现放大缩小
内存模型之可见性
服务器资源监控工具-nmon、nmon_analyser
C语言实现树的底层遍历--超简代码
ArcEngine (4) Use of MapControl_OnMouseDown
【云原生--Kubernetes】Pod重启策略
分治法求解中位数
sqlite 日期字段加一天
ArcEngine(六)用tool工具实现拉框放大缩小和平移
DeFi明斯基时刻:压力测试与启示
Taro框架-微信小程序-内嵌h5页面








