Redis中的Big key排查和解决思路

Big key的定义

通常以Key的大小和Key中成员的数量来综合判定,例如:

Key本身的数据量过大:一个String类型的Key,它的值为5 MB。

Key中的成员数过多:一个List、Set、Zset类型的Key,它的成员数量为10,000个。

Key中成员的数据量过大:一个Hash类型的Key,它的成员数量虽然只有2,000个但这些成员的Value(值)总大小为100 MB。

Big key产生的原因

  1. 规划设计不足,如使用String类型的Key存放较大体积二进制文件型数据;
  2. 因业务上线前考虑不周,没有对Key中的成员进行合理的拆分,造成个别Key中的成员数量过多;
  3. 未及时清理无效数据,造成如HASH类型Key中的成员快速增加
  4. 使用LIST类型Key的业务消费侧发生代码故障,造成对应Key的成员持续增加

Big key的影响

  1. 客户端超时阻塞:由于 Redis 执行命令是单线程处理,然后在操作大 key 时会比较耗时,那么就会阻塞 Redis,从客户端这一视角看,就是很久很久都没有响应。
  2. 网络阻塞:每次获取大 key 产生的网络流量较大,如果一个 key 的大小是 1 MB,每秒访问量为 1000,那么每秒会产生 1000MB 的流量,这对于普通千兆网卡的服务器来说是灾难性的。
  3. 工作线程阻塞:如果使用 del 删除大 key 时,会阻塞工作线程,这样就没办法处理后续的命令。
  4. 实例的内存达到maxmemory参数定义的上限引发操作阻塞或重要的Key被逐出,甚至引发内存溢出(Out Of Memory)。
  5. 集群架构下,某个数据分片的内存使用率远超其他数据分片,无法使数据分片的内存资源达到均衡。

快速找出Big key

  1. 使用redis-cli自带的bigkeys命令:这种方式只能找出每种数据结构 top 1 bigkey
  2. 使用 Redis 自带的 SCAN 命令:SCAN 命令可以按照一定的模式和数量返回匹配的 key。获取了 key 之后,可以利用 STRLEN、HLEN、LLEN等命令返回其长度或成员数量。
  3. 使用redis-rdb-tools工具可以找出大Key

如何优化Big key

  1. 对大Key进行拆分:可以将一个大key拆分为多个小key。例如:把上百万个成员的Hash key拆分为多个小的Hash key,并保证每个小的Hash key的成员数据都在合理范围内
  2. 对大Key进行清理:Redis4.0及之后版本,可以使用 UNLINK 命令来异步删除一个或多个指定的 key。Redis4.0之前的版本,可以考虑使用 SCAN 命令 、 DEL 命令来分批次删除。
  3. 开启 lazy-free:lazy-free是Redis4.0版本才开始引入的,它会把释放key使用内存的操作交给子线程单独处理 ,这种方式是异步的,从而可以避免阻塞主线程。
相关推荐
星云API|微信接口开发几秒前
企业微信二次开发实战笔记:如何用在线调试快速验证接口功能
数据库·笔记·企业微信
隔窗听雨眠6 小时前
记一次SQL Server数据库性能分析:从CPU100%到单配置修复的完整诊断
开发语言·数据库·php
samson_www6 小时前
Oracle数据泵拷贝表空间
数据库·dba
呆萌很7 小时前
MySQL 8.4 LTS 完整安装教程
数据库·mysql
天空'之城7 小时前
单片机基础核心知识点汇总(三十三)
数据库·单片机·嵌入式硬件
爱吃苹果的日记本9 小时前
数据结构第一课
c语言·数据结构·数据库·学习·c#
来让爷抱一个9 小时前
2026 语义缓存实战:把命中契约写进SPEC,MonkeyCode 云端跑通
人工智能·机器学习·缓存
hweiyu009 小时前
Redis命令:UNLINK
redis·缓存
张小姐的猫9 小时前
【AI大模型接入SDK】 —— Gemini接入封装
android·数据结构·数据库·c++·人工智能·python