2. 热点Key的发现与监控:使用Redis-cli的hotkeys参数、使用monitor命令、使用第三方工具(如RedisLive、CacheCloud)
热点Key是Redis性能劣化的主要诱因之一。当某个Key的访问量远超其他Key时,单节点CPU、带宽、内存会迅速达到瓶颈,进而拖垮整个集群。因此,快速、准确地发现热点Key是削峰调优的第一步。本章系统梳理三种主流发现手段:redis-cli --hotkeys、MONITOR命令以及第三方可视化工具(RedisLive、CacheCloud),并给出选型建议。
2.1 使用redis-cli的--hotkeys参数
Redis 4.0+ 内置了热点Key扫描功能,通过 redis-cli --hotkeys 即可触发。该命令基于 OBJECT freq 机制(LFU策略),遍历所有Key并输出访问频率排名靠前的热点。
2.1.1 基本用法
# 连接本地Redis实例,扫描热点Key
redis-cli --hotkeys
# 指定远程实例
redis-cli -h 192.168.1.100 -p 6379 -a yourpassword --hotkeys
2.1.2 输出示例
# Scanning the entire keyspace to find hot keys as well as
# average sizes per key type. You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).
[00.00%] Key: user:1001 (type: string) (freq: 1200)
[00.00%] Key: session:abc (type: string) (freq: 980)
[00.00%] Key: product:888 (type: hash) (freq: 750)
...
-------- summary -------
Sampled 100000 keys in the keyspace!
Hot keys found: 3
Top 1: user:1001 (freq: 1200)
Top 2: session:abc (freq: 980)
Top 3: product:888 (freq: 750)
2.1.3 优缺点对比
| 维度 | 说明 |
|---|---|
| 优点 | 无需额外工具,内置命令,操作简单;对线上影响较小(基于SCAN渐进式扫描) |
| 缺点 | 仅支持Redis 4.0+;扫描大库时耗时较长;无法实时持续监控;只输出频率,不输出带宽/流量维度 |
| 适用场景 | 临时排查、应急定位、小规模集群 |
最佳实践:在低峰期执行
--hotkeys,并配合 -i 0.1 参数增加扫描间隔,避免对业务造成冲击。
2.2 使用MONITOR命令
MONITOR 是Redis的实时调试命令,可以打印出服务器处理的所有命令请求。通过分析MONITOR输出,可以精确统计每个Key的访问频次、命令类型、客户端来源。
2.2.1 基本用法
# 开启MONITOR(慎用于生产环境)
redis-cli MONITOR
# 输出示例
1629876543.456789 [0 127.0.0.1:6379] "GET" "user:1001"
1629876543.456790 [0 127.0.0.1:6379] "SET" "session:abc" "token_xyz"
1629876543.456791 [0 127.0.0.1:6379] "GET" "user:1001"
2.2.2 生产环境风险
⚠️ 高危操作:MONITOR会大幅降低Redis吞吐量(实测QPS下降50%~70%),严禁在高峰期直接开启。建议使用
redis-cli -n 0 MONITOR | head -n 10000 短时间采样,或通过 redis-cli MONITOR > /tmp/monitor.log & 后台记录后离线分析。
2.2.3 离线分析脚本(Python示例)
import re
from collections import Counter
log_file = "/tmp/monitor.log"
key_counter = Counter()
with open(log_file, "r") as f:
for line in f:
# 匹配 "GET" "key_name" 或 "SET" "key_name"
match = re.search(r'"(GET|SET|DEL|HSET|HGET)"\s+"([^"]+)"', line)
if match:
key = match.group(2)
key_counter[key] += 1
# 输出Top 10热点Key
for key, count in key_counter.most_common(10):
print(f"{key}: {count}")
2.2.4 优缺点对比
| 维度 | 说明 |
|---|---|
| 优点 | 精确到每个命令、每个Key;可统计命令类型分布;支持任意Redis版本 |
| 缺点 | 严重降低性能;输出数据量大,需二次解析;无法自动告警 |
| 适用场景 | 短期采样、问题复现、测试环境 |
2.3 使用第三方工具:RedisLive与CacheCloud
对于生产环境,推荐使用专业的可视化监控工具,实现实时采集、历史趋势、自动告警。以下重点介绍RedisLive和CacheCloud。
2.3.1 RedisLive
RedisLive是一个轻量级的开源Redis监控工具,基于Python开发,通过定期执行 INFO、MONITOR(可选)采集数据,并提供Web仪表盘。
- 部署方式:
pip install redis-live+ 配置文件redis-live.conf - 核心功能: 实时QPS、内存、连接数、命中率;热点Key排行榜(需开启MONITOR采集)
- 优点: 部署简单,资源占用低,适合中小规模
- 缺点: 功能相对基础,不支持集群管理,无告警机制
2.3.2 CacheCloud
CacheCloud是搜狐开源的企业级Redis云管理平台,提供自动化部署、监控、运维、分析一体化能力。
- 核心功能: 实时热点Key发现、慢查询分析、大Key扫描、命令审计、自动故障转移
- 热点发现原理: 通过代理层(Twemproxy/Codis)或Redis节点采集命令统计,聚合后展示Top N热点
- 优点: 功能全面,支持集群/哨兵模式,内置告警规则,适合大规模生产
- 缺点: 部署较重,依赖Java/MySQL环境,学习成本较高
2.3.3 工具选型对比
| 工具 | 部署难度 | 实时性 | 热点Key发现 | 告警 | 适用规模 |
|---|---|---|---|---|---|
| redis-cli --hotkeys | ★☆☆ | 低(手动触发) | 支持 | 无 | 单机/小集群 |
| MONITOR | ★☆☆ | 高(实时) | 需二次开发 | 无 | 临时采样 |
| RedisLive | ★★☆ | 中(秒级) | 支持(需配置) | 无 | 中小规模 |
| CacheCloud | ★★★ | 高(秒级) | 支持(自动) | 支持 | 大规模生产 |
2.4 热点Key发现流程总览
下图展示了从问题触发到定位热点Key的完整技术路径,以及各工具的适用阶段。
2.5 选型建议与避坑指南
生产环境推荐组合:
- 日常监控: 部署CacheCloud(或RedisLive),开启自动热点Key采集,设置告警阈值(如单个Key QPS > 5000)
- 应急定位: 使用
redis-cli --hotkeys快速扫描,确认热点Key - 深度分析: 在低峰期短时间开启MONITOR(不超过30秒),结合脚本分析命令分布
避坑要点:
- 不要在生产高峰期直接使用MONITOR,建议使用
redis-cli --intrinsic-latency先评估延迟影响 --hotkeys依赖LFU策略,需确认maxmemory-policy已设置为allkeys-lfu或volatile-lfu- 第三方工具采集频率不宜过高(建议5~10秒/次),避免对Redis节点造成额外压力
- 热点Key发现只是第一步,必须配套削峰策略(本地缓存、限流、Key拆分)才能解决问题