当前位置:首页 > 问答 > 正文

用Redis怎么统计成功失败率,图表展示效果咋样,能不能更直观点

关于如何使用Redis统计成功率与失败率,并实现图表展示,使其更直观,我们可以分步来谈,这部分内容主要结合了Redis官方文档关于数据结构的说明、一些技术社区(如Stack Overflow、CSDN)上常见的实现方案,以及像Grafana这类可视化工具的应用实践。

用Redis统计成功失败率的方法

Redis本身不是一个专门做复杂统计的数据库,但它速度快、数据结构丰富,非常适合用来做实时计数,统计成功失败率,核心就是计数,这里说几种常见且直接的方法:

  1. 使用字符串(String)或哈希(Hash)简单计数 这是最基础的方法,你有一个发送短信的任务,每次发送尝试后,根据结果是成功还是失败,向Redis发送命令增加对应的计数器。

    用Redis怎么统计成功失败率,图表展示效果咋样,能不能更直观点

    • 命令示例INCR sms:success:20231026HINCRBY sms:stats:20231026 success 1
    • 做法:你可以为每天(如sms:success:20231026)甚至每小时创建一个键,失败的情况也一样(如sms:fail:20231026),要计算当天成功率,只需要用 GET sms:success:20231026 得到成功数,用 GET sms:fail:20231026 得到失败数,然后套用公式:成功率 = 成功数 / (成功数 + 失败数) * 100%
    • 优点:极其简单,一目了然。
    • 缺点:如果维度多了(比如还想按不同业务、不同地区统计),键的数量会爆炸式增长,管理和查询会变得麻烦,计算成功率需要应用程序端进行两次查询和一次计算,不是原子操作,但在大多数场景下够用。
  2. 使用有序集合(Sorted Set)进行分时统计 如果你希望看到成功率随时间变化的趋势,比如每5分钟的成功率是多少,有序集合就非常有用。

    • 做法:用时间戳(例如每分钟或每5分钟的整点时间戳)作为集合成员的分数(score),一个成功事件发生时,执行 ZADD api_requests <当前时间戳> success:<时间戳> 是不对的,更常见的做法是,为每个时间窗口(如每分钟)准备两个有序集合,分别存放成功和失败的计数,但更巧妙的做法是利用有序集合的“分桶”思想。
    • 更实际的例子:更直接的是用方法1的哈希或字符串,但键名包含时间窗口信息,sms:success:202310261230(表示2023年10月26日12点30分这个分钟的成功数),有序集合可以用来存储这些时间窗口本身,方便按时间范围查询,但纯粹用有序集合直接计数比较绕。
    • 参考来源:在Redis Labs(现为Redis Inc.)的博客中,有文章介绍如何使用Redis进行时间序列统计,其核心思想就是将时间戳分区作为键的一部分。
  3. 使用HyperLogLog进行海量数据去重统计 如果你的“成功”或“失败”需要基于独立用户或独立请求ID来统计(即去重计数),比如统计独立用户的登录成功率,HyperLogLog就派上用场了。

    • 做法:为每个时间窗口创建两个HyperLogLog结构,一个记录成功用户ID,一个记录尝试登录的用户ID。
      • PFADD login:attempts:20231026 user_id_123
      • PFADD login:successes:20231026 user_id_123
    • 计算:一天结束时,通过 PFCOUNT login:successes:20231026PFCOUNT login:attempts:20231026 得到去重后的用户数,再计算成功率。
    • 优点:极其节省内存,每个HyperLogLog只需要约12KB内存,就能统计上亿个独立元素。
    • 缺点:存在约0.81%的误差,适合可以接受近似结果的场景。

图表展示效果咋样?

用Redis怎么统计成功失败率,图表展示效果咋样,能不能更直观点

单纯把Redis里的数字读出来,是不够直观的,我们需要借助可视化工具来生成图表,目前最流行的搭配是:Redis + 应用程序(收集和暴露数据) + Prometheus(收集指标) + Grafana(展示图表)

  • Grafana的展示效果:效果可以非常专业和直观。
    • 仪表盘(Dashboard):你可以创建一个仪表盘,里面包含多个图表。
    • 图表类型
      • Stat(统计值):直接显示当前的成功率百分比,用一个很大的数字显示,非常醒目,可以设置颜色阈值,比如高于99.9%显示绿色,低于99%显示红色。
      • Graph(曲线图):这是最常用的,X轴是时间,Y轴是成功率,你可以看到一条曲线随着时间的变化,是平稳还是骤降,一目了然,可以同时绘制成功数和失败数两条曲线,方便对比。
      • Gauge(仪表盘):像一个汽车时速表,指针指向当前的成功率,表盘上标注着健康(绿色)、警告(黄色)、危险(红色)区域,视觉效果很直接。
      • Heatmap(热力图):如果你按一天24小时统计,热力图可以显示哪天的哪个时间段失败率最高,用颜色深浅来表示。

能不能更直观点?

当然可以,除了选择更合适的图表类型,还可以从数据本身和交互性上优化:

用Redis怎么统计成功失败率,图表展示效果咋样,能不能更直观点

  1. 计算并存储最终的成功率:与其让Grafana每次查询时都去计算 成功数/(成功数+失败数),不如在数据写入Redis后,用一个简单的后台脚本或通过应用程序的逻辑,定时(比如每分钟)计算好当前的成功率,并直接写入一个新的键,sms:success_rate:current,这样Grafana直接读取这个百分比数值,响应更快,配置也更简单。

  2. 设置智能告警:直观不只是在“看”,更在于“主动通知”,在Grafana中,可以设置报警规则,当最近5分钟的平均成功率低于99.9%时,自动发送报警信息到钉钉、Slack、短信或邮件,这样你就不需要一直盯着仪表盘,系统会在出现问题时主动告诉你,这才是最高级的“直观”。

  3. 增加对比维度:让图表更有意义,你可以在同一个曲线图上展示:

    • “的成功率曲线。
    • “昨天”的成功率曲线。
    • “上周同一天”的成功率曲线。 通过对比,你能立刻判断出当前的波动是正常现象还是异常情况,Grafana很容易实现这种对比查询。
  4. 使用更直观的布局:在Grafana仪表盘上,把最重要的指标(如当前总成功率)用最大的字体放在左上角,下面放置历史趋势图,再旁边可以放上分业务、分地区的成功率排行,快速定位问题源头。

Redis提供了强大而灵活的计数基础,而像Grafana这样的工具则把冷冰冰的数字变成了直观的、可交互的视觉画面,甚至是可以主动说话的智能助手,从简单的数字到丰富的图表,再到带告警的智能监控看板,这个链条可以让成功失败率的监控变得非常直观有效。