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使用内存的操作交给子线程单独处理 ,这种方式是异步的,从而可以避免阻塞主线程。
相关推荐
南凉北往4 分钟前
PandasAI连接LLM对MySQL数据库进行数据分析
数据库·mysql·数据分析
回眸不遇9 分钟前
详谈 QT 布局 QLayout::SizeConstraint 和 QSizePolicy 对 QWidget 尺寸的影响
数据库·qt·系统架构
2601_9657984718 分钟前
MTDb Movie & TV Database Script Setup, Caching, and SEO Guide
linux·服务器·数据库·php
zdl68626 分钟前
EasyMarkets:“机器人商业化仍待验证”
数据库·机器人
Freak嵌入式44 分钟前
版本混乱 / 依赖缺失?uPyPi:MicroPython 版 PyPI,彻底解决库管理混乱
linux·服务器·数据库·单片机·嵌入式硬件·性能优化·依赖倒置原则
Elastic 中国社区官方博客1 小时前
Elastic 和 OpenAI 合作,将前沿智能引入非结构化企业数据
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai
云和恩墨1 小时前
数据库一体机zData X 3.6.0以“性能、成本、韧性、生态”强化数据库基础设施价值主张
数据库
灯澜忆梦1 小时前
【MySQL7】多表查询
数据库·sql
Qlittleboy1 小时前
tp5网站链接不上slqserver,计算机积极拒绝了链接
数据库·sql
行业研究员2 小时前
腾讯云数据库:团队知识统一检索实践
数据库·云计算·腾讯云·腾讯云数据库·团队知识