Skip to content

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 bind
bash
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 yes
bash
# Memory
used_memory:4294967296
used_memory_human:4.00G
maxmemory:4294967296
maxmemory_human:4.00G
mem_fragmentation_ratio:1.25
OK
OK

Q3: 主从同步延迟

bash
# 查看复制偏移量差
INFO replication

# 关注字段:
# master_repl_offset vs slave_repl_offset
# 差值越大,延迟越严重

# 解决方案
# 1. 确保网络带宽充足
# 2. 避免大 Key 写入(一次性写入 100 万元素的 List)
# 3. 增大 repl_backlog_size
CONFIG SET repl-backlog-size 256mb
bash
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.102,port=6379,state=online,offset=1234567,lag=5
master_repl_offset:1234567
OK

Q4: 缓存穿透 / 击穿 / 雪崩

问题描述解决方案
缓存穿透查询一个根本不存在的数据,缓存和数据库都查不到布隆过滤器 / 缓存空值(设短过期时间)
缓存击穿某个热点 Key 过期瞬间,大量请求打到数据库互斥锁(SETNX)/ 逻辑过期 / 永不过期
缓存雪崩大量 Key 同时过期,请求全部打到数据库过期时间加随机值 / 多级缓存 / 熔断降级
bash
# 防止缓存雪崩:过期时间加随机偏移
SET product:1001 "{json_data}" EX 3540  # 3600 - random(0, 120)

# 防止缓存击穿:分布式锁
# 只有一个线程去查数据库并写入缓存
SET lock:product:1001 "1" NX EX 5