应按命令复杂度分层设置slowlog-log-slower-than阈值:o(n)类设1000–2000微秒,o(n log n)类设3000–5000微秒,lua脚本建议≥2000微秒,并需config rewrite持久化及调大slowlog-max-len。

要精准捕获毫秒级执行慢的非标指令(比如 HGETALL、SMEMBERS、SORT、自定义 Lua 脚本等),关键不是把 slowlog-log-slower-than 设得“越小越好”,而是结合业务响应预期、命令复杂度特征和可观测性目标,做有区分度的阈值配置。
明确毫秒级阈值的业务含义
Redis 命令执行时间单位是微秒,1 毫秒 = 1000 微秒。所谓“毫秒级慢”,通常指:
-
1ms(1000 微秒):适合对延迟极度敏感的场景(如实时推荐、风控决策),可暴露
LRANGE large_list 0 999或小集合的SMEMBERS等隐式 O(N) 操作; -
2–5ms(2000–5000 微秒):平衡实用性与噪音比,能覆盖多数非标命令在中等数据量下的真实瓶颈(例如
SORT mylist BY weight_* LIMIT 0 10在千级元素时约 3ms); - 低于 1000 微秒(如 100)虽技术可行,但会记录大量正常原子操作(如
INCR、GET在高负载下偶尔抖动),日志噪音大、存储开销高,且难以聚焦真问题。
区分非标指令的复杂度特征来设阈值
非标指令往往具备高时间复杂度或不可控数据规模,不能用统一阈值“一刀切”。建议按类别分层管理:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
-
O(N) 类(
KEYS、SMEMBERS、HGETALL、LRANGE):设为 1000–2000 微秒。即使 N=100,某些实现路径也可能超 1ms; -
O(N log N) 类(
SORT、含ALPHA的SORT):设为 3000–5000 微秒,预留排序开销空间; -
Lua 脚本:脚本整体计时,哪怕只调用几个
GET,若含循环或条件分支也易超时,建议 2000 微秒起步,并配合redis.call()内部耗时分析; - 避免设为 0:记录所有命令会显著增加内存压力(尤其高 QPS 实例),且掩盖真正异常模式。
动态配置 + 持久化落地的实操要点
生产环境不推荐仅靠临时 config set,需确保重启后策略仍生效:
- 先用
CONFIG SET slowlog-log-slower-than 2000立即生效(例如捕获 ≥2ms 的非标操作); - 再执行
CONFIG REWRITE将变更写入redis.conf(要求 Redis 有写配置文件权限); - 验证是否生效:
CONFIG GET slowlog-log-slower-than返回"slowlog-log-slower-than" "2000"; - 同步调大
slowlog-max-len(如设为512),避免高频慢查询被快速覆盖。
配合 slowlog get 定向分析非标指令
查日志时注意结构解读,重点识别“非标”信号:
- ID 和时间戳确认发生频次与时段;
- duration 字段直接对应微秒值,对比你设定的阈值(如 2000)判断是否真超标;
-
argv 数组显示完整命令+参数,例如:
["sort", "user_scores", "by", "score_*", "limit", "0", "50"]—— 这就是典型的非标高危指令; - 若发现
eval或evalsha占比高,说明 Lua 是瓶颈源,需进一步审查脚本逻辑。










