【问题标题】:How to limit count of items in Redis sorted sets如何限制 Redis 排序集中的项目数
【发布时间】:2018-04-11 19:19:06
【问题描述】:

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

目前我只是执行

ZREMRANGEBYRANK key 0 -11

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

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

【问题讨论】:

    标签: redis sortedset


    【解决方案1】:

    不,除了 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
    

    【讨论】:

    • 我建议在 Redis 服务器端 Lua 脚本中实现上述内容 - 原子性、速度更快且不依赖于应用程序的语言。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2011-08-29
    • 2015-12-27
    • 2021-09-19
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多