【问题标题】:What's a good technique to store a time-dependent metric in Redis?在 Redis 中存储时间相关指标的好技术是什么?
【发布时间】:2023-11-10 08:26:01
【问题描述】:

我有一些指标(如登录用户数、SQL 查询或其他),我想定期收集一些与时间相关的统计数据。

例如,我想知道在某个特定的年、月、周、日甚至小时内注册了多少用户。

我认为 Redis 可能是一个不错的选择。但我无法想象存储此类统计数据的好策略。我唯一的想法是将独立的计数器存储数天、数周等,然后一次将它们全部颠倒。

你是怎么做到的?我需要一个好技巧。或者 Redis 对我的任务没有任何好处。

【问题讨论】:

    标签: statistics redis metrics


    【解决方案1】:

    如果您只需要对每个周期进行计数,那么您建议的多计数器方法是一种不错的方法。在单个流水线事务中增加 5 个计数器是 O(1),而设置操作是 O(log n + m),n/m 的值可能很大。

    弗兰克建议的设置解决方案确实有它的位置 - 我使用类似的东西我需要知道发生了哪些操作,而不是知道发生了多少。显然,存储每个操作的详细信息比计数器占用更多的内存,但由于现在通常可用的 RAM 量,您可以在这成为问题之前存储数百万条记录。

    【讨论】:

      【解决方案2】:

      我将只使用一个排序集,其中分数是自纪元以来的时间戳(以秒为单位)(unix 时间)。假设您有一组已排序的登录,并且您想查看 2010 年发生了多少登录,只需将 20101231 23:59:59 和 20100101 00:00:00 转换为秒并使用这些是 zcount 的最大和最小参数.

      这里明显的困难是自己处理时间转换,但实际上很容易,因为它是标准的 Unix 格式。您可以将 date 命令与 %S 一起使用(至少在 linux 上)或使用系统调用 time()、localtime() 和 mktime(),以及构建在这些系统调用。

      我确信在 Windows 中有一些等效的范例,但我没有任何经验。

      【讨论】:

      • 我的内存是不是数据太多了?
      • 我不知道您有多少内存或您希望登录的频率。这就是我在 redis 中的一般做法。