今天通过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。底层还是通过ObjectInputStream
和ObjectOutputStream
实现的。
还有一个是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"/>