Redis 从入门到精通十三性能优化与运维实战 —— 慢查询、内存优化、监控与安全一、慢查询分析与优化1.1 慢查询日志Redis 的慢查询日志记录的是执行时间超过阈值的命令不包括排队和网络传输时间。# 配置 CONFIG SET slowlog-log-slower-than10000# 超过 10000 微秒10ms记录CONFIG SET slowlog-max-len128# 最多保留 128 条记录# 查看 SLOWLOG GET10# 查看最近 10 条慢查询# 输出示例# 1) 1) (integer) 42 # 日志 ID# 2) (integer) 1686123456 # 时间戳# 3) (integer) 15234 # 执行耗时微秒# 4) 1) KEYS # 命令# 2) user:*# 5) 127.0.0.1:54321 # 客户端SLOWLOG LEN# 当前慢查询条数SLOWLOG RESET# 清空慢查询日志1.2 常见慢查询原因与解决方案原因特征解决方案O(n) 命令KEYS *、SMEMBERS、HGETALL、LRANGE 0 -1在大 key 上SCAN替代KEYS、HSCAN替代HGETALL、分页取大 Key 删除DEL bigkey阻塞UNLINK异步删除4.0复杂度高的命令SORT、SUNION、ZINTERSTORE评估是否在业务层做fork 耗时BGSAVE/BGREWRITEAOF 期间延迟升高减少 fork 频率预留内存内存淘汰maxmemory触发淘汰扩容或调整淘汰策略# 排查 O(n) 命令的 key 大小redis-cli--bigkeys# 查看某个 key 的内存占用MEMORY USAGE big:hash:key# 查看命令的复杂度# Redis 文档中每个命令都标了 Time complexity# 特别注意 O(N)、O(NM) 的命令1.3 Latency MonitorRedis 2.8.13 引入延迟监控可以记录各种延迟事件# 开启延迟监控CONFIG SET latency-monitor-threshold100# 超过 100ms 的事件记录# 查看延迟事件LATENCY LATEST# 最近的事件LATENCY HISTORYcommand# 命令延迟历史LATENCY DOCTOR# 诊断报告LATENCY RESET# 重置二、内存优化2.1 内存分析命令# 总体内存使用INFO memory# 关键指标解读used_memory:8779512# Redis 实际使用的内存字节used_memory_rss:14020608# 操作系统分配的内存含碎片mem_fragmentation_ratio:1.60# 碎片率 used_memory_rss / used_memory# 1.5 需要关注 2 需要处理# 单个 key 内存占用Redis 4.0MEMORY USAGE user:1001# 抽样分析 key 大小MEMORY STATS# 内存使用统计概览2.2 内存碎片处理碎片产生原因jemalloc 分配器的固定大小分配策略频繁的 key 增删导致内存碎片大量小 key 更新引起内存页重新分配处理方案# 方案一自动碎片整理Redis 4.0CONFIG SET activedefragyes# 碎片整理触发条件active-defrag-ignore-bytes 100mb# 碎片超过 100MB 开始整理active-defrag-threshold-lower10# 碎片率 10% 开始active-defrag-threshold-upper100# 碎片率达到 100% 时全力整理# 方案二重启最终手段# 通过主从切换实现零停机重启2.3 内存优化最佳实践# 1. 用小数据结构# Hash/Set/ZSet 在元素少时用 listpack/intset 编码极大省内存# 确保不超过阈值hash-max-listpack-entries512hash-max-listpack-value64# 2. 用整数 ID 而不是长字符串# user:1001 优于 user:550e8400-e29b-41d4-a716-446655440000# 3. 过期时间合理设置# 不要让不需要的数据永远存在# 4. 共享整数池# 0~9999 的整数对象被 Redis 预先创建并共享# 5. 关闭不用的功能# 如果不需要持久化关闭 RDB 和 AOF 可减少内存开销三、监控指标体系3.1 核心监控指标Redis 监控体系性能指标QPS / 延迟 / 慢查询内存指标used_memory / 碎片率 / 淘汰数连接指标连接数 / 拒绝连接数持久化指标RDB 状态 / AOF 大小复制指标主从延迟 / backlog 使用错误指标命令错误 / 拒绝连接指标命令/来源告警阈值建议QPSINFO stats→instantaneous_ops_per_sec超过历史峰值 1.5 倍命令延迟客户端埋点P99 10ms慢查询SLOWLOG LEN每分钟新增 10内存使用率used_memory / maxmemory 80%碎片率mem_fragmentation_ratio 1.5连接数connected_clients 80% maxclients主从延迟INFO replication→lag 5 秒RDB 状态rdb_last_bgsave_status≠ ok3.2 监控脚本示例#!/bin/bash# redis_monitor.sh —— 通过 cron 每分钟执行REDIS_CLIredis-cli -h localhost -p 6379 -a your_password# 内存使用率USED$($REDIS_CLI INFO memory|grepused_memory:|cut-d:-f2|tr-d\r)MAX$($REDIS_CLI CONFIG GET maxmemory|tail-1)if[$MAX!0];thenRATIO$((USED*100/MAX))if[$RATIO-gt80];thenechoWARNING: Redis memory usage${RATIO}%|\curl-d- http://your-alert-webhookfifi# 慢查询SLOW$($REDIS_CLI SLOWLOG LEN)if[$SLOW-gt50];thenechoWARNING: Slowlog count:$SLOWfi# 主从延迟如果是从库LAG$($REDIS_CLI INFO replication|greplag|cut-d-f2|tr-d\r)if[-n$LAG][$LAG-gt5];thenechoWARNING: Replication lag:${LAG}sfi3.3 Info 命令速查INFO server# 服务器基本信息版本、进程 ID、运行时间INFO clients# 客户端连接信息INFO memory# 内存使用详情INFO persistence# RDB 和 AOF 状态INFO stats# 命令统计、QPS、命中率INFO replication# 主从复制状态INFO cpu# CPU 消耗INFO commandstats# 每个命令的执行次数和耗时INFO keyspace# 每个数据库的 key 数量# 计算命中率# keyspace_hits / (keyspace_hits keyspace_misses)四、线上故障排查思路4.1 排查框架响应变慢连不上内存告警数据丢了QPS 突降故障发生什么症状1. 查慢查询 SLOWLOG2. 查延迟 LATENCY DOCTOR3. 查 CPU INFO cpu4. 查 BGSAVE 是否进行中1. 查连接数 INFO clients2. 查 maxclients 配置3. 查网络/防火墙1. 查内存使用 INFO memory2. 查 bigkeys3. 查碎片率4. 查是否有 BGSAVE 导致 COW1. 查持久化是否正常2. 查 AOF 文件是否损坏3. 查主从同步状态1. 查慢查询2. 查带宽3. 查是否有热 Key4.2 常见故障快速修复# 1. O(n) 命令阻塞# 症状Redis 突然无响应CPU 100%# 排查CLIENT LIST|grepKEYS\|SMEMBERS\|FLUSHALL# 修复CLIENT KILL addr# 杀掉正在执行慢命令的客户端# 预防rename-command KEYS # 禁用危险命令# 2. 内存突然暴涨# 排查redis-cli--bigkeysINFO memory|grepmem_fragmentation_ratio# 修复# - 如果有过期 key 堆积等待定期删除# - 如果是 BGSAVE 导致的 COW等待子进程完成# - 紧急情况手动触发内存淘汰 CONFIG SET maxmemory-policy allkeys-lru# 3. AOF 文件损坏# 症状Redis 无法启动# 修复redis-check-aof--fixappendonly.aof# 然后正常重启# 4. 集群脑裂# 排查CLUSTER NODES# 检查各节点状态# 修复手动修复分区确保多数派可用redis-cli--clusterfix192.168.1.101:63794.3 热 Key 应急处理# 1. 快速发现热 KeyRedis 4.0redis-cli--hotkeys# 2. 查看热 Key 的访问频率OBJECT FREQ hotkey# 3. 临时多副本客户端层做# 4. 紧急扩容 Cluster 分片五、安全加固5.1 基础安全配置# redis.conf 安全配置 # 1. 绑定内网 IPbind10.0.0.1# 2. 设置密码requirepassstrong_password_here# 3. 禁用高危命令rename-command FLUSHDBrename-command FLUSHALLrename-command CONFIGCONFIG_9a8b7c6d# 重命名而非禁用rename-command KEYSrename-command DEBUG# 4. 限制连接数maxclients10000# 5. 超时断连timeout300# 空闲 300 秒断开# 6. 保护模式默认开启protected-modeyes5.2 ACL 2.0Redis 6.0# 创建用户ACL SETUSERreadonlyonpassword123 ~key:* read -write -dangerous# ↑ ↑ ↑ ↑ ↑# 启用 密码 允许key模式 可读 禁止写 禁止危险命令# 创建管理员ACL SETUSER admin onadmin_pass ~* all# 查看用户ACL LIST ACL WHOAMI# 禁用 default 用户ACL SETUSER default off# 保存 ACL持久化ACL SAVE# 使用 ACL 登录redis-cli-hlocalhost-p6379--userreadonly--passpassword1235.3 TLS 加密Redis 6.0# 生成证书openssl req-x509-newkeyrsa:4096-keyoutredis.key-outredis.crt\-days365-nodes-subj/CNredis-server# redis.conftls-port6380tls-cert-file /path/to/redis.crt tls-key-file /path/to/redis.key tls-ca-cert-file /path/to/ca.crt# 客户端连接redis-cli--tls--certclient.crt--keyclient.key--cacertca.crt六、总结运维检查清单# 每日检查□ 内存使用率80% □ 慢查询数量10/min □ BGSAVE 状态ok □ AOF 文件大小正常增长 □ 主从延迟1s# 每周检查□ 内存碎片率1.5□ 大 Key 扫描 □ 命令统计异常排查 □ 备份文件完好 □ 连接数趋势# 每季度□ 性能压测 □ 故障演练主从切换、集群分区恢复 □ 版本升级评估如有疑问或指正欢迎在评论区交流。