如何发现 Redis 中的大 Key?

介绍 Redis 中检测大键的方法及其优缺点。

性能优化 中等 Redis 大数据 大键

在 Redis 环境中检测 bigkey(大 key)主要是为了防止内存膨胀、延迟增加等服务端性能瓶颈。Bigkey 通常定义为字符串类型的 value 超过 1MB,或哈希/列表/集合等容器类型元素数量过大(如 zset 成员 > 10,000 个)。以下是主要检测方法:

  1. 使用 redis-cli --bigkeys 命令
    • 这是官方提供的工具,扫描所有 key 并统计各数据类型中的 bigkey。
    • 优点
      • 在线运行,不阻塞 Redis 服务。
      • 输出格式直观:
        Database Type Key Size in bytes Encoding Num elements
        0 string bigstring 1048576 raw -
        Biggest zset found 'bigzset' with 100000 members
        
    • 缺点:只报告每类 Top1 bigkey 的尺寸/元素数量,信息不够全面。
    • 用法
      redis-cli -h host -p port --bigkeys
      
  2. 使用 SCAN 命令编写脚本扫描数据
    • 分步遍历所有 keys,并结合 STRLEN (String) 或 HLEN (Hash) 等命令判断 key 的大小。
    • 优点:精准控制处理逻辑,可捕获更多 bigkey。
    • 缺点:需自定义脚本实现,可能会因反复请求造成 CPU 开销偏高。
    • 示例脚本思路
      cursor = '0'
      while cursor != 0:
        cursor, keys = redis.scan(cursor, match='*')
        for key in keys:
          key_type = redis.type(key)
          if key_type == 'string':
             size = redis.strlen(key)
             if size > 1024000:  # String 超过 1MB
                print(f"Big string key: {key}, size: {size} bytes")
          # 类似地对其他数据类型处理:HLEN for hash, ZCARD for zset...
      
  3. 借助 RDB 文件剖析或第三方工具
    • 首先生成 RDB 备份:redis-cli BGSAVE,获得 dump.rdb 文件后,用开源工具如 redis-rdb-tools 分析:
      rdb dump.rdb --bigkeys
      
    • 优点:全局精确统计所有 keys 大小及内存占用情况,避开线上阻塞风险。
    • 缺点:需停止服务或不频繁生成 RDB 的快照。
  4. 不推荐:DEBUG OBJECT
    • 检测时调用 DEBUG OBJECT key_name 命令得到序列化长度 serializedlength 参数。
    • 高风险:属调试命令会完全阻塞 Redis 主线程的执行请求。仅限单次测试单 key 场景,避免在重要系统运行。

避免对性能的影响:

  • CPU 耗时工具(如 MEMORY USAGE 命令)慎用,尤其在频繁扫描高吞吐系统会陡增负荷。
  • 定时采用低代价途径如 SCAN 排查可减少对主线程的占用,也无需如集群式部署的复杂场景。