【问题标题】:Redis - get values of keys that match a regexRedis - 获取与正则表达式匹配的键值
【发布时间】:2014-07-20 14:18:22
【问题描述】:

我需要为每个键保存一些具有不同 TTL 的值。

例如 - 对于 XXXX,值 - val1(到期时间:10),val2(到期时间:20)

选项 1: 我的最佳做法可能是: 使用每个成员到期的哈希/集合。

很遗憾,Redis 的 containers(列表、哈希、集合和排序集合)不支持每个成员的到期,尽管过去曾多次请求此功能。

选项 2: 所以我不得不这样做:

SETEX XXXX:0 10 val1

SETEX XXXX:1 20 val2

现在,我想获取所有尚未过期的值,它们的键以 XXXX 开头。

所以我尝试了这个:

127.0.0.1:6379> keys XXXX:*
1) "XXXX:0"
2) "XXXX:1"

但我想得到 values,而不是 keys

选项3:我该怎么做而不是将值放入键中:

SETEX XXXX:val1 10 val1
SETEX XXXX:val2 20 val2

127.0.0.1:6379> keys XXXX:*
1) "XXXX:val1"
2) "XXXX:val2"

这将是我最后的选择。我将不得不在: 之后使用字符串...

知道如何使用更好的方法来实现选项 1(替代),或者至少是选项 2?

【问题讨论】:

  • 限制是这需要在单个命令中完成?
  • 是的。我有很多键,所以我不想通过每个键获取它们的值。可能是性能问题。
  • 一定有办法做到这一点。

标签: regex redis key-value ttl webdis


【解决方案1】:

要使用一个命令来实现这一点,您可能需要自己处理密钥的到期问题。

假设 XXXX 是一个元素列表,如果这会将键保存在一个排序集中并带有一个 expire-at 时间戳作为成员的分数。

ZADD XXXX [current-timestamp + 10] val1
ZADD XXXX [current-timestamp + 20] val2

然后像这样获取它们:

ZREVRANGEBYSCORE XXXX +inf [current-timestamp]

但是您希望定期删除过期元素:

ZREMRANGEBYSCORE XXXX -inf [current-timestamp]

【讨论】:

  • 谢谢。我以前看到过这个选项,但我真的更喜欢让 REDIS 为我做这件事。希望能找到另一个选择...
【解决方案2】:

正如您自己指出的那样,选项 1 不是一个选项。

选项 3 非常浪费 - 您将每个值保存两次,一次作为值,一次保存在键名中。

剩下选项 2,这是您最好的选择,尽管出于性能考虑,我建议使用 SCAN 而不是 KEYS。对于每个键名,只需执行GET 即可获取其值。

或者(即选项 4)您可以使用您的键名构建一个列表/集,并使用 SORT...GET 来检索值。这将让您仅获得值,但我个人认为与#2相比,这种方法实施起来更复杂(您需要定期从列表/集中删除过期键并先验地构造它)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多