如何限制 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/5 概率的 ZREMRANGEBYRANK,使用随机整数。
使用 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
在我的例子中,我将大量记录上传到 Redis 排序集,但我只需要存储 10 个得分最高的项目。我无法影响上传的数据(在上传前对其进行排序和限制)。
目前我刚执行
ZREMRANGEBYRANK key 0 -11
上传完成后,但这种方法看起来不是很理想(它很慢,如果 Redis 可以处理会更好)。
那么 Redis 是否提供开箱即用的东西来限制排序集中的项目数?
不,除了 ZREMRANGEBYRANK 之外,redis 不提供任何此类功能。
关于保留 a redis list of constant size 也存在类似的问题,例如仅当使用 LPUSH 从左侧推入元素时才保留 10 个元素。
解决方案在于优化剪枝操作。
截断你的排序集,一次,而不是每次
方法:
运行 每次使用 1/5 概率的 ZREMRANGEBYRANK,使用随机整数。
使用 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