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使用内存的操作交给子线程单独处理 ,这种方式是异步的,从而可以避免阻塞主线程。
相关推荐
兆。5 分钟前
LangChain向量数据库集成指南:面向RAG开发者
数据库·langchain
小小工匠9 分钟前
Redis - 实现分页 + 多条件模糊查询:一套完整可落地的组合方案
数据库·redis·缓存·分页·模糊查询
流星白龙37 分钟前
【MySQL高阶】13.其他存储引擎
android·数据库·mysql
薛定谔的悦39 分钟前
光伏-储能-负荷联合预测:给 EMS 装上“预知能力“
java·数据库·人工智能·python·储能
阿演41 分钟前
DataDjinn v0.1.6 更新:增加在线更新功能,Redis 数据源支持,表格预览和连接体验继续增强
数据库·redis·缓存·数据库连接工具
数据库小学妹42 分钟前
InnoDB内存架构解密:Buffer Pool与性能优化实战
数据库·经验分享·sql·性能优化·架构
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第89题】【Mysql篇】第19题:Hash 索引和 B+ 树索引的区别?它们在使用方面的区别?
java·数据库·mysql·面试·哈希算法
一只fish1 小时前
Oracle官方文档翻译《Database Concepts 26ai》第17章-内存架构
数据库·oracle
比企谷八幡1 小时前
一张表在磁盘上长什么样:Heap File 入门
数据库·oracle
流星白龙1 小时前
【MySQL高阶】11.InnoDB存储引擎
数据库·mysql