redis的键和值序列化

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

<dependency>
            <groupId>org.springframework.datagroupId>
            <artifactId>spring-data-redisartifactId>
            <version>1.7.2.RELEASEversion>
dependency>

应用程序写入之后,redis客户端通过键却查不到,一开始以为是db不一样,查询应用程序的redis写入的db,发现是0:
redis的键和值序列化_第1张图片
客户端通过命令切换到0的db:

select 0

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

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}" />
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"/>

    class="org.springframework.data.redis.serializer.StringRedisSerializer" id="stringRedisSerializer"/>
    class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" id="jdkSerializationRedisSerializer"/>

你可能感兴趣的:(Redis)