【发布时间】:2018-04-11 19:19:06
【问题描述】:
在我的例子中,我将很多记录上传到 Redis 排序集,但我只需要存储 10 个得分最高的项目。我没有能力影响上传的数据(在上传之前对其进行排序和限制)。
目前我只是执行
ZREMRANGEBYRANK key 0 -11
上传完成后,但这种方法看起来不是很理想(它很慢,如果 Redis 能处理它会更好)。
那么 Redis 是否提供了一些开箱即用的东西来限制排序集中的项目数?
【问题讨论】:
在我的例子中,我将很多记录上传到 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
【讨论】: