本文档风哥主要介绍Redis大Key优化实战,包括大Key概念、大Key影响、大Key检测、大Key预防、大Key优化策略、大Key迁移、大Key检测实施、大Key优化实施、大Key监控、大Key故障排查以及实战案例等内容,风哥教程参考Redis官方文档等内容编写,适合DBA人员和开发人员在生产环境中使用。
Part01-基础概念与理论知识
1.1 大Key概念
Redis大Key是指占用内存较大的键,通常定义为:
- String类型:值大小超过10KB
- Hash类型:字段数量超过1000个
- List类型:元素数量超过1000个
- Set类型:元素数量超过1000个
- ZSet类型:元素数量超过1000个
1.2 大Key影响
Redis大Key的影响:
- 内存使用:大Key会占用大量内存,导致内存使用不均衡
- 性能影响:大Key的读写操作会阻塞Redis,影响其他操作的执行
- 网络传输:大Key的传输会占用大量网络带宽
- 持久化影响:大Key的持久化会增加RDB和AOF文件的大小,影响持久化和恢复速度
- 集群影响:在集群模式下,大Key会导致Slot分布不均衡,影响集群性能
1.3 大Key检测
## 1. 使用redis-cli命令检测大Key
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 –bigkeys
## 2. 使用SCAN命令检测大Key
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 –scan | xargs -I {} redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 memory usage {}
## 3. 使用INFO命令查看内存使用情况
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info memory
## 4. 使用自定义脚本检测大Key
#!/bin/bash
# bigkey_detection.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
REDIS_CLI=”/redis/app/bin/redis-cli”
HOST=”192.168.1.100″
PORT=”6379″
PASSWORD=”fgedu@2026″
$REDIS_CLI -h $HOST -p $PORT -a $PASSWORD –bigkeys
更多视频教程www.fgedu.net.cn
Part02-生产环境规划与建议
2.1 大Key预防
- 合理设计Key结构:避免将大量数据存储在单个Key中
- 数据分片:将大型数据分片存储在多个Key中
- 定期清理:定期清理过期或不再使用的Key
- 监控预警:设置大Key监控和预警机制
- 业务优化:从业务层面优化数据存储方式
2.2 大Key优化策略
## 1. String大Key优化
– 拆分:将大String拆分为多个小String
– 压缩:对String值进行压缩存储
– 过期时间:设置合理的过期时间
## 2. Hash大Key优化
– 拆分:将大Hash拆分为多个小Hash
– 字段数量控制:控制每个Hash的字段数量
– 合理使用Hash:只存储必要的字段
## 3. List大Key优化
– 拆分:将大List拆分为多个小List
– 长度控制:控制List的长度
– 使用Queue:使用消息队列替代大List
## 4. Set大Key优化
– 拆分:将大Set拆分为多个小Set
– 交集并集优化:避免对大Set进行交集、并集操作
– 使用位图:对于布尔类型的Set,使用位图替代
## 5. ZSet大Key优化
– 拆分:将大ZSet拆分为多个小ZSet
– 分数范围控制:根据分数范围拆分ZSet
– 合理使用ZSet:只存储必要的元素
2.3 大Key迁移
## 1. 使用SCAN命令渐进式迁移
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 scan 0 MATCH user:* COUNT 100
## 2. 使用Pipeline批量迁移
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 –pipe < migrate.txt
## 3. 使用Redis迁移工具
$ /redis/app/bin/redis-cli --cluster import 192.168.1.100:7000 --cluster-from 192.168.1.200:6379 --cluster-copy
## 4. 手动迁移
# 从源Redis获取数据
$ /redis/app/bin/redis-cli -h 192.168.1.200 -p 6379 -a fgedu@2026 get bigkey > bigkey.txt
# 导入到目标Redis
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 set bigkey “$(cat bigkey.txt)”
学习交流加群风哥QQ113257174
Part03-生产环境项目实施方案
3.1 大Key检测实施
## 1. 安装redis-rdb-tools工具
$ pip install rdbtools
## 2. 分析RDB文件
$ rdb -c memory /redis/fgdata/dump.rdb > memory.csv
## 3. 查看大Key
$ sort -t, -k4 -nr memory.csv | head -20
## 4. 使用redis-cli命令检测大Key
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 –bigkeys
## 5. 编写监控脚本
#!/bin/bash
# bigkey_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
REDIS_CLI=”/redis/app/bin/redis-cli”
HOST=”192.168.1.100″
PORT=”6379″
PASSWORD=”fgedu@2026″
THRESHOLD=10000
$REDIS_CLI -h $HOST -p $PORT -a $PASSWORD –bigkeys | grep -E “(string|hash|list|set|zset)”
3.2 大Key优化实施
## 1. String大Key优化
# 拆分大String为多个小String
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 set user:1001:profile:basic “{\”name\”:\”张三\”,\”age\”:25}”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 set user:1001:profile:contact “{\”email\”:\”zhangsan@example.com\”,\”phone\”:\”13800138000\”}”
## 2. Hash大Key优化
# 拆分大Hash为多个小Hash
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset user:1001:info:basic name “张三”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset user:1001:info:basic age “25”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset user:1001:info:contact email “zhangsan@example.com”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset user:1001:info:contact phone “13800138000”
## 3. List大Key优化
# 拆分大List为多个小List
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lpush user:1001:messages:202401 “message1”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lpush user:1001:messages:202401 “message2”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lpush user:1001:messages:202402 “message3”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lpush user:1001:messages:202402 “message4”
## 4. Set大Key优化
# 拆分大Set为多个小Set
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd user:1001:tags:work “developer”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd user:1001:tags:work “java”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd user:1001:tags:hobby “reading”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd user:1001:tags:hobby “swimming”
## 5. ZSet大Key优化
# 拆分大ZSet为多个小ZSet
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zadd product:top:sales:202401 1000 “2001”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zadd product:top:sales:202401 900 “2002”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zadd product:top:sales:202402 800 “2003”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zadd product:top:sales:202402 700 “2004”
3.3 大Key监控
## 1. 使用Redis自带命令监控
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info memory
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 –bigkeys
## 2. 使用Prometheus监控
# 配置Prometheus监控Redis
– job_name: ‘redis’
static_configs:
– targets: [‘192.168.1.100:9121’]
## 3. 使用Grafana可视化
# 配置Grafana面板,监控Redis内存使用和大Key情况
## 4. 编写监控脚本
#!/bin/bash
# bigkey_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
REDIS_CLI=”/redis/app/bin/redis-cli”
HOST=”192.168.1.100″
PORT=”6379″
PASSWORD=”fgedu@2026″
THRESHOLD=10000
# 检测大Key
BIGKEYS=$($REDIS_CLI -h $HOST -p $PORT -a $PASSWORD –bigkeys)
# 发送告警
if echo “$BIGKEYS” | grep -E “(string|hash|list|set|zset)” | grep -E “([0-9]+)\s+bytes\s+\(|([0-9]+)\s+items\s+\(” | awk ‘{if($1 > $THRESHOLD) print $0}’; then
echo “发现大Key,请及时处理”
fi
3.4 大Key故障排查
## 1. 检查内存使用情况
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info memory
## 2. 查找大Key
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 –bigkeys
## 3. 分析大Key的访问模式
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 monitor | grep bigkey
## 4. 查看大Key的类型和大小
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 type bigkey
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 memory usage bigkey
## 5. 常见故障及解决
– 内存使用过高:优化大Key,释放内存
– 性能下降:拆分大Key,减少阻塞
– 网络传输慢:压缩数据,减少网络带宽使用
– 持久化失败:优化大Key,减少持久化时间
风哥提示:Redis接口限流是保护系统的重要机制,合理的限流策略可以防止系统过载,确保系统的稳定性和可用性。在实际应用中,需要根据具体业务场景和数据特点,选择合适的限流算法和策略。
Part04-生产案例与实战讲解
4.1 String大Key优化
## 1. 场景描述
– 存储用户完整信息的大String,大小超过10KB
– 访问频率高,每次读取完整信息
## 2. 优化方案
– 拆分为多个小String,按功能或字段拆分
– 使用Hash类型存储用户信息
## 3. 实战操作
# 原大Key
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 set user:1001:profile “{\”name\”:\”张三\”,\”age\”:25,\”email\”:\”zhangsan@example.com\”,\”phone\”:\”13800138000\”,\”address\”:\”北京市朝阳区\”,\”company\”:\”ABC公司\”,\”position\”:\”工程师\”}”
# 优化后
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset user:1001:profile name “张三”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset user:1001:profile age “25”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset user:1001:profile email “zhangsan@example.com”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset user:1001:profile phone “13800138000”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset user:1001:profile address “北京市朝阳区”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset user:1001:profile company “ABC公司”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset user:1001:profile position “工程师”
## 4. 测试
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hgetall user:1001:profile
# 输出示例
1) “name”
2) “张三”
3) “age”
4) “25”
5) “email”
6) “zhangsan@example.com”
7) “phone”
8) “13800138000”
9) “address”
10) “北京市朝阳区”
11) “company”
12) “ABC公司”
13) “position”
14) “工程师”
4.2 Hash大Key优化
## 1. 场景描述
– 存储用户订单信息的大Hash,字段数量超过1000个
– 每次访问需要获取多个字段
## 2. 优化方案
– 按时间或订单类型拆分Hash
– 使用多个小Hash存储订单信息
## 3. 实战操作
# 原大Key
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset user:1001:orders order:3001 “{\”status\”:\”paid\”,\”amount\”:1000}”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset user:1001:orders order:3002 “{\”status\”:\”unpaid\”,\”amount\”:2000}”
# … 1000+个订单
# 优化后
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset user:1001:orders:202401 order:3001 “{\”status\”:\”paid\”,\”amount\”:1000}”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset user:1001:orders:202401 order:3002 “{\”status\”:\”unpaid\”,\”amount\”:2000}”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hset user:1001:orders:202402 order:3003 “{\”status\”:\”paid\”,\”amount\”:1500}”
## 4. 测试
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hgetall user:1001:orders:202401
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 hgetall user:1001:orders:202402
# 输出示例
1) “order:3001”
2) “{\”status\”:\”paid\”,\”amount\”:1000}”
3) “order:3002”
4) “{\”status\”:\”unpaid\”,\”amount\”:2000}”
1) “order:3003”
2) “{\”status\”:\”paid\”,\”amount\”:1500}”
4.3 List大Key优化
## 1. 场景描述
– 存储用户消息的大List,元素数量超过1000个
– 每次访问需要获取最新的消息
## 2. 优化方案
– 按时间拆分List
– 使用多个小List存储消息
– 设置合理的过期时间
## 3. 实战操作
# 原大Key
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lpush user:1001:messages “message1”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lpush user:1001:messages “message2”
# … 1000+条消息
# 优化后
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lpush user:1001:messages:202401 “message1”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lpush user:1001:messages:202401 “message2”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lpush user:1001:messages:202402 “message3”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 expire user:1001:messages:202401 2592000
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 expire user:1001:messages:202402 2592000
## 4. 测试
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lrange user:1001:messages:202401 0 -1
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lrange user:1001:messages:202402 0 -1
# 输出示例
1) “message2”
2) “message1”
1) “message3”
4.4 Set大Key优化
## 1. 场景描述
– 存储用户标签的大Set,元素数量超过1000个
– 每次访问需要获取所有标签
## 2. 优化方案
– 按标签类型拆分Set
– 使用多个小Set存储标签
– 对于布尔类型的标签,使用位图替代
## 3. 实战操作
# 原大Key
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd user:1001:tags “developer” “java” “python” “reading” “swimming” “music”
# … 1000+个标签
# 优化后
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd user:1001:tags:work “developer” “java” “python”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd user:1001:tags:hobby “reading” “swimming” “music”
## 4. 测试
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 smembers user:1001:tags:work
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 smembers user:1001:tags:hobby
# 输出示例
1) “developer”
2) “java”
3) “python”
1) “reading”
2) “swimming”
3) “music”
4.5 ZSet大Key优化
## 1. 场景描述
– 存储商品销售排行榜的大ZSet,元素数量超过1000个
– 每次访问需要获取Top N商品
## 2. 优化方案
– 按时间拆分ZSet
– 使用多个小ZSet存储排行榜
– 只保留Top N元素
## 3. 实战操作
# 原大Key
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zadd product:top:sales 1000 “2001” 900 “2002” 800 “2003” 700 “2004” 600 “2005”
# … 1000+个商品
# 优化后
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zadd product:top:sales:202401 1000 “2001” 900 “2002” 800 “2003”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zadd product:top:sales:202402 700 “2004” 600 “2005” 500 “2006”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zremrangebyrank product:top:sales:202401 10 -1
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zremrangebyrank product:top:sales:202402 10 -1
## 4. 测试
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrange product:top:sales:202401 0 -1 withscores
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 zrange product:top:sales:202402 0 -1 withscores
# 输出示例
1) “2003”
2) “800”
3) “2002”
4) “900”
5) “2001”
6) “1000”
1) “2006”
2) “500”
3) “2005”
4) “600”
5) “2004”
6) “700”
更多学习教程公众号风哥教程itpux_com
Part05-风哥经验总结与分享
5.1 最佳实践
Redis大Key优化实战最佳实践:
- 合理设计Key结构:避免将大量数据存储在单个Key中,学习交流加群风哥微信: itpux-com
- 数据分片:将大型数据分片存储在多个Key中
- 定期检测:定期检测大Key,及时发现和处理
- 监控预警:设置大Key监控和预警机制
- 业务优化:从业务层面优化数据存储方式
- 合理使用数据类型:根据数据特点选择合适的数据类型
- 设置过期时间:为临时数据设置合理的过期时间
- 定期清理:定期清理过期或不再使用的Key
5.2 常见问题
- 内存使用过高:优化大Key,释放内存
- 性能下降:拆分大Key,减少阻塞
- 网络传输慢:压缩数据,减少网络带宽使用
- 持久化失败:优化大Key,减少持久化时间
- 集群Slot不均衡:拆分大Key,使Slot分布均衡
- 监控不到位:配置完善的监控系统,及时发现问题
5.3 优化技巧
## 1. 预防大Key
– 从业务设计层面避免大Key的产生
– 合理设计数据结构,避免将大量数据存储在单个Key中
– 对数据进行分片存储
## 2. 检测大Key
– 使用redis-cli –bigkeys命令检测大Key
– 使用rdbtools分析RDB文件
– 编写监控脚本定期检测大Key
## 3. 优化大Key
– 拆分大Key为多个小Key
– 使用合适的数据类型存储数据
– 对数据进行压缩
– 设置合理的过期时间
## 4. 迁移大Key
– 使用SCAN命令渐进式迁移
– 使用Pipeline批量迁移
– 使用Redis迁移工具
– 手动迁移
## 5. 监控大Key
– 使用Redis自带命令监控
– 使用Prometheus监控
– 使用Grafana可视化
– 编写监控脚本
通过本文档的学习,您应该掌握了Redis大Key优化实战,能够在生产环境中检测和优化大Key,提高Redis的性能和稳定性。在实际应用中,需要根据具体业务场景和数据特点,选择合适的优化策略,确保Redis的高效使用。
风哥提示:Redis大Key是Redis使用中的常见问题,合理的大Key优化可以提高Redis的性能和稳定性。在实际应用中,需要根据具体业务场景和数据特点,选择合适的优化策略。
from Redis视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
