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使用内存的操作交给子线程单独处理 ,这种方式是异步的,从而可以避免阻塞主线程。
相关推荐
尘浮生2 分钟前
Java项目实战II基于Java+Spring Boot+MySQL的社区帮扶对象管理系统的设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·mysql·微信小程序·小程序
孤傲小二~阿沐40 分钟前
PostgreSQL的学习心得和知识总结(一百六十三)|深入理解PostgreSQL数据库之 GUC参数compute_query_id 的使用和实现
数据库·postgresql
master-dragon2 小时前
实际项目中的一个OOM和事务的问题
数据库
暂时先用这个名字2 小时前
PHP开发日志 ━━ 基础知识:四种不同的变量返回方式该如何调用
android·开发语言·缓存·php·框架·变量·数组
猿小猴子2 小时前
Python3 爬虫 Scrapy 与 Redis
redis·爬虫·scrapy
虎哥和你一起学编程2 小时前
redis stream轻量级消息队列
java·redis·github
SEO-狼术3 小时前
Design interfaces that prioritize Crack
数据库
04Koi.3 小时前
Redis--高并发分布式结构
数据库·redis·分布式
TravisBytes4 小时前
Redis 发布/订阅模式与消息队列
java·linux·c++·redis·缓存·bootstrap