Redis线上问题排查指南:常见错误与解决思路
作为高性能的内存数据库,Redis在线上环境中承担着缓存、队列、计数器等重要角色。然而,面对复杂的生产环境,Redis也难免会遇到各种“疑难杂症”。本文结合实战经验,总结Redis线上问题排查思路与解决方案,助你快速定位问题,恢复业务稳定。
一、常见问题分类与排查方向
1. 连接问题
现象:客户端无法连接Redis,返回Connection refused
或超时错误。
- 排查步骤:
- 检查网络连通性:
telnet <redis_ip> <port>
- 验证Redis服务状态:
ps -ef | grep redis
- 查看Redis配置:
# 检查bind和protected-mode配置 redis-cli config get bind redis-cli config get protected-mode
- 检查最大连接数限制:
redis-cli config get maxclients redis-cli info clients # 查看当前连接数
- 查看日志定位错误:
tail -f /var/log/redis/redis.log
- 检查网络连通性:
解决方案:
- 调整
bind
绑定地址或关闭protected-mode
(仅测试环境) - 修改
maxclients
并优化客户端连接池配置 - 检查防火墙规则:
iptables -L -n
2. 性能问题(延迟高)
现象:Redis响应变慢,业务侧出现超时。
- 排查步骤:
- 使用
redis-cli --latency
检测基准延迟 - 检查慢查询日志:
redis-cli config set slowlog-log-slower-than 1000 # 设置阈值(微秒) redis-cli slowlog get 10 # 查看最近10条慢查询
- 分析内存使用情况:
redis-cli info memory # 关注used_memory、mem_fragmentation_ratio
- 检查持久化阻塞:
- RDB:
redis-cli info persistence | grep rdb_last_bgsave_status
- AOF:
redis-cli info persistence | grep aof_last_bgrewrite_status
- RDB:
- 使用
解决方案:
- 优化慢查询(避免
KEYS *
、大范围HGETALL
) - 升级实例规格或启用集群分片
- 调整持久化策略(如关闭AOF的
appendfsync always
)
3. 内存问题(OOM)
现象:Redis触发OOM(Out Of Memory),无法写入新数据。
- 排查步骤:
- 检查内存使用率:
redis-cli info memory | grep used_memory_human
- 查找大Key:
redis-cli --bigkeys # 扫描大Key(生产环境慎用)
- 分析内存碎片率:
redis-cli info memory | grep mem_fragmentation_ratio # >1.5 表示碎片较高
- 检查淘汰策略:
redis-cli config get maxmemory-policy
- 检查内存使用率:
解决方案:
- 清理大Key(分批次删除)
- 设置合理的
maxmemory
和淘汰策略(如allkeys-lru
) - 启用内存碎片整理:
config set activedefrag yes
4. 数据不一致问题
现象:主从节点数据不一致,或缓存与DB不一致。
- 排查步骤:
- 检查主从同步状态:
redis-cli info replication # 关注slave0:offset与master_repl_offset差值
- 验证过期键策略:
redis-cli config get hz # 默认10,控制过期键清理频率
- 使用
redis-check-rdb
或redis-check-aof
验证持久化文件
- 检查主从同步状态:
解决方案:
- 确保主从网络稳定,适当增大
repl-timeout
- 使用
EXPIRE
命令设置合理TTL - 双写场景下采用延迟双删策略
5. 集群问题
现象:集群节点故障、槽位迁移失败。
- 排查步骤:
- 检查集群状态:
redis-cli --cluster check <node_ip>:<port>
- 查看节点信息:
redis-cli cluster nodes
- 检查集群网络带宽:
iftop -i eth0
- 检查集群状态:
解决方案:
- 故障节点恢复或替换
- 手动执行槽位迁移:
redis-cli --cluster reshard
- 优化集群节点部署(避免跨机房)
二、预防措施与最佳实践
- 监控告警:部署Prometheus + Grafana监控以下指标:
- 内存使用率、连接数、QPS、命中率、主从延迟
- 定期维护:
- 每月执行
scan
扫描清理无用Key - 检查持久化文件完整性
- 每月执行
- 容量规划:提前评估业务增长,预留30%内存缓冲
- 代码规范:
- 避免使用阻塞命令(如
BLPOP
长时间阻塞) - 使用Pipeline减少网络往返
- 避免使用阻塞命令(如
三、总结:Redis排查路线图
- 明确现象:连接失败?性能下降?数据异常?
- 定位方向:网络 > 配置 > 资源 > 数据 > 集群
- 工具辅助:
- 内置命令:
info
、slowlog
、memory
- 外部工具:
redis-cli --bigkeys
、redis-benchmark
- 内置命令:
- 验证解决:变更后通过压测验证效果
附录:常用命令速查表
# 实时监控
redis-cli monitor
# 内存分析
redis-cli memory stats
# 连接池诊断
redis-cli client list
通过系统化的排查思路和工具链,Redis线上问题将不再令人头疼。建议收藏本文,随时应对突发状况!
获取更多技术干货,欢迎关注博主! 💡