适用范围与验证状态
本手册用于 Redis 7.x/8.x 常见内存压力、OOM 写入错误与响应延迟的证据化诊断,状态为待验证(PENDING)。字段与命令必须按实际版本、发行版、ACL 和托管服务限制复核;Redis 官方 latest 文档可能包含部署版本尚无的字段,不把字段缺失解释成数值为零。本文没有执行命令、压测、驱逐或故障切换,也没有证明任何环境已经达到性能目标。
适用入口是已获授权的具体实例及数据库编号。Sentinel 发现、Cluster 分片和代理入口须先映射到真正处理请求的节点;Cluster 不能通过一个节点的统计推断全部分片。若发现疑似数据丢失、持续重启或主从关系争议,先转入事故流程,不在诊断阶段改变角色。
一、先定义业务影响和采样预算
记录告警开始时间、业务 p95/p99、超时与重试率、命令类型、请求大小、连接池等待以及近期发布。缓存命中率下降引发后端数据库压力,与 Redis 自身命令执行变慢可能同时存在,应分别追踪。以受影响实例、业务前缀和十分钟观察窗作为建议初始范围,实际范围由值班负责人确认;不能为寻找一条慢命令无限采样。
在已批准 TLS 连接上使用最小诊断身份,凭据通过交互提示或受保护注入提供,不写进 URI、-a 参数或共享脚本。下面仅为连接形式示例,主机、CA、端口、用户及数据库必须人工替换。托管平台若仅提供控制台诊断,则使用其已授权入口,不绕过服务访问政策。Redis CLI 文档 说明连接及认证选项。
redis-cli --tls --cacert '/REPLACE_WITH_APPROVED_CA.pem' \
-h 'REPLACE_WITH_APPROVED_HOST' -p 6379 \
--user 'REPLACE_WITH_DIAGNOSTIC_USER' --askpass -n 0二、把内存的四种口径分开
在上述已核实的交互连接内读取下列小范围信息,命令不在本站执行。先采一次基线,再按批准的间隔复查,不开紧密循环;共享报告应脱敏实例地址与拓扑信息。
INFO server
INFO memory
INFO stats
INFO replication
INFO persistence将 used_memory 理解为 Redis 分配器统计,而 used_memory_rss 是进程驻留内存;容器内存限制及同机其他进程还构成另一层约束。maxmemory 是 Redis 驱逐决策相关限制,不是操作系统 RSS 上限。mem_fragmentation_ratio 还包含其他进程开销,不能单凭比值高就确认碎片,应看字节差、分配器指标及绝对规模。字段定义见 INFO。
把监控图分成数据集、RSS/容器余量、复制与持久化、业务延迟四组,保留同一时间轴。推荐把两个采样点之间的计数变化与流量一起解释:实例重启可能重置累计计数,监控断点不是零压力。不要将多个实例的平均值掩盖单分片热点,也不把一次短暂峰值直接当成扩容依据。
三、理解驱逐、TTL 与不能驱逐的内存
LRU 驱逐在内存策略触发时选择较少近期使用的候选键,Redis 使用近似算法;它不是到期删除,也不是对任意内存开销的清理。allkeys-lru 可从全部键选择,volatile-lru 只选择带 TTL 的键;无候选键时后者不能保证写入成功。noeviction 不主动为新写入驱逐键,部分需要新增内存的命令会报错,因此先确认数据是否允许丢弃,再谈策略选择。驱逐机制 给出这些差异。
复制和 AOF 的部分缓冲不会计入驱逐比较,可通过 mem_not_counted_for_evict 观察,故 maxmemory 尚未触顶仍可能遇到进程或容器内存危机。预算应为复制、持久化和进程开销保留余量,不能把主机全部内存设为数据集额度。订单状态、分布式锁或会话等用途未经业务确认,不因临时压力就改成全键驱逐;已驱逐数据也不能通过改回旧配置自动复原。
四、把持久化峰值与复制积压单独调查
检查 INFO persistence 的 RDB/AOF 后台状态、最近成功或失败结果、fork/COW 相关字段及既有磁盘延迟监控;再对照 INFO replication 的角色、链路、复制偏移与缓冲趋势。Redis 7 起采用多部分 AOF,基础文件、增量文件和 manifest 构成一个整体,不把某个大 AOF 文件视为可随意删除的垃圾。背景保存或重写涉及额外内存与 I/O,不能在内存危急时盲目再触发一次。持久化文档 说明机制与版本变化。
若上游写入突增同时带来复制积压,限流对象应由业务负责人确认;若 AOF 写入失败,优先保护数据与证据并处理已定位的存储问题。禁止为了消除告警临时关闭持久化、删除持久化文件或切换到未核验副本。Sentinel 故障转移本身不能解决所有节点共享的容量不足,并可能引入新的数据缺口。
五、慢日志与客户端延迟不能画等号
在获准读取敏感命令元数据后,至多取十条慢日志,并读取已启用的延迟监控结果。慢日志中可能含键名、命令参数和客户端信息,只保存必要脱敏摘要,不把原始输出贴到公开知识库。
SLOWLOG GET 10
LATENCY LATEST慢日志主要反映服务端命令执行耗时,不能覆盖客户端连接池等待、网络往返和全部排队时间;见 Redis 延迟诊断 与 SLOWLOG GET。LATENCY LATEST 没有结果可能是监控未启用或没有采样到阈值事件,不等于用户没有延迟;诊断期间不无条件 CONFIG SET 开启或调低阈值。
将超时先拆为连接建立、池等待、发送、服务端处理和读取响应,再匹配 CPU、磁盘及持久化事件。建议每个假设至少附一个支持证据和一个排除条件,例如“同一分钟 fork 事件与延迟同向”只能支持相关性,需要重复窗口或隔离试验才能形成因果判断。不要用生产压测、长期 MONITOR 或重复大查询制造诊断噪声。
六、按已知键优先,扫描必须有停止边界
优先从应用负责人提供的脱敏键模式和具体样本定位。以下只读示例只查一个已批准键;不获取键值,不使用全量嵌套采样。MEMORY USAGE ... SAMPLES 5 对嵌套对象给出采样估计,不是所有元素的精确总和;TTL 的 -1 表示无过期设置,-2 表示键不存在,二者都不能解释为立即过期。MEMORY USAGE 与 TTL 提供参数语义。
TYPE APPROVED_SAMPLE_KEY
TTL APPROVED_SAMPLE_KEY
MEMORY USAGE APPROVED_SAMPLE_KEY SAMPLES 5确需搜索时先审批前缀、数据库和实例,建议上限为五次游标调用、每秒最多一次、累计十秒,任一条件达到即停止并记录“部分样本”。SCAN 的 COUNT 只是工作量提示,不是结果硬上限;MATCH 不等于索引查询,且可能空结果但游标未结束、出现重复键,不把部分扫描当完整快照。SCAN 文档 解释迭代限制。
本手册不提供无界扫描循环,也不使用 KEYS *、FLUSHALL、全库 --bigkeys 扫描或按通配符删除。任何批准采样一旦显著抬升 CPU、p99 或超时,就停止发出后续请求;应保留已收集证据,不为完成预定次数继续施压。
七、处置选项与回退限制
按证据选择最小变更:写入突增可评审应用限流与重复请求抑制;异常对象增长可评审上游数据结构与 TTL 生命周期;非可丢弃状态应评审隔离用途或容量迁移;持久化与复制压力应先处理对应瓶颈。每项动作都需要负责人、目标实例、预期信号、停止条件、观察窗口与独立审批,本文不直接下发任何配置或删除命令。
扩容前确认宿主机余量、COW 峰值及故障时副本承载能力;提高 maxmemory 可能把 Redis 内部错误变成操作系统 OOM。降低额度或更换驱逐策略可能立即产生数据淘汰,不能承诺可逆。对已批准的配置变更,保存原值和配置来源,运行时值与部署配置应一致;恢复旧值只是配置回退,不代表键内容或业务状态已经恢复。
八、验收与交接
用批准的真实负载窗口核对 p95/p99、超时、错误、命中率、后端数据库压力、RSS/容器余量、驱逐趋势及持久化/复制状态。一次 PING 成功和单次内存下降都不足以结案。验收需注明窗口、样本规模、未覆盖时段和剩余风险;无法观察高峰就列入后续验证,不虚构高峰成绩。
建议工单保留:实例和版本、业务用途、原策略与额度、脱敏采样时间轴、根因假设及反证、批准动作、实际结果、停止或回退记录、容量责任人与复查时间。发现数据被驱逐后应单独追踪业务重建和一致性,不只关闭资源告警。没有实际执行和复核结果时,知识条目继续标为 PENDING。