12. 常见问题与排错
Q1: 连接被拒绝
bash
# 错误信息
Could not connect to Redis at 127.0.0.1:6379: Connection refused
# 排查步骤
# 1. 检查 Redis 是否在运行
sudo systemctl status redis-server
ps aux | grep redis
# 2. 检查端口是否监听
ss -tlnp | grep 6379
# 3. 检查防火墙
sudo ufw allow 6379
sudo iptables -L -n | grep 6379
# 4. 检查 bind 配置
CONFIG GET bindbash
redis-server.service - Advanced key-value store
Active: active (running) since Sat 2024-01-01 10:00:00 CST
LISTEN 0 128 127.0.0.1:6379 0.0.0.0:* users:(("redis-server",pid=1234,fd=6))
1) "bind"
2) "127.0.0.1"Q2: 内存不足 (OOM)
bash
# 错误信息
OOM command not allowed when used memory > 'maxmemory'.
# 排查
INFO memory
# 关注: used_memory_human, maxmemory_human, mem_fragmentation_ratio
# 解决方案
# 1. 增加 maxmemory
CONFIG SET maxmemory 8gb
# 2. 设置合理的淘汰策略
CONFIG SET maxmemory-policy allkeys-lru
# 3. 清理过期数据
SCAN 0 MATCH "temp:*" COUNT 1000
# 4. 检查碎片率(如果 > 1.5,建议清理)
CONFIG SET activedefrag yesbash
# Memory
used_memory:4294967296
used_memory_human:4.00G
maxmemory:4294967296
maxmemory_human:4.00G
mem_fragmentation_ratio:1.25
OK
OKQ3: 主从同步延迟
bash
# 查看复制偏移量差
INFO replication
# 关注字段:
# master_repl_offset vs slave_repl_offset
# 差值越大,延迟越严重
# 解决方案
# 1. 确保网络带宽充足
# 2. 避免大 Key 写入(一次性写入 100 万元素的 List)
# 3. 增大 repl_backlog_size
CONFIG SET repl-backlog-size 256mbbash
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.102,port=6379,state=online,offset=1234567,lag=5
master_repl_offset:1234567
OKQ4: 缓存穿透 / 击穿 / 雪崩
| 问题 | 描述 | 解决方案 |
|---|---|---|
| 缓存穿透 | 查询一个根本不存在的数据,缓存和数据库都查不到 | 布隆过滤器 / 缓存空值(设短过期时间) |
| 缓存击穿 | 某个热点 Key 过期瞬间,大量请求打到数据库 | 互斥锁(SETNX)/ 逻辑过期 / 永不过期 |
| 缓存雪崩 | 大量 Key 同时过期,请求全部打到数据库 | 过期时间加随机值 / 多级缓存 / 熔断降级 |
bash
# 防止缓存雪崩:过期时间加随机偏移
SET product:1001 "{json_data}" EX 3540 # 3600 - random(0, 120)
# 防止缓存击穿:分布式锁
# 只有一个线程去查数据库并写入缓存
SET lock:product:1001 "1" NX EX 5