使用RedisTemplate从Redis获取Set值

我可以使用JedisRedis检索值:

 public static void main(String[] args) { Jedis jedis = new Jedis(HOST, PORT); jedis.connect(); Set set = jedis.smembers(KEY); for (String s : set) { System.out.println(s); } jedis.disconnect(); jedis.close(); } 

但是当我尝试使用Spring的RedisTemplate ,我没有得到任何数据。 我的数据作为Set存储在Redis中。

  // inject the actual template @Autowired private RedisTemplate template; // inject the template as SetOperations @Resource(name="redisTemplate") private SetOperations setOps; public String logHome() { Set set = setOps.members(KEY); for(String str:set){ System.out.println(str); //EMPTY } Set keys = template.getConnectionFactory().getConnection().keys("*".getBytes()); Iterator it = keys.iterator(); while(it.hasNext()){ byte[] data = (byte[])it.next(); System.out.println(new String(data, 0, data.length)); //KEYS are printed. } Set mySet = template.boundSetOps(KEY).members(); System.out.println(mySet); //EMPTY return ""; } 

有人可以指出我错过了什么吗?

编辑:我的RedisTemplate的xml配置。

    

简而言之

您必须配置序列化程序。

说明

Redis模板使用序列化程序来获取键,值和散列键/值。 序列化程序用于将Java输入转换为存储在Redis中的表示forms。 如果未配置任何内容,则序列化程序默认为JdkSerializationRedisSerializer 。 因此,如果您在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" 

如您所见,String和Date被序列化为一些代表Java序列化对象的疯狂字节。

您的代码建议您要存储基于字符串的键和值。 只需在RedisTemplate设置StringRedisSerializer

Java配置

 redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new StringRedisSerializer()); 

XML配置

       

运行代码后的输出如下:

 value key [value] 

Spring Data Redis有一些有趣的序列化器,允许在各种系统之间进行消息交换。 您可以从内置序列化程序中进行选择

  • JacksonJsonRedisSerializer
  • Jackson2JsonRedisSerializer
  • JdkSerializationRedisSerializer(默认)
  • OxmSerializer
  • GenericToStringSerializer

或创建自己的。

我使用Spring Data Redis 1.5.1.RELEASE和jedis 2.6.2来validation您的问题的结果。 HTH,马克

进一步阅读:

  • Spring Data Redis:Serializers
  • 包含你的例子的要点

使用Redisson可以更轻松地完成任务 :

 public static void main(String[] args) { Config conf = new Config(); conf.useSingleServer().setAddress(host + ":" + port); RedissonClient redisson = Redisson.create(conf); RSet set = redisson.getSet(KEY) for (String s : set.readAllValues()) { System.out.println(s); } redisson.shutdown(); } 

此framewrok处理序列化并使用连接,因此您不需要每次都处理它。 与以前使用Java对象(Set,Map,List …)一起使用Redis。 它也支持许多流行的编解码器。