我需要为每个键保存,一些值使用不同的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?
答案 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相比。