云计算百科
云计算领域专业知识百科平台

Redis 中的 Big Key 问题是什么?如何解决?

Redis BigKey大Key问题(面试结构化)

什么是BigKey

大Key指key对应的value体积过大或者元素数量过多。

  • String类型:value字符串很大,几十MB以上;
  • 集合类型 list/hash/set/zset:元素数量几十万、上百万。

注意:不是key的名字长,是存的数据大。

BigKey带来的危害

  • 命令执行阻塞主线程:删除大key、扩容hash、大量元素查询,是单线程操作,会阻塞Redis,造成其他请求超时。
  • 网络IO打满:读取大key,一次性传输大量数据,占满网卡,拖慢其他请求。
  • 主从复制压力大:传输大key,主从同步耗时变长,主从延迟飙升。
  • 集群槽迁移卡顿:做集群槽迁移时,迁移大key会阻塞迁移流程。
  • 内存分配抖动:删除大key,内存不会立刻还给操作系统,内存碎片变多。
  • 如何发现BigKey

  • redis‑cli –bigkeys:扫描统计大key,高峰期不要执行,会消耗CPU。
  • RDB离线分析:解析dump.rdb文件离线找出大key,不影响线上。
  • 业务监控:监控value大小、集合元素数量;客户端埋点上报。
  • 解决方案

    1. 拆分大key(最核心方案)

    • String大字符串:拆成多个小key,user:info:1000 → user:info:1000:0、user:info:1000:1,业务侧拼接。
    • Hash:把大hash拆分为多个小hash;
    • List/zset/set:分片拆分,把元素分散到多个集合key。

    集群环境下拆分同时还能解决热点key,流量分散到不同节点。

    2. 渐进式删除,不要直接del

    直接del一个几十万元素的大集合,会阻塞主线程。

    • 使用unlink:非阻塞删除,把内存回收放到后台线程执行(Redis4.0+支持,优先用unlink代替del)。
    • 集合类型:使用hscan、sscan、zscan分批迭代,循环批量删除元素,逐步清理,避免一次性操作。

    3. 业务层面改造,避免存大value

    • 不要把完整大对象、大json全部塞到Redis;把大的数据放数据库,Redis只存索引、高频字段。
    • 避免存储超大list,list适合队列,不要累积几十万条数据不清理。

    4. 控制集合上限

    业务代码限制集合最大元素数量,超过阈值就做归档,把旧数据落库,不在Redis一直堆。

    5. 优化网络

    大key不要一次性全量读取,使用hscan、zrange分批读取,不要一次性把全部数据拉到应用。

    面试区分:BigKey vs HotKey

    • BigKey:数据体积大,操作耗时、网络压力大;访问量不一定高。
    • HotKey:访问QPS极高,数据不一定大;流量集中在某个key。

    两者可以同时出现:既是大key又是热点key,故障会被放大。

    总结

  • BigKey是value过大或集合元素过多;危害:阻塞主线程、网络IO高、主从延迟、内存碎片。
  • 排查优先离线分析,不建议高峰期执行–bigkeys。
  • 优先业务拆分大key;删除用unlink,集合用scan分批删除。
  • 集合数据分批读取,不在Redis堆积海量历史数据。
  • 注意区分大key和热点key,二者问题不一样。
  • 赞(0)
    未经允许不得转载:网硕互联帮助中心 » Redis 中的 Big Key 问题是什么?如何解决?
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!