Redis大key有什么危害?如何排查和处理?( 二 )


数据结构命令复杂度结果(对应 key)StringSTRLENO(1)字符串值的长度HashHLENO(1)哈希表中字段的数量ListLLENO(1)列表元素数量SetSCARDO(1)集合元素数量Sorted SetZCARDO(1)有序集合的元素数量
对于集合类型还可以使用 MEMORY USAGE 命令(Redis 4.0+) , 这个命令会返回键值对占用的内存空间 。
3、借助开源工具分析 RDB 文件 。
通过分析 RDB 文件来找出 big key 。这种方案的前提是你的 Redis 采用的是 RDB 持久化 。
【Redis大key有什么危害?如何排查和处理?】网上有现成的代码/工具可以直接拿来使用:

  • redis-rdb-tools[2]:Python/ target=_blank class=infotextkey>Python 语言写的用来分析 Redis 的 RDB 快照文件用的工具
  • rdb_bigkeys[3] : Go 语言写的用来分析 Redis 的 RDB 快照文件用的工具,性能更好 。
4、借助公有云的 Redis 分析服务 。
如果你用的是公有云的 Redis 服务的话,可以看看其是否提供了 key 分析功能(一般都提供了) 。
这里以阿里云 Redis 为例说明 , 它支持 bigkey 实时分析、发现,文档地址:https://www.alibabacloud.com/help/zh/apsaradb-for-redis/latest/use-the-real-time-key-statistics-feature。
Redis大key有什么危害?如何排查和处理?

文章插图
阿里云Key分析
如何处理 bigkey?bigkey 的常见处理以及优化办法如下(这些方法可以配合起来使用):
  • 分割 bigkey:将一个 bigkey 分割为多个小 key 。例如,将一个含有上万字段数量的 Hash 按照一定策略(比如二次哈希)拆分为多个 Hash 。
  • 手动清理:Redis 4.0+ 可以使用 UNLINK 命令来异步删除一个或多个指定的 key 。Redis 4.0 以下可以考虑使用 SCAN 命令结合 DEL 命令来分批次删除 。
  • 采用合适的数据结构:例如,文件二进制数据不使用 String 保存、使用 HyperLogLog 统计页面 UV、Bitmap 保存状态信息(0/1) 。
  • 开启 lazy-free(惰性删除/延迟释放) :lazy-free 特性是 Redis 4.0 开始引入的,指的是让 Redis 采用异步方式延迟释放 key 使用的内存,将该操作交给单独的子线程处理 , 避免阻塞主线程 。




推荐阅读