gpt4 book ai didi

concurrency - 使用redis捕获计数器的峰值

转载 作者:可可西里 更新时间:2023-11-01 11:24:59 24 4
gpt4 key购买 nike

我有一个处理 session 的分布式系统( session 的定义对于这个问题并不重要,除了要注意它是一个持续时间大于一秒的进程,通常要大得多),我想在哪里识别在给定时间段内并发处理的最大 session 数是多少。

基本设置是一个 Redis 数据库,我在每次 session 开始时递增一个计数器,并在每次 session 结束时递减它。因此,计数器值表示任何给定时间点的当前并发数。

我的问题是如何生成给定时间片内峰值(最大)并发的准确指标(例如,给定日期的最大并发是多少)。

我想听听其他人如何解决这个问题,但我目前的做法是:

session 开始

  • INCR counter-name增加计数器的当前值
  • 递增命令的结果就是计数器的当前值
  • ZADD collector-name NX <counterval> <uniqueid>将当前已知的并发值存储在有序集中。 Flake-id 可用于快速生成 ID,但如果 session 已经具有唯一 ID(通常是这种情况),我们就可以使用它。

session 结束

  • DECR counter-name降低当前并发值

每个报告时间段

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

注意事项:

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

此设置中是否有任何我遗漏的缺陷?

最佳答案

我没有检测到流程中的任何重大缺陷,但可以改进数据结构的选择。

Sorted Sets 在空间和时间方面相对昂贵,并且您的场景没有利用它们的特殊能力(即排序)。更优化的结构是计数器的哈希,或高度压缩的 BITFIELD .

关于concurrency - 使用redis捕获计数器的峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47748475/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com