【问题标题】:how can I access to a hashed key stored by spring redis session using RedisTemplate?如何使用 RedisTemplate 访问 spring redis session 存储的散列键?
【发布时间】:2017-12-28 01:53:51
【问题描述】:

我有这个问题。

redis中存储了一个spring session,保存this way

HMSET spring:session:sessions:33fdd1b6-b496-4b33-9f7d-df96679d32fe creationTime 1404360000000 \
    maxInactiveInterval 1800 \
    lastAccessedTime 1404360000000 \
    sessionAttr:attrName someAttrValue \
    sessionAttr2:attrName someAttrValue2

据我所知是一个散列集。

我可以通过 redis-cli 使用HMGET 访问它,据我所知是获取散列键的值。

效果很好。

现在春天,我想通过 Redis 模板 (org.springframework.data.redis.core) 访问它。

所以,我做到了

@自动连线 RedisOperationsSessionRepository redisOperationsSessionRepository;

@自动连线 RedisTemplate redisTemplate;

并尝试过...

stringRedisTemplate.opsForValue().get(loggedSessionId);

redisTemplate.opsForHash().get("mykey", WHAT GOES HERE?)
redisOperationsSessionRepository.sessionRedisOperations.opsForHash().get(mykey", OR HERE?)

到目前为止,我无法访问它来获取信息,知道我必须定义什么哈希吗?没有信息弹簧是如何得到它的......

谢谢。

编辑:

我基本上想做的是

复制这个

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

如您所见,它没有以正确的方式序列化值,如果我只是使用 opsForHash 复制和“粘贴”对象可能会出现问题,或者我会保存损坏的数据吗?

【问题讨论】:

    标签: java spring session redis


    【解决方案1】:

    引用https://redis.io/topics/data-types

    Redis 哈希是字符串字段和字符串值之间的映射 ...

    所以

    redisTemplate.opsForHash().get("mykey", "myKeyHash")
    

    将返回字段myKeyHash的值存储在键mykey中。

    对于您的示例,您的文件将是 creationTimemaxInactiveIntervallastAccessedTime 和属性。

    顺便还有一个更方便的方法:

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

    【讨论】:

    • 在创建我的 redis 模板时我必须指定任何转换器吗??
    • 和...什么样的对象是来自 "sessionAttr:SPRING_SECURITY_CONTEXT" 的值?
    • 谢谢@chimmi,你知道是否有更简单的方法来获取当前记录的用户主体以及保存在redis中的数据?
    • @jpganz18 如果你想要当前用户,你为什么要 Redis?为什么不能从 SecurityContextHolder 或 http 会话中提取它?
    • 因为我在会话过滤器运行之前通过过滤器运行它,所以当我运行过滤器时,请求信息中没有用户主体的信息
    猜你喜欢
    • 2014-05-15
    • 2020-07-05
    • 2016-06-15
    • 2019-09-13
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2021-10-24
    • 2018-12-16
    相关资源
    最近更新 更多