【发布时间】:2023-03-04 21:23:01
【问题描述】:
我的问题是:我有一组值,每个值都必须有一个过期值。 代码:
set a:11111:22222 someValue
expire a:11111:22222 604800 \\usually equal a week
在一个完美的世界中,我会将所有这些值放在一个哈希中,并为每个值分配适当的过期值,但 redis 不允许在哈希字段上过期。
问题是我还有一个流程需要大约每小时一次获取所有这些密钥
keys a:*
这个命令真的很昂贵,根据 redis 文档可能会导致性能问题。我在每个给定时刻大约有 25000-30000 个密钥。
有人知道我该如何解决这样的问题吗?
竖起大拇指保证(-;
罗伊
【问题讨论】:
-
为什么需要获取所有密钥?与上次运行相比,仅获取更改的密钥会更好吗?例如,您可以使用发布/订阅通知松散耦合的更改。或者在列表中附加键以检查下一次运行。
-
我需要处理所有的键,更重要的是之前运行时添加的键。但是我喜欢你附加键的想法......但我仍然需要遍历附加列表并获取每个键(因为它的价值)。我可以猜到它有一半以上的键,所以使用我以前的方法不是更好吗?
-
查看@RienNeVaPlus 答案:您可以使用 zset 来存储所有密钥。将所有键存储在 zset 中将比 a:* 更快,但它仍会在 redis 中占用一些空间。然后你得到你的 zset 并遍历每个值来得到你的哈希值。例如,使用到期作为 zset 的分数,然后您可以将每个键的到期时间与实际时间进行比较,如果到期时间在实际时间之后,则手动删除哈希值。最好的方法是在 LUA 中实现它。
-
这里是您问题的答案,请查看:stackoverflow.com/questions/13174615/…
标签: redis