Redis
Redis 中的大 key 一直是重点需要优化的对象,big key 既占用比较多的内存,也可能占用比较多的网卡资源,造成 Redis 阻塞,因此需要找到这些 big key 进行优化。

1、redis-rdb-tools工具

在 redis 实例上执行 bgsave,然后对 dump 出来的 rdb文件进行分析,找到其中的大 key。
https://github.com/sripathikrishnan/redis-rdb-tools
rdbtools 工 具包括了3个可执行文件:

  • rdb 解析整个rdb文件
  • redis-memory-for-key 解析server里的单个key
  • redis-profiler 解析rdb文件成html格式

源码安装redis-rdb-tools

  1. git clone https://github.com/sripathikrishnan/redis-rdb-tools
  2. cd redis-rdb-tools
  3. python setup.py install

安装 python-lzf,加快解析速度

  1. pip install python-lzf

推荐 PyPI 安装方式

  1. pip install rdbtools python-lzf

2、redis-cli --bigkeys 命令

可以找到某个实例5种数据类型 String、hash、list、set、zset 的最大key

  1. [redis@olive bin]$ ./redis-cli -h 127.0.0.1 -p 6379 --bigkeys
  2. # Scanning the entire keyspace to find biggest keys as well as
  3. # average sizes per key type. You can use -i 0.1 to sleep 0.1 sec
  4. # per 100 SCAN commands (not usually needed).
  5. [00.00%] Biggest string found so far 'artisan43206' with 12 bytes
  6. [37.40%] Biggest string found so far 'artisanBIG' with 26890 bytes
  7. -------- summary -------
  8. Sampled 100004 keys in the keyspace!
  9. Total key length in bytes is 1188921 (avg len 11.89)
  10. Biggest string found 'artisanBIG' has 26890 bytes
  11. 100004 strings with 1215805 bytes (100.00% of keys, avg size 12.16)
  12. 0 lists with 0 items (00.00% of keys, avg size 0.00)
  13. 0 sets with 0 members (00.00% of keys, avg size 0.00)
  14. 0 hashs with 0 fields (00.00% of keys, avg size 0.00)
  15. 0 zsets with 0 members (00.00% of keys, avg size 0.00)
  16. 0 streams with 0 entries (00.00% of keys, avg size 0.00)
  17. [redis@olive bin]$
  • 该命令使用 scan 方式对 key 进行统计,所以使用时无需担心对 redis 造成阻塞。
  • 输出大概分为两部分,summary 之上的部分,只是显示了扫描的过程。summary 部分给出了每种数据结构中最大的Key。
  • 统计出的最大 key 只有 string 类型是以字节长度为衡量标准的。list、set、zset 等都是以元素个数作为衡量标准,不能说明其占的内存就一定多。所以,如果存储的Key 主要以 string 类型存在,这种方法就比较适合。

    3、自定义扫描脚本

    以 Python 脚本居多,使用方式与 redis-cli --bigkeys类似。

    4、debug object key 命令

    可以查看某个 key 序列化后的长度,每次只能查找单个 key 的信息。不推荐使用该方式。

    5、memory usage 命令

    Redis 4.0 引入了 memory usage 命令和 lazyfree 机制。不管是对 big key 的发现,还是解决 big key 删除或者过期造成的阻塞问题都有明显的提升。
    memory usage 使用非常简单,直接按 memory usage key名字;如果当前key 存在,则返回 key 的 value 实际使用内存估算值;如果 key 不存在,则返回 nil。