目录
1、什么是Redis大Key
2、大 Key 是怎么产生的
3、大 Key 导致的问题
4、如何快速找到 Redis 大 Key
5、大 Key 优化策略
6、总结
我们在使用 Redis 的过程中,如果未能及时发现并处理 Big keys
(下文称为“大Key
”),可能会导致服务性能下降、用户体验变差,严重的甚至会引发大面积故障。本文将介绍大Key
产生的原因、其可能引发的问题及如何快速找出大Key
并将其优化的方案。
1、什么是Redis大Key
在 Redis 中,大 Key 是指在 Redis 中存储的单个键值对所占的空间过大,对于大 Key 也没有严格的定义区分,但通常满足以下条件的 Key 会被视为大 Key
2、大 Key 是怎么产生的
大 Key 通常是由于下面这些原因产生的:
- 程序设计不当,比如直接使用 String 类型存储较大的文件对应的二进制数据。
- 对于业务的数据规模考虑不周到,比如使用集合类型的时候没有考虑到数据量的快速增长。
- 未及时清理垃圾数据,比如哈希中冗余了大量的无用键值对。
3、大 Key 导致的问题
当 Redis 中时出现大 Key问题时,可能会对性能和内存使用产生负面影响,影响的方面包括:
- 由于 Redis 执行命令是单线程处理,然后在操作大 key 时会比较耗时,那么就会阻塞 Redis,从客户端这一视角看,就是很久很久都没有响应。
- 每次获取大 key 产生的网络流量较大,如果一个 key 的大小是 1 MB,每秒访问量为 1000,那么每秒会产生 1000MB 的流量,这对于普通千兆网卡的服务器来说是灾难性的。
- 如果使用 del 删除大 key 时,会阻塞工作线程,这样就没办法处理后续的命令。
- 集群架构下,某个数据分片的内存使用率远超其他数据分片,无法使数据分片的内存资源达到均衡。
4、如何快速找到 Redis 大 Key
如果我们想要快速的找出 Redis
中的大 Key,可以使用 Redis
的命令和工具进行扫描和分析。以下是一些方法:
- 使用 Redis 自带的 --bigkeys 参数来查找,这个命令会以遍历的方式分析 Redis 实例中的所有 Key,并返回整体统计信息与每个数据类型中 Top1 的大 Key。
- 使用 Redis 自带的 SCAN 命令,这个命令会以遍历的方式分析 Redis 实例中的所有 Key,并返回整体统计信息与每个数据类型中 Top1 的大 Key。
- 借助开源工具分析 RDB 文件,比如 redis-rdb-tools、rdb_bigkeys 等。
- 借助公有云的 Redis 分析服务,比如阿里云、腾讯云等。
5、大 Key 优化策略
如果 Redis 出现了大 Key 的问题,我们找到了这个大 Key 后应该如何处理呢?常见处理以及优化办法如下:
- 分割 bigkey:将一个 bigkey 分割为多个小 key。例如,将一个含有上万字段数量的 Hash 按照一定策略(比如二次哈希)拆分为多个 Hash。
- 手动清理:Redis 4.0+ 可以使用
UNLINK
命令来异步删除一个或多个指定的 key。Redis 4.0 以下可以考虑使用SCAN
命令结合DEL
命令来分批次删除。 - 采用合适的数据结构:例如,文件二进制数据不使用 String 保存、使用 HyperLogLog 统计页面 UV、Bitmap 保存状态信息。
- 开启 lazy-free(惰性删除/延迟释放) :lazy-free 特性是 Redis 4.0 开始引入的,指的是让 Redis 采用异步方式延迟释放 key 使用的内存,将该操作交给单独的子线程处理,避免阻塞主线程。
6、总结
本文介绍了 Redis 中大 Key 的定义及其可能引发的问题,并提供了快速定位大Key的方法以及优化方案。通过合理的优化措施,我们可以有效提升 Redis 的性能,改善用户体验。