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使用内存的操作交给子线程单独处理 ,这种方式是异步的,从而可以避免阻塞主线程。
相关推荐
jiayou642 小时前
KingbaseES 实战:审计追踪配置与运维实践
数据库
NineData14 小时前
NineData 迁移评估功能正式上线
数据库·dba
雨中飘荡的记忆18 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
NineData19 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师21 小时前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
全栈老石1 天前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
曲幽1 天前
FastAPI分布式系统实战:拆解分布式系统中常见问题及解决方案
redis·python·fastapi·web·httpx·lock·asyncio
倔强的石头_2 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou643 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤4 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库