Redis 缓存使用的BigKey问题

一、什么是 BigKey?

BigKey 指在 Redis 中存储的 单个 Key 对应的 Value 过大,通常表现为:

  • String 类型:Value 长度 > 10KB。
  • Hash/List/Set/ZSet:元素数量 > 5,000 或总大小 > 10MB。

二、BigKey 的危害

问题 影响
内存不均 导致集群节点内存倾斜,可能触发 OOM。
阻塞请求 单线程模型下,操作 BigKey 耗时高,阻塞其他命令(如 DEL 大 Key 卡顿)。
网络拥塞 大 Value 传输占用带宽,影响其他请求延迟。
持久化故障 AOF/RDB 保存大 Key 时耗时剧增,甚至失败。

三、如何发现 BigKey?

1. 使用 Redis 内置命令 redis-cli --bigkeys
bash 复制代码
# 扫描 BigKey(Redis 4.0+)
redis-cli --bigkeys

# 输出示例(汇总每种数据类型的最大 Key)
[00.00%] Biggest string found so far 'user' with 10240 bytes
[00.00%] Biggest hash   found so far 'product' with 5000 fields

缺点:只能返回每种类型的最大 Key,无法全面扫描。

2. 使用 Redis 内置命令 MEMORY USAGE
bash 复制代码
# 查看指定 Key 的内存占用(Redis 4.0+)
MEMORY USAGE user

缺点:只能返回指定Key的信息。

3. 使用 Redis 内置命令 DEBUG OBJECT
bash 复制代码
# 查看指定 Key 信息
DEBUG OBJECT user

缺点:只能返回指定Key的信息。

3. 使用 Redis 内置命令 SCAN + MEMORY USAGEDEBUG OBJECT

使用sacn 命令扫描redis 中的key,结合 memory usagedebug object 判断key 值大小

bash 复制代码
SCAN 0 MATCH order:* COUNT 100 
HSCAN user:1000 0  # 遍历 Hash 的字段
SSCAN followers 0  # 遍历 Set 的成员
ZSCAN rankings 0   # 遍历 ZSet 的成员和分数

可循环定时执行scan命令遍历出bigKey

3. 使用第三方工具
  • rdb-tools :分析 RDB 文件,统计大 Key。

    bash 复制代码
    pip install rdbtools
    rdb --command memory dump.rdb --bytes 10240 --type string
  • RedisInsight:图形化工具直观查看内存分布。


四、BigKey 的解决方案

1. 拆分大 Key
  • String 类型 :拆分为多个子 Key。

    bash 复制代码
    # 原始 Key
    SET user:1000:profile "超大JSON数据..."
    # 拆分为
    SET user:1000:profile:part1 "JSON片段1"
    SET user:1000:profile:part2 "JSON片段2"
  • Hash/List/Set/ZSet :按字段或范围分片。

    bash 复制代码
    # 原始 Hash
    HSET product:999:details name "手机" price 5000 ... (5000个字段)
    # 拆分为
    HSET product:999:details:1 name "手机" price 5000
    HSET product:999:details:2 field1001 "value1001" ...
2. 使用合适的数据结构
  • 替代方案

    场景 错误用法 优化方案
    存储用户标签 SET 存储 JSON 列表 改用 SETZSET
    频繁更新的计数器 String + INCR 改用 HASH 分片存储
3. 客户端缓存
  • 对热点 BigKey 使用本地缓存(如 Caffeine),减少 Redis 访问。
相关推荐
老华带你飞7 分钟前
旅游|基于Java旅游信息系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·旅游
释怀°Believe11 分钟前
javaweb
数据库·sql·oracle
Clarence Liu13 分钟前
redis学习 (1) 基础入门
数据库·redis·学习
天生励志12328 分钟前
Redis 安装部署
数据库·redis·缓存
北半球的夜29 分钟前
emoji 表情符号保存问题
数据库·oracle
清风6666661 小时前
基于单片机的智能家居多参数环境监测与联动报警系统设计
数据库·单片机·毕业设计·智能家居·课程设计·期末大作业
煎蛋学姐1 小时前
SSM社区医院儿童预防接种管理系统84ui9(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·儿童预防接种
锡兰_CC1 小时前
无缝触达,卓越体验:开启openEuler世界的任意门
服务器·网络·数据库·c++·图像处理·qt·nginx
ttthe_MOon2 小时前
MySQL 高可用解决方案 MHA:原理、配置与实践
数据库·mysql
一 乐2 小时前
高校评教|基于SpringBoot+vue高校学生评教系统 (源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习