我有这个问题。
有一个存储在redis中的spring会话,已保存this way
HMSET spring:session:sessions:33fdd1b6-b496-4b33-9f7d-df96679d32fe creationTime 1404360000000 \
maxInactiveInterval 1800 \
lastAccessedTime 1404360000000 \
sessionAttr:attrName someAttrValue \
sessionAttr2:attrName someAttrValue2
据我所知,这是一个哈希集。
我可以通过带有HMGET的redis-cli访问它,据我所知,这是获取哈希键的值。
效果很好。
现在春天,我想通过Redis Template(org.springframework.data.redis.core)访问它。
所以,我做了这个
@Autowired RedisOperationsSessionRepository redisOperationsSessionRepository;
@Autowired RedisTemplate redisTemplate;
并尝试了......
stringRedisTemplate.opsForValue()得到(loggedSessionId);
redisTemplate.opsForHash().get("mykey", WHAT GOES HERE?)
redisOperationsSessionRepository.sessionRedisOperations.opsForHash().get(mykey", OR HERE?)
到目前为止我无法访问它的信息,知道我要定义什么哈希?没有关于春天如何得到它的信息......
感谢。
编辑:
我基本上想做的是
复制此
并使用其他模板将其保存在其他redis中......
正如您所看到的,它没有以正确的方式序列化,如果我只是复制并且粘贴"可能会出现问题。使用opsForHash的对象还是我会保存损坏的数据?
答案 0 :(得分:3)
来自https://redis.io/topics/data-types
Redis Hashes是字符串字段和字符串值之间的映射...
所以
redisTemplate.opsForHash().get("mykey", "myKeyHash")
将返回存储在密钥 mykey 中的字段 myKeyHash 的值。
对于您的考试,您的文件将是 creationTime , maxInactiveInterval , lastAccessedTime 和属性。
顺便提一下,有一种更方便的方法:
redisTemplate.opsForHash().entries("mykey")
返回该哈希中包含的所有文件的映射及其值。
修改强>
由于Spring使用 JdkSerializationRedisSerializer 表示值,而 StringRedisSerializer 表示键/哈希键,因此必须按如下方式配置RedistTemplate才能正确读取数据:
RedisTemplate<String, Object> template = new RedisTemplate<>();
RedisSerializer stringSerializer = new StringRedisSerializer();
template.setConnectionFactory(...);
template.setKeySerializer(stringSerializer);
template.setHashKeySerializer(stringSerializer);