如何使用RedisTemplate访问spring redis会话存储的哈希键?

时间:2017-07-21 22:07:54

标签: java spring session redis

我有这个问题。

有一个存储在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?)

到目前为止我无法访问它的信息,知道我要定义什么哈希?没有关于春天如何得到它的信息......

感谢。

编辑:

我基本上想做的是

复制此

enter image description here

并使用其他模板将其保存在其他redis中......

正如您所看到的,它没有以正确的方式序列化,如果我只是复制并且粘贴"可能会出现问题。使用opsForHash的对象还是我会保存损坏的数据?

1 个答案:

答案 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);