5

我的问题是:我有一组值,每个值都必须有一个过期值。代码:

set a:11111:22222 someValue
expire a:11111:22222 604800 \\usually equal a week

在一个完美的世界里,我会把所有这些值放在一个哈希中,并给它们每个适当的过期值,但是 redis 不允许在哈希字段上过期。

问题是我还有一个过程需要大约每小时一次获取所有这些密钥

keys a:*

这个命令真的很昂贵,根据 redis 文档可能会导致性能问题。我在每个给定时刻大约有 25000-30000 个密钥。

有人知道我该如何解决这样的问题吗?竖起大拇指保证(-;
罗伊

4

3 回答 3

11

让我提出一个替代解决方案。

与其要求 Redis 扫描所有密钥,不如执行后台转储,然后解析转储以提取密钥?这样,对 Redis 实例本身的影响为零。

解析转储文件并不像听起来那么可怕,因为您可以使用出色的 redis-rdb-tools 包:

https://github.com/sripathikrishnan/redis-rdb-tools

您可以将转储文件转换为 json 文件,然后解析 json 文件,也可以使用 Python API 自行提取密钥。

于 2013-11-14T15:19:15.067 回答
2

正如您已经提到的,使用keys不是获取密钥的好方法:

警告:将 KEYS 视为仅应极其小心地在生产环境中使用的命令。当它针对大型数据库执行时,它可能会破坏性能。此命令用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用 KEYS。如果您正在寻找一种在键空间子集中查找键的方法,请考虑使用 sets

Source: Redis docs for KEYS

正如文档所建议的那样,您应该建立自己的索引!建立索引的常用方法是使用排序集。你可以在这里阅读更多关于它如何解决我的问题的信息

a:*使用sorted set构建对您的键的引用,也将允许您仅选择与日期或任何其他 int 值相关的所需键,以防您过滤结果!

是的:如果哈希可以过期,那就太棒了。可悲的是,它看起来不会发生,但实际上有创造性的替代方案可以自己照顾它。

于 2013-11-14T13:07:30.893 回答
0

为什么不使用排序集。

这是一些数据创建序列。

redis 127.0.0.1:6379> setex a:11111:22222 604800 someValue
OK
redis 127.0.0.1:6379> zadd user:index 1385112435 a:11111:22222   // 1384507635 + 604800
(integer) 1
redis 127.0.0.1:6379> setex a:11111:22223 604800 someValue2
OK
redis 127.0.0.1:6379> zadd user:index 1385113289 a:11111:22223  // 1384508489 + 604800
(integer) 1
redis 127.0.0.1:6379> zrangebyscore user:index 1385112435 1385113289
1) "a:11111:22222"
2) "a:11111:22223"

这不是选择性能问题。但是,它会花费更多的内存和插入成本。

于 2013-11-15T09:52:02.517 回答