使用RedisTemplate从Redis获取Set值
我可以使用Jedis
从Redis
检索值:
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。 它也支持许多流行的编解码器。
- 排序的ArrayList不显示?
- 在Java中使用“LOAD DATA LOCAL INFILE”
- Java类文件上的ACC_SUPER访问标志的目的是什么?
- 如何在文本文件中写入时使用“制表符空间”
- 在java中将String转换为Integer的最有效方法
- 如何获得Vaadin 7应用服务器的IP和端口?
- JFrame中的JPopupMenu使用AWTUtilities.setWindowOpaque(window,false),使用合成器L&F不显示
- 根据netbeans中的单选按钮切换组件的“enable”属性
- 线程“main”中的exceptionjava.lang.NoClassDefFoundError:无法初始化类com.sun.jersey.core.header.MediaTypes