首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用redis捕获计数器的峰值

使用redis捕获计数器的峰值
EN

Stack Overflow用户
提问于 2017-12-11 07:52:49
回答 1查看 107关注 0票数 0

我有一个处理会话的分布式系统(会话的定义对于这个问题并不重要,只是注意到它的持续时间大于一秒钟,通常要大得多),其中我想确定在给定时间内并发处理的会话数量最多的是什么。

基本设置是Redis数据库,在该数据库中,我为每个会话开始增加一个计数器,并在每个会话结束时减少计数器。因此,计数器值表示任何给定时间点上的当前并发性。

我的问题是如何在给定的时间片上生成峰值( max )并发的精确度量(例如,给定一天中的最大并发性是什么)。

我想听听其他人如何解决这个问题,但我现时的做法如下:

会话启动

  • INCR counter-name以增加计数器的当前值
  • 增量命令的结果是计数器的当前值。
  • ZADD collector-name NX <counterval> <uniqueid>将当前已知的并发值存储在有序集中。Flake-id可以用于快速的id代,但是如果会话已经有一个唯一的ID --这通常是这样的--我们就可以使用它。

会话结束

  • 减少当前并发值的DECR counter-name

每一报告期间

  • RENAME collector-name tempkey以获取状态快照,并允许工作人员启动新的收集器。
  • 运行ZREVRANGEBYSCORE tempkey +inf -inf WITHSCORES LIMIT 0 1,返回自上次检查以来计数器的峰值(以及导致峰值的会话的唯一id (如果相关的话)。
  • DEL tempkey,因为我们不再需要它了。

备注:

  • 最后的最大值计算是从计数器离线进行的,它也只有O(log(n))。
  • 数据输入也是O(log(n)),这在高负载下可能是一个问题,但是这里的n是当前期间的条目数,所以我们可以增加报告频率来提高性能(好的副作用--让我们通过生成更多的数据来提高性能!)

在这个设置中有我错过的缺陷吗?

EN

回答 1

Stack Overflow用户

发布于 2017-12-11 14:20:58

我没有发现流程中的任何主要缺陷,但是数据结构的选择可以得到改进。

排序集在空间和时间方面比较昂贵,而且您的场景没有利用它们的特殊能力(即排序)。更优化的结构将是计数器的散列,或高度压缩的BITFIELD

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47748475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档