如何使用 UUID 为会话管理配置 Redis 缓存

Tim*_*sen 1 caching redis jedis

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

  • 与会话 ID 对应的 UUID
  • 用户 ID 值
  • 最后访问时间
  • 也许还有其他一些小领域

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

Jedis#hset(byte[] key, byte[] field, byte[] value)
Run Code Online (Sandbox Code Playgroud)

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

我应该使用什么设计:

  • 有效地将每个用户的 UUID 存储在哈希中
  • 还可以利用 Redis 的过期功能

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

Kev*_*nry 5

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

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

我相信这符合您的要求。

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

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

HMSET session:123 userId 5 last_login 2019-02-13 ...
EXPIRE session:123 2592000
Run Code Online (Sandbox Code Playgroud)

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

HGET session:123 last_login
Run Code Online (Sandbox Code Playgroud)

或设置它:

HSET session:123 last_login 2019-02-18
Run Code Online (Sandbox Code Playgroud)