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 | != ok | AOF 写入失败 |
延伸阅读
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。