Redis 性能调优与生产监控

深入 Redis 性能调优:内存优化、大 Key 治理、慢查询诊断、延迟分析、基准测试与生产监控指标体系建设。

1. 内存优化策略

1.1 查看内存使用

# 内存统计
INFO memory
# used_memory: 1073741824          # Redis 分配的总内存(字节)
# used_memory_rss: 1572864000       # OS 视角 RSS(含碎片、库等)
# mem_fragmentation_ratio: 1.46     # 碎片率 = RSS / used_memory
# used_memory_dataset: 805306368    # 纯数据占用
# used_memory_overhead: 268435456   # 内部数据结构开销

1.2 减少内存占用

策略说明适用场景
哈希化小对象Hash 存储 > 10 个字段的对象用户资料、配置
整数编码String 存整数用 int 编码计数器、ID
ziplist/listpack小集合用紧凑编码列表元素 < 512,单个 < 64B
共享对象0-9999 整数复用计数器值
持久化压缩RDB 启用压缩备份文件
# 查看某个 key 的内存占用
MEMORY USAGE user:1001

# 查看编码方式
OBJECT ENCODING user:1001:name  # "embstr" / "raw" / "int"

1.3 内存上限与淘汰策略

# 配置最大内存
maxmemory 2gb

# 淘汰策略
maxmemory-policy allkeys-lru    # 所有 key LRU 淘汰
# volatile-lru: 只淘汰有过期时间的 key(LRU)
# allkeys-lfu: 所有 key LFU 淘汰
# volatile-ttl: 淘汰即将过期的 key
# noeviction: 不淘汰,新写入报错(默认)

2. 大 Key 治理

2.1 大 Key 的危害

影响说明
阻塞单线程 Redis,大 Key 操作阻塞其他请求
网络瓶颈传输大 Key 占用带宽
复制延迟主从同步时大 Key 造成延迟
内存不均衡Cluster 模式下某节点内存突增

2.2 检测大 Key

# 扫描大 Key(线上慎用,会阻塞)
redis-cli --bigkeys

# 内存采样分析
redis-cli --memkeys

# 查看具体 key 大小
MEMORY USAGE mykey SAMPLES 50

2.3 大 Key 拆分

# 大 Hash 拆分:按字段前缀分桶
# 原: HGETALL article:123  → 10000 个字段
# 拆: HGETALL article:123:content
#     HGETALL article:123:metadata

# 大 List 拆分:按时间窗口
# 原: LPUSH log  → 1000 万条
# 拆: LPUSH log:202401
#     LPUSH log:202402

# 大 ZSet 拆分:按分数范围
# 原: ZADD timeline  → 100 万条
# 拆: ZADD timeline:2024Q1
#     ZADD timeline:2024Q2

# 渐进式删除大 Key(非阻塞)
UNLINK bigkey       # 异步删除(Redis 4.0+)
# 或分批次删除
LRANGE biglist 0 99
LTRIM biglist 100 -1   # 循环直到删完

3. 慢查询诊断

3.1 慢查询日志

# 配置慢查询阈值(微秒)
CONFIG SET slowlog-log-slower-than 10000  # > 10ms
CONFIG SET slowlog-max-len 128

# 查看慢查询
SLOWLOG GET 10
SLOWLOG LEN
SLOWLOG RESET

3.2 延迟监控

# 内置延迟监控
CONFIG SET latency-monitor-threshold 10   # > 10ms 记录

LATENCY LATEST                           # 最新延迟事件
LATENCY HISTORY command                  # 命令延迟历史
LATENCY GRAPH command                    # 命令延迟分布图
LATENCY GRAPH fork                       # RDB/AOF fork 延迟
LATENCY DOCTOR                           # 延迟诊断建议
LATENCY RESET                            # 重置统计

3.3 常见延迟原因

原因现象解决
大 Key 操作某命令耗时数百 ms拆分大 Key
AOF 同步fsync 阻塞改为 everysec 或 no
RDB Fork内存大时 fork 耗时禁用/增大内存/使用 AOF
内存交换内存不足触发 swap增大物理内存或限制 maxmemory
网络延迟跨可用区/地域就近部署或使用连接池

4. 基准测试

# Redis 自带基准测试工具
redis-benchmark -h localhost -p 6379 -n 100000 -c 50

# 参数说明
# -n: 总请求数
# -c: 并发连接数
# -d: 数据大小(字节)
# -t: 测试的命令集
# -P: Pipeline 批量数

# 测试 Pipeline 性能
redis-benchmark -n 100000 -c 50 -P 16 -t set,get

# 测试特定命令
redis-benchmark -n 10000 -t lpush,lpop

5. 生产监控指标体系

指标告警阈值说明
used_memory> maxmemory × 80%内存使用率
mem_fragmentation_ratio> 1.5 或 < 1.0碎片率
connected_clients> maxclients × 80%连接数
rejected_connections> 0拒绝连接数
keyspace_hits / (hits+misses)< 90%命中率
instantaneous_ops_per_sec观察趋势实时 QPS
master_link_down_since_seconds> 0主从断连
rdb_last_bgsave_status!= ok持久化失败
aof_last_write_status!= okAOF 写入失败

延伸阅读

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「redis」更多文章

  1. 09. Java 客户端与 Spring Data Redis
  2. Redis 事务、Lua 脚本与原子操作
  3. Redis 主从复制与 Sentinel 高可用