【问题标题】:How to configure Redis cache for session management with UUIDs如何使用 UUID 为会话管理配置 Redis 缓存
【发布时间】:2019-07-14 20:41:15
【问题描述】:

我正在尝试将 Redis 配置为 Java 应用程序中的缓存层。具体来说,Redis 的预期用途是维护会话状态。应用程序中的每个用户将表示为:

  • 与会话 ID 对应的 UUID
  • userId 值
  • 上次访问时间
  • 也许还有其他一些小领域

我对如何使用 Redis 的哈希感到困惑。 Jedis的接口是:

Jedis#hset(byte[] key, byte[] field, byte[] value)

也就是说,Redis 哈希有一个键,该键又指向另一个字段和值的映射。

我应该使用什么设计:

  • 高效地将每个用户的 UUID 存储在哈希中
  • 还可以利用 Redis 使文件过期的能力

对于上面的第二点,如果我想使条目过期,则必须在键级别而不是字段级别完成。但是,这意味着每个 UUID 都必须是散列中的一个单独的键,并且不清楚这是否是好的 Redis 设计。

【问题讨论】:

    标签: caching redis jedis


    【解决方案1】:

    为会话状态使用 Redis 哈希是很常见的。标准方法是使用会话 ID 作为键,并将哈希字段用于会话状态的其余部分。该设计具有以下理想特点:

    • 您可以在 O(1) 时间内获取会话状态。
    • 您可以设置会话的到期时间。
    • 您可以在会话中存储任意数量的信息。

    我相信这符合您的要求。

    您对“Redis 哈希有一个密钥”和“哈希中的密钥”这两个短语的使用让我认为您误解了哈希的工作原理。键是散列的名称,如果你愿意,不是它的成员。 HSET 签名指定要修改哪个哈希(密钥),以及要在其中设置的字段和值。

    以下是创建会话的示例(使用 Redis 命令):

    HMSET session:123 userId 5 last_login 2019-02-13 ...
    EXPIRE session:123 2592000
    

    然后您可以通过以下方式获取会话数据:

    HGET session:123 last_login
    

    或者设置:

    HSET session:123 last_login 2019-02-18
    

    【讨论】:

    • 嗨,凯文,感谢您的回复。我大致了解了您写的大部分内容,但希望另一位专家验证您的方法是否可行。
    猜你喜欢
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2013-06-06
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2015-09-21
    相关资源
    最近更新 更多