redis键值出现\xac\xed\x00\x05t\x00&的问题及解决

 更新时间:2023年07月31日 09:29:08   作者:Abstracted  
这篇文章主要介绍了redis键值出现\xac\xed\x00\x05t\x00&的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

redis键值出现\xac\xed\x00\x05t\x00&的问题

在使用redis存放键值对时,发现存放的key和value多了\xac\xed\x00\x05t\x00&的前缀,笔者存放的是字符串,结果如下图所示,出现非预期的前缀。

出现该问题的原因是 

redis template向redis存放使用java对象序列化的值,序列化方式和string的一般方式不同。

明明指定的另一个引文字符串作为key,但是实际存储后却多出来一串奇异字符串,这让笔者好奇心顿时升起来了,决定debug调试一下

从set()方法进入一路对execute()的重载方法向下跟踪,最终来到了一个T result = action.doInRedis(connToExpose);代码处

step into 进入doInRedis方法,

可以看到在一开始传入的匿名对象就是这个ValueDeserializingRedisCallback抽象类的一个匿名子类,并实现了set方法的最后一步,将数据存入redis。

来看看我的字符串key是怎么转化成byte数组的。

对rawKey方法向下追踪…

1.获取Key的序列化器,然后对我们的key进行序列化

进入serialize(key)方法,执行了JdkSerializationRedisSerializer类中的serialize方法。

继续向下跟踪…

最终!!!!

原来是使用了JDK自带的ObjectOutPutStream将我们的String对象序列化成了byte[],

来看看我们把byte数组转回字符串key发现在我原本的key之前确实拼接了乱码的字符串。

RedisTemplate对Key的序列化了解了后,我们在看看对Value的序列化是怎么一回事?

最终结果是同样的使用JDK自带的对象输出流对其进行序列化

在Key和Value都序列化后,将数据存入Redis。

最终总结可以发现一切原因都是这个默认的JdkSerializationRedisSerializerJDKRedis序列化器的序列化方式不能让人接受。

知道了问题所在,这个问题就已经解决了一半了。

我们能不能不使用这个默认的JDKRedis序列化器,自己实现一个或者换一个呢?

很幸运,Spring已经为我们提供了许多类型的序列化器了

一般我们常用的序列化器是Jackson2JsonRedisSerializerStringRedisSerializer这两种。

看名字就知道Jackson2JsonRedisSerializer是将对象序列化成JSON形式的序列化器了。

  • Jackson2JsonRedisSerializer:常用来直接序列化Value对象为JSON字符串。内部使用ObjectMapper
  • StringRedisSerializer:常用来序列化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的序列化和反序列化都正常了。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • redis-cli常用命令使用详解

    redis-cli常用命令使用详解

    这篇文章主要介绍了redis-cli常用命令使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • redis-cli创建redis集群的实现

    redis-cli创建redis集群的实现

    本文主要介绍了redis-cli创建redis集群的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • Redis 搭建哨兵集群的操作步骤

    Redis 搭建哨兵集群的操作步骤

    在 主从架构Redis搭建主从集群 中,一个slave节点挂了无影响,但是master节点挂了,就无法进行写操作了,影响高可用,Redis 提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复,本文给大家介绍了Redis 搭建哨兵集群的操作步骤,需要的朋友可以参考下
    2023-08-08
  • Redis可视化客户端小结

    Redis可视化客户端小结

    因为 Redis 官方只提供了命令行版的 Redis 客户端 redis-cli,以至于我们在使用的时候会比较麻烦,而且命令行版的客户端看起来也不够直观,下面是我这些年使用过的一些 Redis 可视化客户端,分享给大家
    2021-06-06
  • 关于Redis单线程的正确理解

    关于Redis单线程的正确理解

    很多同学对Redis的单线程和I/O多路复用技术并不是很了解,所以我用简单易懂的语言让大家了解下Redis单线程和I/O多路复用技术的原理,对学好和运用好Redis打下基础,感兴趣的朋友跟随小编一起看看吧
    2021-11-11
  • linux下安装redis图文详细步骤

    linux下安装redis图文详细步骤

    大家好,本篇文章主要讲的是linux下安装redis图文详细步骤,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 浅谈redis内存数据的持久化方式

    浅谈redis内存数据的持久化方式

    这篇文章主要介绍了浅谈redis内存数据的持久化方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 一文带你了解Redis的三种集群模式

    一文带你了解Redis的三种集群模式

    Redis 的常用的集群方式主要有以下三种,分别是主从复制模式、哨兵模式、Redis-Cluster集群模式,那么下面我们就分别了解一下这三种集群模式的优点与缺点
    2023-06-06
  • 基于Redis 实现网站PV/UV数据统计

    基于Redis 实现网站PV/UV数据统计

    PV和UV是两个重要的指标,本文主要介绍了基于Redis 实现网站PV/UV数据统计,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • Redis SETEX命令实现键值对管理

    Redis SETEX命令实现键值对管理

    本文主要介绍了Redis SETEX命令实现键值对管理,SETEX命令用于设置具有过期时间的键值对,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06

最新评论