In short
您必须配置序列化器。
解释
Redis 模板使用键、值和哈希键/值的序列化器。序列化器用于将 Java 输入转换为存储在 Redis 中的表示形式。如果您不配置任何内容,则序列化器默认为JdkSerializationRedisSerializer
。所以如果你要钥匙key
在您的 Java 代码中,序列化器将其转换为
"\xac\xed\x00\x05t\x00\x03key"
Spring Data Redis 使用这些字节作为查询 Redis 的键。
您可以使用 Spring Data Redis 添加数据并使用redis-cli
:
template.boundSetOps("myKey").add(new Date());
然后在redis-cli
127.0.0.1:6379> keys *
1) "\xac\xed\x00\x05t\x00\x05myKey"
127.0.0.1:6379> SMEMBERS "\xac\xed\x00\x05t\x00\x05myKey"
1) "\xac\xed\x00\x05sr\x00\x0ejava.util.Datehj\x81\x01KYt\x19\x03\x00\x00xpw\b\x00\x00\x01N\xcf#\x9cHx"
如您所见,字符串和日期被序列化为一些代表 Java 序列化对象的疯狂字节。
您的代码表明您想要存储基于字符串的键和值。只需设置StringRedisSerializer
在你的RedisTemplate
Java配置
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
XML配置
<bean id="stringSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
p:connection-factory-ref="jedisConnectionFactory">
<property name="keySerializer" ref="stringSerializer"/>
<property name="valueSerializer" ref="stringSerializer"/>
</bean>
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="myhostname" p:port="6379"/>
运行代码后的输出如下所示:
value
key
[value]
Spring Data Redis 有一些有趣的序列化器,允许在不同系统之间交换消息。您可以从内置序列化器中进行选择
- JacksonJsonRedis序列化器
- Jackson2JsonRedis序列化器
- JdkSerializationRedisSerializer(默认)
- Oxm序列化器
- 通用转字符串序列化器
或创建您自己的。
我使用 Spring Data Redis 1.5.1.RELEASE 和 jedis 2.6.2 来验证您问题的结果。 HTH,马克
进一步阅读:
- Spring Data Redis:序列化器 http://docs.spring.io/spring-data/redis/docs/current/reference/html/#redis:serializer
- 包含您的示例的要点 https://gist.github.com/mp911de/65b2639dc344fb1cbb2f