HOTKEYS 是 Redis-Faina 提供的实时热点 Key 统计命令,需加载模块后执行,如 HOTKEYS 10 返回最近60秒内访问频次最高的10个Key,含次数、命令类型及平均耗时。

用 HOTKEYS 命令直接看前 N 个最热的 Key
Redis-Faina 是目前最轻量、最贴近生产环境的热点 Key 统计工具,它不依赖应用埋点,而是通过解析 Redis 的慢日志(SLOWLOG)或命令流来统计访问频次。你不需要改代码,只要服务端启用了慢日志(默认开),就能用 HOTKEYS 看实时热点。
-
HOTKEYS不是 Redis 原生命令,需先加载 Redis-Faina 模块(redis-server --loadmodule redis-faina.so) - 执行
HOTKEYS 10就能返回当前访问频次最高的 10 个 Key,结果含访问次数、命令类型(如GET/HGET)、平均耗时 - 注意:该命令只反映「最近采集窗口内」的热度,不是全量历史累计;默认窗口为 60 秒,不可配置,别误以为是“永久排名”
- 如果返回为空,先确认
SLOWLOG LEN是否 > 0,再检查SLOWLOG GET是否真有对 Key 的操作记录——有些客户端会禁用慢日志,或slowlog-log-slower-than设得过高(比如 10000 微秒),漏掉高频但单次很快的操作
用 HOTKEYSINFO 查单个 Key 的详细访问行为
当你从 HOTKEYS 列表里挑出一个疑似热点(比如 user:10086:profile),下一步不是立刻加缓存或拆分,而是确认它「为什么热」:是读多?写多?还是某类命令集中爆发?
-
HOTKEYSINFO user:10086:profile会返回该 Key 被哪些命令访问、各多少次、最近一次时间戳,甚至命令参数长度(可辅助判断是否被恶意扫描) - 常见陷阱:看到
GET高频就以为是读热点,但实际可能是上游服务在轮询这个 Key 做状态同步(比如健康检查),这种场景靠加本地缓存没用,得改调用逻辑 - 该命令返回的「最后访问时间」是毫秒级 Unix 时间戳,不是可读字符串,别拿它直接比对业务日志里的
2026-03-12T14:22:01格式
用 HOTKEYSRESET 清空统计,避免旧数据干扰新观察
上线灰度、压测复盘、或怀疑统计偏差时,必须重置计数器。否则你看到的“热点”,可能全是昨天大促留下的残影。
-
HOTKEYSRESET是原子操作,执行后所有 Key 的访问计数归零,但不会清 Redis 数据本身 - 不要在高峰期执行——虽然它不阻塞主线程,但会触发一次内部哈希表遍历,对超大实例(百万级 Key)可能引起短暂延迟毛刺
- 重置后至少等 30 秒再跑
HOTKEYS,否则采集样本不足,结果失真 - 没有「按前缀重置」功能,所以如果你只想看
order:开头的 Key,得自己用KEYS order:* | xargs redis-cli HOTKEYSINFO批量查(慎用KEYS,线上建议换SCAN)
不用 Redis-Faina 时,怎么临时估算某个 Key 的热度?
有些环境不允许加载第三方模块(比如云 Redis 服务限制 --loadmodule),这时就得靠组合命令 + 应用层配合。
- 最简单办法:在应用里对目标 Key 的每次访问都调用
INCR hotkey:counter:user:10086:profile,再用GET hotkey:counter:user:10086:profile查数——但要注意并发写冲突,INCR是原子的,没问题 - 更准一点:用
ZADD hotkey:zset:user:10086:profile <timestamp> <request_id>记录时间戳,再用ZCOUNT统计过去 60 秒内数量,模拟滑动窗口 - 致命误区:别用
KEYS *+OBJECT FREQ查热度——OBJECT FREQ返回的是 LRU 近似频率,不是访问频次,且只对启用了maxmemory-policy allkeys-lru的实例有效,和热点 Key 完全不是一回事
真实线上环境里,HOTKEYS 的输出常被当成“判决书”直接用于扩副本或加代理,但它的采样机制决定了它只能告诉你「谁正在热」,没法回答「为什么热」「热得合不合理」。真正要定位根因,还得把 HOTKEYSINFO 结果和应用链路追踪(比如 SkyWalking 的 Span 日志)对齐着看。










