redis的键和值序列化

在使用spring-data-redis向Redis写入数据时,遇到查询不到数据的情况。检查发现数据存在于db0,但内容显示为序列化的乱码。问题根源在于Redis的序列化机制,具体为JdkSerializationRedisSerializer进行键值对的序列化。解决办法是可以通过配置手动指定key和value的序列化方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天通过spring-data-redis向redis写数据。

<dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.7.2.RELEASE</version>
</dependency>

应用程序写入之后,redis客户端通过键却查不到,一开始以为是db不一样,查询应用程序的redis写入的db,发现是0:
这里写图片描述
客户端通过命令切换到0的db:

select 0

依然查询不到,于是打断点,在进入spring的类之前,对key并没有做什么操作或者转换,于是使用rdm工具来看下redis的数据:
这里写图片描述
可以发现数据确实都在db0里,然后点开,发现都是序列化的乱码数据,然后想到可能是序列化的问题,在断点中看到一个类,JdkSerializationRedisSerializer
这个类是Redis用来序列化键值用的,实现了RedisSerializer接口,这个接口还有一些其它的实现类:
这里写图片描述
主要说两个,JdkSerializationRedisSerializer是通过jdk本身的序列化机制来序列化的,序列化的是实现了Serializable接口的POJO。底层还是通过ObjectInputStreamObjectOutputStream实现的。
还有一个是StringRedisSerializer,这个类是将字符串序列化,一般用来序列化键。
因为我使用的是org.springframework.data.redis.core.RedisTemplate,所以默认使用JdkSerializationRedisSerializer来序列化键和值,当然通过客户端就查不到了,可以手动指定key和value的序列化方式:

<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
          p:use-pool="true" p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.password}" />
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
          p:connection-factory-ref="jedisConnectionFactory"
          p:enableTransactionSupport="true"
          p:keySerializer-ref="stringRedisSerializer"
          p:valueSerializer-ref="jdkSerializationRedisSerializer"/>

    <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" id="stringRedisSerializer"/>
    <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" id="jdkSerializationRedisSerializer"/>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值