【 Redis】的乱码问题

问题描述:

使用RedisTemplate存储的数据,在 redis-cli 客户端查看时,key 和 value 都会携带类似\xac\xad\这样的字符串。

原因:

由于默认使用了 jdk 的序列化方式。以下是支持的序列化方式

项目一般都会有缓存,常常使用redis来存取缓存(现在已不推荐使用session存储缓存),我们的键(key)和值(value)都是通过Spring提供的Serializer序列化到数据库的。RedisTemplate默认使用的是JdkSerializationRedisSerializer,StringRedisTemplate默认使用的是StringRedisSerializer。

解决方法:

在系统启动完后,初始化缓存序列化器。 将redisTemplate默认使用JdkSerializationRedisSerializer序列化 改为 stringRedis序列化方式。

key和value都使用String序列化:

注:

1. ApplicationRunner接口可以实现springboot应用启动后做一些初始化操作

2. 为什么使用Serializer

因为redis是以key-value的形式将数据存在内存中,key就是简单的string,key似乎没有长度限制,不过原则上应该尽可能的短小且可读性强,无论是否基于持久存储,key在服务的整个生命周期中都会在内存中,因此减小key的尺寸可以有效的节约内存,同时也能优化key检索的效率。

value在redis中,存储层面仍然基于string,在逻辑层面,可以是string/set/list/map,不过redis为了性能考虑,使用不同的"encoding"数据结构类型来表示它们。(例如:linkedlist,ziplist等)。

所以可以理解为,其实redis在存储数据时,都把数据转化成了byte[]数组的形式,那么在存取数据时,需要将数据格式进行转化,那么就要用到序列化和反序列化了,这也就是为什么需要配置Serializer的原因。

参考链接:https://blog.csdn.net/u010096624/article/details/109046714

源码追溯:https://blog.csdn.net/qq_16159433/article/details/121491555

多方法实现:https://blog.csdn.net/m4330187/article/details/108091447

相关推荐
15942315632 分钟前
QT使用WxSQLite3打开加密数据库并查询
数据库·qt·sqlite
风象南30 分钟前
SpringBoot的5种签到打卡实现方案
java·spring boot·后端
程序员阿超的博客1 小时前
【数据篇】持久化核心:整合 JPA/MyBatis 实现优雅的数据库操作
数据库·mybatis
懒虫虫~5 小时前
基于SpringBoot利用死信队列解决RabbitMQ业务队列故障重试无效场景问题
spring boot·rabbitmq
struggle20255 小时前
RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上
数据库·typescript·neo4j
伤不起bb7 小时前
Redis 哨兵模式
数据库·redis·缓存
迪迦不喝可乐7 小时前
Redis 知识点一
redis·缓存
卑微的Coder7 小时前
Redis Set集合命令、内部编码及应用场景(详细)
java·数据库·redis
2501_915373887 小时前
Redis线程安全深度解析:单线程模型的并发智慧
数据库·redis·安全