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