【问题标题】:SUM of last 24 hour scores within a specific range in a sorted set (Redis)排序集中特定范围内最近 24 小时得分的总和 (Redis)
【发布时间】:2020-05-10 22:58:36
【问题描述】:

关于 Redis 服务器的性能,有没有办法计算 24 小时内保存的分数的总和? (每天新增约 100 万行)

使用排序集存储用户的时间戳和分数的正确格式是什么?

其实我用的是这个命令:

ZADD allscores 1570658561 20

作为分数,它是以秒为单位的实际时间......其他字段是真实分数。

但是,这里有一个问题!当另一个用户获得相同的分数 (20) 时,它不会被添加,因为它已经存在 - 这个问题的任何解决方案?

我正在考虑使用 LUA 脚本,但有两个令人头疼的问题:

  • LUA 脚本将阻止其他命令工作,直到它完成工作(这对我来说不是一个好习惯,因为脚本必须 24/24 7/7 工作,同时许多用户必须获取数据同时来自 Redis 缓存服务器,如用户分数、历史信息等。) - 另外,LUA 脚本每次都必须处理每天保存在特定键中的许多记录 - 所以,当 Lua 脚本工作时,用户无法获取数据...知道 Lua 脚本将一直循​​环运行。

  • 其次,它与第一个问题有关,如果我在命令中使用时间戳作为分数,则不允许我存储相同的分数,这样我就可以返回 24 小时数据。

如果你是我的情况,你将如何处理?谢谢

【问题讨论】:

    标签: redis redis-cluster


    【解决方案1】:

    考虑到需要过去 24 小时的数据(滑动窗口)并且可能的行数为 100 万。我们不能使用有序集合数据结构来高性能计算总和。

    高性能设计并解决您的重复分数问题:

    您可以通过在窗口中处理数据来获得高性能系统,而不是对准确性做出一点决定。

    示例输入数据: 输入1:用户1要加时间:11:10:01 得分:20 输入2:用户2要加时间:11:11:02 得分:20 输入3:用户1要加时间:11:17:04 得分:50

    您可以有 1 分钟、5 分钟或 1 小时的准确度,并据此决定窗口。


    如果您接受大约 1 小时的数据,则可以在插入时使用此数据, 对于输入 1:

    INCRBY SCORES_11_hour 20

    对于输入 2:

    INCRBY SCORES_11_hour 20

    对于输入 3:

    INCRBY SCORES_11_hour 20

    要获取过去 24 小时的数据,您只需对 24 小时键值求和即可。

    MGET SCORES_previous_day_12_hour SCORES_previous_day_13_hour SCORES_previous_day_14_hour .... SCORES_current_day_10_hour SCORES_current_day_11_hour


    如果您接受 5 分钟的近似值,则可以在插入时进行此操作,同时增加每小时键,您需要存储 5 分钟的窗口数据。

    对于输入 1:

    INCRBY SCORES_11_hour 20

    INCRBY SCORES_11_hour_00_minutes 20

    对于输入 2:

    INCRBY SCORES_11_hour 20

    INCRBY SCORES_11_hour_00_minutes 20

    对于输入 3:

    INCRBY SCORES_11_hour 20

    INCRBY SCORES_11_hour_05_minutes 20

    要获取最近 24 小时的数据,只需将 23 小时键(整小时数据)+ 12 个五分钟窗口键相加即可


    如果添加的时间是基于当前时间,可以进一步优化。 (假设如果是第 11 个小时,第 10、第 9 和之前的数据完全不会改变)。

    正如您所说,它将是 24/7,我们也可以使用之前迭代中的一些计算值。

    假设它是在第 11 小时计算的,那么您将获得过去 24 小时的值。 如果在第 12 小时再次计算,则可以重复使用中间 22 小时数据不变的总和,只从 redis 中获取缺失的 2 小时数据。

    可以根据您的需要应用类似的进一步优化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-01
      • 2018-12-28
      • 2014-07-28
      • 1970-01-01
      • 2016-10-22
      • 2020-06-03
      • 2023-02-17
      • 2021-08-31
      相关资源
      最近更新 更多