1. 首页 > Redis教程 > 正文

Redis教程FG029-Redis大Key优化实战

本文档风哥主要介绍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检测

# 大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
  • 监控预警:设置大Key监控和预警机制
  • 业务优化:从业务层面优化数据存储方式

2.2 大Key优化策略

# 大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迁移

# 大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检测实施

# 大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优化实施

# 大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监控

# 大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故障排查

# 大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优化

# 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优化

# 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优化

# 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优化

# 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优化

# 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 优化技巧

风哥提示:Redis大Key是Redis使用中的常见问题,合理的大Key优化可以提高Redis的性能和稳定性。在实际应用中,需要根据具体业务场景和数据特点,选择合适的优化策略。

# 优化技巧

## 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

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息