如何限制 Redis 排序集中的项目数

How to limit count of items in Redis sorted sets

在我的例子中,我将大量记录上传到 Redis 排序集,但我只需要存储 10 个得分最高的项目。我无法影响上传的数据(在上传前对其进行排序和限制)。

目前我刚执行

ZREMRANGEBYRANK key 0 -11

上传完成后,但这种方法看起来不是很理想(它很慢,如果 Redis 可以处理会更好)。

那么 Redis 是否提供开箱即用的东西来限制排序集中的项目数?

不,除了 ZREMRANGEBYRANK 之外,redis 不提供任何此类功能。

关于保留 a redis list of constant size 也存在类似的问题,例如仅当使用 LPUSH 从左侧推入元素时才保留 10 个元素。

解决方案在于优化剪枝操作。

截断你的排序集,一次,而不是每次

方法:

  1. 运行 每次使用 1/5 概率的 ZREMRANGEBYRANK,使用随机整数。

  2. 使用 redis 管道或 Lua 脚本来实现这一点,这甚至可以节省几乎每 5 次调用时发生的两次网络调用。

这对于上述目的来说已经足够了。

算法示例:

ZADD key member1 score1
random_int = some random number between 1-5
if random_int == 1:  # trim sorted set with 1/5 chance
   ZREMRANGEBYRANK key 0 -11