Redis怎么排查出现大Key导致整个Redis单线程事件循环严重卡顿

星枫小哥_5741

星枫小哥_5741

2026-11-04

942人浏览

原创

redis-cli --bigkeys仅用于快速摸底,输出每种类型“逻辑最大”的Key(如元素数或字符串长度),不反映真实内存占用,易漏判异常大Key,需配合MEMORY USAGE精准验证。

redis怎么排查出现大key导致整个redis单线程事件循环严重卡顿

redis-cli --bigkeys 只能摸底,不能当结论用

它抽样扫描,输出的是每种类型里“看起来最大”的那个 key,比如 HGETALL 耗时最长的 hash、LRANGE 元素最多的 list。但真实拖垮 Redis 的大 key,可能藏在没被抽到的 95% 里——尤其当你的 key pattern 偏离常规(比如 taotoken:log:20261001:uid_* 这类带日期和 UID 的),抽样容易漏掉单日爆涨的异常 key。

执行时必须加 -i 参数控速,否则高频 TYPE + STRLEN/LLEN 会把 CPU 打满。建议从 -i 0.1 起手,观察 slowlog 是否新增 SCAN 相关条目;若仍有抖动,调高到 -i 0.5。

  • 别在高峰期跑,哪怕加了 -i,它仍会持续发命令,影响 P99 延迟
  • 结果里只显示“最大”,不显示“第几大”。一个 cart:user:10086 占 80MB,另一个同类型只占 12MB,后者不会出现在报告里,但它照样能卡住主线程
  • 集群模式下,--bigkeys 默认只扫当前连接的节点,得手动轮询所有 master 节点

用 SCAN + MEMORY USAGE 精准定位单个可疑 key

当你已经从 slowlog 里看到大量 HGETALL、SMEMBERS、LRANGE 耗时 >100ms,说明问题 key 已经暴露在命令层。这时候该用游标扫描,逐个测内存占用:

redis-cli -h 127.0.0.1 -p 6379 -a your_pass --scan --pattern "taotoken:*" | head -n 1000 | xargs -I {} sh -c 'echo {}; redis-cli -h 127.0.0.1 -p 6379 -a your_pass memory usage {} 2>/dev/null || echo "ERR"' | awk 'NF==2 && $2 > 1048576 {print $0}'

这段命令干三件事:按前缀扫 key、对每个 key 调 MEMORY USAGE、筛出超 1MB 的。注意:MEMORY USAGE 是 O(1) 的,不阻塞,但频繁调用仍需控制节奏——上面用 head -n 1000 限流,实际可配合 sleep 0.01 插入延时。

Sentinal Redis
Sentinal Redis

监控Redis服务器健康状况、内存、性能及BullMQ队列。检查队列深度、失败任务,分析慢查询并诊断问题。

下载
  • MEMORY USAGE 返回的是近似值,包含 key 名、value、内部结构开销,比 STRLEN 或 LLEN 更真实反映内存压力
  • 如果返回 (error) ERR unknown command `memory`,说明 Redis 版本 DEBUG OBJECT(不推荐,生产禁用)或改用 redis-rdb-tools 离线分析 RDB 文件
  • 别直接用 KEYS,它会阻塞整个实例,SCAN 是唯一安全的选择

slowlog 查看卡顿源头,反向锁定 key 名

Redis 卡顿时,真正要盯的是 slowlog,不是监控图上的平均 CPU。一条 HGETALL cart:user:10086 耗时 680ms,就能让后面 2000+ 请求排队。先确认 slowlog 阈值是否合理:

redis-cli config get slowlog-log-slower-than —— 如果是 10000(即 10s),那 200ms 的卡顿根本不会记录。建议设为 100000(100ms),再查最近 20 条:redis-cli slowlog get 20

  • 重点关注耗时列(第三字段)>100000(单位微秒)、命令列含 HGETALL/SMEMBERS/DEL 的条目
  • 第二字段是时间戳,结合业务日志里的报错时间,能快速圈定是哪个 key 在作祟
  • 如果 slowlog 为空,但延迟明显,说明卡顿来自大 key 的过期删除(惰性+定期删除机制触发),此时要查 INFO stats 里的 expired_keys 和 evicted_keys 是否突增

集群环境下大 key 导致数据倾斜,光删没用

发现 taotoken:session:shard_7:* 下某个 key 占了 32MB,删掉它确实能缓解,但下次还可能在同一个 slot 里长出来。因为 Redis Cluster 按 key 的 CRC16 值分片,taotoken:session:shard_7:user_123 和 taotoken:session:shard_7:user_456 必然落在同一节点——这是设计使然,不是 bug。

真正要做的不是“删”,而是“拆”:把单个大 hash 拆成多个小 hash,比如按用户行为类型分:taotoken:session:shard_7:user_123:click、taotoken:session:shard_7:user_123:search。这样既分散了单 key 容量,又避免了单 slot 内存打满后扩容无效的问题。

  • 拆分逻辑必须双写过渡:新逻辑写多 key,旧逻辑仍读原大 key,等存量数据自然过期后再下线旧路径
  • 不要用 RENAME 或 MOVE 搬大 key,它们都是原子操作,一样会阻塞
  • 如果已出现主从延迟飙升,优先停写,用 CLIENT LIST 查看 qbuf(查询缓冲区)是否堆积,确认是否是大 key 同步拖慢了 replica

大 key 的危害从来不在“有多大”,而在“什么时候被碰”。一次 HGETALL、一次 DEL、一次过期清理,都可能成为压垮 Redis 的最后一根稻草。排查时盯着 slowlog 和 MEMORY USAGE,治理时重心放在拆分而非删除,这才是线上系统能扛住流量变化的关键。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

2023.08.10

4598

6

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4789

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

4355

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

8332

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

663

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

776

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

8522

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1180

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1316

6

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习