我可以从Redis使用检索值Jedis:
Redis
Jedis
public static void main(String[] args) { Jedis jedis = new Jedis(HOST, PORT); jedis.connect(); Set<String> set = jedis.smembers(KEY); for (String s : set) { System.out.println(s); } jedis.disconnect(); jedis.close(); }
但是当我尝试使用Spring时RedisTemplate,我没有得到任何数据。我的数据存储Redis为Set。
RedisTemplate
Set
// inject the actual template @Autowired private RedisTemplate<String, Object> template; // inject the template as SetOperations @Resource(name="redisTemplate") private SetOperations<String,String> setOps; public String logHome() { Set<String> set = setOps.members(KEY); for(String str:set){ System.out.println(str); //EMPTY } Set<byte[]> keys = template.getConnectionFactory().getConnection().keys("*".getBytes()); Iterator<byte[]> it = keys.iterator(); while(it.hasNext()){ byte[] data = (byte[])it.next(); System.out.println(new String(data, 0, data.length)); //KEYS are printed. } Set<Object> mySet = template.boundSetOps(KEY).members(); System.out.println(mySet); //EMPTY return ""; }
有人可以向我指出我在想什么吗?
编辑:我的XML配置为RedisTemplate。
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnectionFactory"/> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="myhostname" p:port="6379" />
您必须配置串行器。
Redis模板将序列化程序用于键,值和哈希键/值。序列化器用于将Java输入转换为存储在Redis中的表示形式。如果您未进行任何配置,则序列化程序默认为JdkSerializationRedisSerializer。因此,如果您key在Java代码中要求输入密钥,则序列化程序会将其转换为
JdkSerializationRedisSerializer
key
"\xac\xed\x00\x05t\x00\x03key"
Spring Data Redis使用这些字节作为查询Redis的关键字。
您可以使用Spring Data Redis添加数据并使用进行查询redis-cli:
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"
如您所见,String和Date被序列化为代表Java序列化对象的一些疯狂字节。
您的代码建议您要存储基于字符串的键和值。只需设置StringRedisSerializer在你的RedisTemplate
StringRedisSerializer
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有一些有趣的序列化器,可以在各种系统之间交换消息。您可以从内置的序列化器中选择
或创建自己的。
我使用Spring Data Redis 1.5.1.RELEASE和jedis 2.6.2来验证问题的结果。HTH,马克
进一步阅读: