Redis缓存使用的BigKey问题解决

 更新时间:2025年05月26日 10:01:49   作者:王军新  
BigKey在Redis中存储的单个Key对应的Value过大,本文主要介绍了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

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

# 查看指定 Key 的内存占用(Redis 4.0+)
MEMORY USAGE user

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

3. 使用 Redis 内置命令 DEBUG OBJECT

# 查看指定 Key 信息
DEBUG OBJECT user

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

4. 使用 Redis 内置命令 SCAN + MEMORY USAGE 或 DEBUG OBJECT

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

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

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

5. 使用第三方工具

rdb-tools:分析 RDB 文件,统计大 Key。

pip install rdbtools
rdb --command memory dump.rdb --bytes 10240 --type string

RedisInsight:图形化工具直观查看内存分布。

四、BigKey 的解决方案

1. 拆分大 Key

String 类型:拆分为多个子 Key。

# 原始 Key
SET user:1000:profile "超大JSON数据..."
# 拆分为
SET user:1000:profile:part1 "JSON片段1"
SET user:1000:profile:part2 "JSON片段2"

Hash/List/Set/ZSet:按字段或范围分片。

# 原始 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 列表改用 SET 或 ZSET
频繁更新的计数器String + INCR改用 HASH 分片存储

3. 客户端缓存

  • 对热点 BigKey 使用本地缓存(如 Caffeine),减少 Redis 访问。

到此这篇关于Redis缓存使用的BigKey问题解决的文章就介绍到这了,更多相关Redis BigKey问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Redis中Lua脚本的使用场景示例分析

    Redis中Lua脚本的使用场景示例分析

    通过使用Lua脚本,可以在Redis中实现复杂逻辑和原子操作,如原子计数、条件更新、事务性操作、分布式锁、批量处理、计数器与过期管理、条件删除、数据聚合等,本文介绍了Redis中Lua脚本的几种常见使用场景及其Java实现示例,为开发者提供了一个参考
    2024-11-11
  • redis7.4.2单机配置过程

    redis7.4.2单机配置过程

    这段文章详细介绍了通过源码编译安装Redis的过程,涵盖了从下载源码包到卸载Redis的每一步骤,并强调了实践中的实用性和重要性性,关键词包括:源码编译、Redis安装和卸载流程
    2026-05-05
  • 为Redis设置密码的三种方法

    为Redis设置密码的三种方法

    Redis 是一个高性能的键值对数据库,广泛应用于缓存、消息队列等场景,为了保障 Redis 服务的安全性,设置密码认证是非常重要的一步,所以本文给大家介绍了为Redis设置密码的三种方法,需要的朋友可以参考下
    2024-11-11
  • redis基本安装判断、启动使用方法示例

    redis基本安装判断、启动使用方法示例

    这篇文章主要介绍了redis基本安装判断、启动使用方法,结合实例形式分析了Redis针对是否安装的判断、启动等使用方法,需要的朋友可以参考下
    2020-02-02
  • Redis的主从同步解析

    Redis的主从同步解析

    这篇文章主要介绍了Redis的主从同步解析,见识浅薄,仅供参考。
    2017-10-10
  • Redis高效检索地理位置的原理解析

    Redis高效检索地理位置的原理解析

    这篇文章主要介绍了Redis是如何高效检索地理位置,通过geo相关的命令,可以很容易在redis中存储和使用经纬度坐标信息,具体实现方法跟随小编一起看看吧
    2021-06-06
  • redis缓存预热的实现示例

    redis缓存预热的实现示例

    本文主要介绍了Java中实现缓存预热的多种策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • Redis中的数据结构跳表详解

    Redis中的数据结构跳表详解

    跳表是一种基于并联的链表结构,用于在有序元素序列中快速查找元素的数据结构,本文给大家介绍Redis中的数据结构跳表,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • redis底层数据结构之skiplist实现示例

    redis底层数据结构之skiplist实现示例

    这篇文章主要为大家介绍了redis底层数据结构之skiplist实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Redis实现布隆过滤器缓存去重的"智能门卫"(实例详解)

    Redis实现布隆过滤器缓存去重的"智能门卫"(实例详解)

    布隆过滤器(Bloom Filter)本质是一个基于哈希函数的概率型数据结构,核心作用是快速判断一个元素是否存在于集合中,今天给大家介绍Redis实现布隆过滤器缓存去重的"智能门卫",感兴趣的朋友跟随小编一起看看吧
    2026-02-02

最新评论