Redis - 获取与正则表达式匹配的键的值

时间:2014-07-20 14:18:22

标签: regex redis key-value ttl webdis

我需要为每个键保存,一些值使用不同的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"

但我想获取,而不是

选项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?

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:1)

选项1不是一个选项,正如您已经注意到的那样。

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

这留下了选项2,这是您最好的选择,但由于性能方面的考虑,我建议您使用SCAN代替KEYS。对于每个键名,只需执行GET即可获得其值。

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