Redis如何优雅地记录缓存命中率报表

冬静大大_6077

冬静大大_6077

2026-03-29

444人浏览

原创

应直接用keyspace_hits和keyspace_misses计算实时命中率,因info中的hit_rate仅为临时近似值且不更新,无法反映动态变化。

redis如何优雅地记录缓存命中率报表

怎么用 Redis INFO 命令实时抓取命中率数据

Redis 本身不提供「按时间窗口聚合」的命中率报表,但 INFO stats 里有现成的累计计数:keyspace_hits 和 keyspace_misses。直接除一下就能算出当前总命中率,但要注意——这是自启动以来的累加值,不是最近 1 分钟或 5 分钟的动态指标。

实操建议:

  • 用 redis-cli INFO stats | grep -E "(keyspace_hits|keyspace_misses)" 快速验证数据是否在增长
  • 如果服务重启频繁,累加值意义不大,得配合外部时序存储(比如 Prometheus)做差值计算
  • keyspace_hits 只统计 GET/EXISTS 等明确查 key 的命令,HGETALL、LRANGE 这类不触发 keyspace hit,别误当成「全量读命中」
  • 某些 Redis 代理(如 Twemproxy)或客户端重试逻辑会重复发请求,导致 keyspace_hits 虚高,需结合客户端日志交叉比对

为什么不能只看 info 中的 hit_rate 字段

INFO stats 输出里确实有个 hit_rate 行,但它只是个近似值:Redis 内部用整型计数器做除法后截断为小数点后 2 位再拼字符串,**不参与后续计算,也不更新频率可控**。更关键的是,它只在每次执行 INFO 时临时计算一次,不会缓存或采样。

常见错误现象:

  • 写监控脚本时直接解析 hit_rate: 0.92,结果发现数值长时间不动,其实是计数器还没变,不是真的稳住
  • 用这个字段做告警阈值(比如 hit_rate ),可能漏掉短时抖动——因为抖动还没拉低到累加平均值的水平
  • 集群模式下,每个节点的 hit_rate 独立计算,简单求平均会掩盖热点分片问题

如何用 MONITOR + Lua 实现带标签的细粒度统计

如果需要区分「用户登录 token 查询」和「商品详情查询」的命中率,靠 INFO 不够。得在业务层埋点,或者用 Redis 的 MONITOR 捕获命令流——但 MONITOR 开销大、不可长期开启;更稳妥的是让客户端在关键读操作前后打标,再用 Lua 脚本原子更新两个计数器。

示例场景:记录「用户中心」相关 key 的命中情况

-- 在 GET 前调用一次(无论是否存在)
EVAL "redis.call('INCR', 'user:hit:total'); if redis.call('EXISTS', KEYS[1]) == 1 then redis.call('INCR', 'user:hit:success') end" 1 user:123
-- 后续用 INCRBY 把 success/total 推到 Redis TimeSeries 或外部 DB

注意点:

  • Lua 脚本里不能用 GET 后判断再 INCR,否则存在竞态——要用 EXISTS 原子判断
  • 高频 key 上频繁执行 EVAL 会影响吞吐,建议只对核心业务路径启用,非核心走采样(比如每 10 次请求统计 1 次)
  • 脚本中硬编码 key 前缀(如 user:hit:*)不如用客户端传参,但参数过多易触发 Redis 集群 hash slot 冲突,得提前规划好 tag 维度

Prometheus + redis_exporter 的配置要点

生产环境推荐用 redis_exporter 拉取指标,再由 Prometheus 计算滚动命中率。它的默认采集项就包含 redis_keyspace_hits_total 和 redis_keyspace_misses_total,但要注意几个容易被忽略的配置项:

  • 必须设 --redis.addr 为单个实例地址,集群模式要开 --redis.is-cluster,否则只拉到第一个节点数据
  • redis_exporter 默认每 10 秒采一次,如果想算 1 分钟命中率,PromQL 得写 rate(redis_keyspace_hits_total[1m]) / (rate(redis_keyspace_hits_total[1m]) + rate(redis_keyspace_misses_total[1m])),不能直接用 increase()
  • 某些旧版 exporter(v1.3 之前)不暴露 keyspace_* 指标,需确认日志里有没有 INFO stats 解析失败提示
  • 如果 Redis 启用了 ACL,exporter 用户至少要有 INFO 权限,否则指标全为 0,且无报错日志

最麻烦的其实是维度对齐:客户端以为「缓存未命中 = 查 DB」,但 Redis 层看到的 keyspace_misses 还包括 del 后立刻 get、过期 key 被清理等场景,得在应用层补日志才能归因。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

2023.09.14

13966

6

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.14

1665

5

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

2023.12.21

3837

3

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

2024.03.01

6001

5

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1758

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2744

5

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6104

49

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

2023.11.24

5769

6

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

2024.03.22

7414

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.9万人学习