首页/数据/Redis 进阶速查/O(N) 命令雷区清单
性能与排障129 条

O(N) 命令雷区清单

复杂度随数据量线性或更差的命令要主动规避:KEYS、HGETALL、SMEMBERS、LRANGE 大范围、SORT、ZRANGEBYLEX 全量等,量大时都可能阻塞主线程。

Redis 进阶速查数据更新于 2026-10-13

复杂度随数据量增长的命令

有一类命令的复杂度会随数据量线性增长甚至更差,在数据量大时会长时间占用主线程,把整个实例拖慢,影响的不是一次请求而是所有并发请求。典型的有遍历全部键、一次性取出整个集合、读取整个列表、带条件排序,以及参与集合很大的集合运算。判断标准很简单:先知道数据量级,再决定用哪条命令。

基本信息

风险特征复杂度随元素或键数量线性增长甚至更差
影响范围主线程被占用,所有并发请求一起变慢
高发命令全键遍历、整体取出、大范围读取、集合运算
替代思路分批增量遍历,逐段读取
判断前提先确认数据量级再选命令

典型使用场景

  • 线上出现周期性延迟尖峰,排查是否存在全量遍历类命令
  • 代码评审时拦截在生产代码里出现的全量扫描写法
  • 把历史遗留的全量读取改写为分批遍历,降低阻塞风险
  • 为运维脚本设置规范:禁止在未知规模的数据上直接全量取
  • 压测阶段构造接近真实规模的数据,避免小数据集掩盖问题

替代写法

替代写法
# 用分批遍历代替一次性全量获取
redis-cli --scan --pattern 'user:*' | head -20      # 增量遍历示例
redis-cli SCAN 0 COUNT 100                           # 单次游标遍历
redis-cli HSCAN myhash 0 COUNT 50                    # 分区段读取大哈希
redis-cli SORT mylist BY weight_* LIMIT 0 20         # 排序加范围限制
redis-cli SLOWLOG GET 10                             # 回看慢命令记录

常见命令与替代

命令类型风险点替代方式
全键遍历扫描整个键空间改为增量遍历并按批次处理
整体取出集合一次返回全部元素分批读取并限制单次数量
大范围列表读取一次拉取整条列表按区间分段读取
排序类操作数据量大时开销成倍上升加上范围限制或改由离线计算
集合运算参与集越大耗时越长预先裁剪数据量或改为异步计算
先知道量级再决定命令:小集合上这些命令完全可以放心使用,大集合上同样的写法就变成了事故隐患。
用增量遍历替代全量扫描时要注意它只是弱一致的遍历方式,遍历过程中新增或删除的键可能不被包含,业务逻辑要能接受这一点。

易错点

  • 在规模未知的键空间上直接执行全量遍历,延迟尖峰由此产生且难以复现
  • 把增量遍历当成强一致遍历使用,漏掉遍历期间新增的键导致业务结果偏差
  • 只在测试环境用小数据集验证,上线后数据量放大若干倍才暴露问题
  • 不开启慢命令记录,事后无法回溯是哪些命令造成阻塞

数据来源与参考

  • Redis 官方文档:命令复杂度与延迟
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌