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

时间:2019-02-21 02:54:35

标签: caching redis jedis

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

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

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

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

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

我应该使用哪种设计:

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

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

1 个答案:

答案 0 :(得分:3)

使用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