用Redis怎么统计成功失败率,图表展示效果咋样,能不能更直观点
- 问答
- 2026-01-02 21:31:29
- 3
关于如何使用Redis统计成功率与失败率,并实现图表展示,使其更直观,我们可以分步来谈,这部分内容主要结合了Redis官方文档关于数据结构的说明、一些技术社区(如Stack Overflow、CSDN)上常见的实现方案,以及像Grafana这类可视化工具的应用实践。
用Redis统计成功失败率的方法
Redis本身不是一个专门做复杂统计的数据库,但它速度快、数据结构丰富,非常适合用来做实时计数,统计成功失败率,核心就是计数,这里说几种常见且直接的方法:
-
使用字符串(String)或哈希(Hash)简单计数 这是最基础的方法,你有一个发送短信的任务,每次发送尝试后,根据结果是成功还是失败,向Redis发送命令增加对应的计数器。

- 命令示例:
INCR sms:success:20231026或HINCRBY sms:stats:20231026 success 1。 - 做法:你可以为每天(如
sms:success:20231026)甚至每小时创建一个键,失败的情况也一样(如sms:fail:20231026),要计算当天成功率,只需要用GET sms:success:20231026得到成功数,用GET sms:fail:20231026得到失败数,然后套用公式:成功率 = 成功数 / (成功数 + 失败数) * 100%。 - 优点:极其简单,一目了然。
- 缺点:如果维度多了(比如还想按不同业务、不同地区统计),键的数量会爆炸式增长,管理和查询会变得麻烦,计算成功率需要应用程序端进行两次查询和一次计算,不是原子操作,但在大多数场景下够用。
- 命令示例:
-
使用有序集合(Sorted Set)进行分时统计 如果你希望看到成功率随时间变化的趋势,比如每5分钟的成功率是多少,有序集合就非常有用。
- 做法:用时间戳(例如每分钟或每5分钟的整点时间戳)作为集合成员的分数(score),一个成功事件发生时,执行
ZADD api_requests <当前时间戳> success:<时间戳>是不对的,更常见的做法是,为每个时间窗口(如每分钟)准备两个有序集合,分别存放成功和失败的计数,但更巧妙的做法是利用有序集合的“分桶”思想。 - 更实际的例子:更直接的是用方法1的哈希或字符串,但键名包含时间窗口信息,
sms:success:202310261230(表示2023年10月26日12点30分这个分钟的成功数),有序集合可以用来存储这些时间窗口本身,方便按时间范围查询,但纯粹用有序集合直接计数比较绕。 - 参考来源:在Redis Labs(现为Redis Inc.)的博客中,有文章介绍如何使用Redis进行时间序列统计,其核心思想就是将时间戳分区作为键的一部分。
- 做法:用时间戳(例如每分钟或每5分钟的整点时间戳)作为集合成员的分数(score),一个成功事件发生时,执行
-
使用HyperLogLog进行海量数据去重统计 如果你的“成功”或“失败”需要基于独立用户或独立请求ID来统计(即去重计数),比如统计独立用户的登录成功率,HyperLogLog就派上用场了。
- 做法:为每个时间窗口创建两个HyperLogLog结构,一个记录成功用户ID,一个记录尝试登录的用户ID。
PFADD login:attempts:20231026 user_id_123PFADD login:successes:20231026 user_id_123
- 计算:一天结束时,通过
PFCOUNT login:successes:20231026和PFCOUNT login:attempts:20231026得到去重后的用户数,再计算成功率。 - 优点:极其节省内存,每个HyperLogLog只需要约12KB内存,就能统计上亿个独立元素。
- 缺点:存在约0.81%的误差,适合可以接受近似结果的场景。
- 做法:为每个时间窗口创建两个HyperLogLog结构,一个记录成功用户ID,一个记录尝试登录的用户ID。
图表展示效果咋样?

单纯把Redis里的数字读出来,是不够直观的,我们需要借助可视化工具来生成图表,目前最流行的搭配是:Redis + 应用程序(收集和暴露数据) + Prometheus(收集指标) + Grafana(展示图表)。
- Grafana的展示效果:效果可以非常专业和直观。
- 仪表盘(Dashboard):你可以创建一个仪表盘,里面包含多个图表。
- 图表类型:
- Stat(统计值):直接显示当前的成功率百分比,用一个很大的数字显示,非常醒目,可以设置颜色阈值,比如高于99.9%显示绿色,低于99%显示红色。
- Graph(曲线图):这是最常用的,X轴是时间,Y轴是成功率,你可以看到一条曲线随着时间的变化,是平稳还是骤降,一目了然,可以同时绘制成功数和失败数两条曲线,方便对比。
- Gauge(仪表盘):像一个汽车时速表,指针指向当前的成功率,表盘上标注着健康(绿色)、警告(黄色)、危险(红色)区域,视觉效果很直接。
- Heatmap(热力图):如果你按一天24小时统计,热力图可以显示哪天的哪个时间段失败率最高,用颜色深浅来表示。
能不能更直观点?
当然可以,除了选择更合适的图表类型,还可以从数据本身和交互性上优化:

-
计算并存储最终的成功率:与其让Grafana每次查询时都去计算
成功数/(成功数+失败数),不如在数据写入Redis后,用一个简单的后台脚本或通过应用程序的逻辑,定时(比如每分钟)计算好当前的成功率,并直接写入一个新的键,sms:success_rate:current,这样Grafana直接读取这个百分比数值,响应更快,配置也更简单。 -
设置智能告警:直观不只是在“看”,更在于“主动通知”,在Grafana中,可以设置报警规则,当最近5分钟的平均成功率低于99.9%时,自动发送报警信息到钉钉、Slack、短信或邮件,这样你就不需要一直盯着仪表盘,系统会在出现问题时主动告诉你,这才是最高级的“直观”。
-
增加对比维度:让图表更有意义,你可以在同一个曲线图上展示:
- “的成功率曲线。
- “昨天”的成功率曲线。
- “上周同一天”的成功率曲线。 通过对比,你能立刻判断出当前的波动是正常现象还是异常情况,Grafana很容易实现这种对比查询。
-
使用更直观的布局:在Grafana仪表盘上,把最重要的指标(如当前总成功率)用最大的字体放在左上角,下面放置历史趋势图,再旁边可以放上分业务、分地区的成功率排行,快速定位问题源头。
Redis提供了强大而灵活的计数基础,而像Grafana这样的工具则把冷冰冰的数字变成了直观的、可交互的视觉画面,甚至是可以主动说话的智能助手,从简单的数字到丰富的图表,再到带告警的智能监控看板,这个链条可以让成功失败率的监控变得非常直观有效。
本文由革姣丽于2026-01-02发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/73315.html
