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

Gle*_*iko 5 sortedset redis

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

目前我只是执行

ZREMRANGEBYRANK key 0 -11
Run Code Online (Sandbox Code Playgroud)

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

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

Dhr*_*hak 6

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

保持redis 列表的大小不变也存在类似的问题,例如仅当使用 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
Run Code Online (Sandbox Code Playgroud)