在使用Redis的过程中,如果未能及时发现并处理Big keys(下文称为“大Key”)与Hotkeys(下文称为“热Key”),可能会导致服务性能下降、用户体验变差,甚至引发大面积故障。本文将介绍大Key与热Key产生的原因、其可能引发的问题及如何快速找出大Key与热Key并将其优化的方案。
大Key和热Key的定义
名词 | 解释 |
---|---|
大Key |
通常以Key的大小和Key中成员的数量来综合判定,例如:
|
热Key |
通常以其接收到的Key被请求频率来判定,例如:
|
大Key和热Key引发的问题
类别 | 说明 |
---|---|
大Key |
|
热Key |
|
大Key和热Key产生的原因
未正确使用Redis、业务规划不足、无效数据的堆积、访问量突增等都会产生大Key与热Key,如:
-
大key
- 在不适用的场景下使用Redis,易造成Key的value过大,如使用String类型的Key存放大体积二进制文件型数据;
- 业务上线前规划设计不足,没有对Key中的成员进行合理的拆分,造成个别Key中的成员数量过多;
- 未定期清理无效数据,造成如HASH类型Key中的成员持续不断地增加;
- 使用LIST类型Key的业务消费侧发生代码故障,造成对应Key的成员只增不减。
-
热key
- 预期外的访问量陡增,如突然出现的爆款商品、访问量暴涨的热点新闻、直播间某主播搞活动带来的大量刷屏点赞、游戏中某区域发生多个工会之间的战斗涉及大量玩家等。
快速找出大Key和热Key
Redis提供多种方案帮助您轻松找出大Key与热Key。
方法 | 优缺点 | 说明 |
---|---|---|
实时Top Key统计 (推荐) |
|
可实时展示实例中的大Key和热Key信息,同时支持查看4天内大Key和热Key的历史信息。该功能可帮助您掌握Key在内存中的占用、Key的访问频次等信息,溯源分析问题,为您的优化操作提供数据支持。 |
离线全量Key分析 |
|
对Redis的RDB备份文件进行定制化的分析,帮助您发现实例中的大Key,掌握Key在内存中的占用和分布、Key过期时间等信息,为您的优化操作提供数据支持,帮助您避免因Key倾斜引发的内存不足、性能下降等问题。 |
通过redis-cli的 bigkeys 和 hotkeys 参数查找大Key和热Key |
|
Redis提供了
bigkeys
参数能够使redis-cli以遍历的方式分析Redis实例中的所有Key,并返回Key的整体统计信息与每个数据类型中Top1的大Key,
bigkeys
仅能分析并输入六种数据类型(STRING、LIST、HASH、SET、ZSET、STREAM),命令示例为
redis-cli -h r-***************.redis.rds.aliyuncs.com -a <password> --bigkeys
。
说明
若您只需要分析STRING类型的大key或是找出成员数量超过10个的HASH Key,则
bigkeys
参数无法直接实现该类需求。
同时,自Redis 4.0版本起提供了 hotkeys 参数,可以快速帮您找出业务中的热Key,具体操作,请参见 通过redis-cli的hotkeys参数查找热Key 。 |
通过Redis内置命令对目标Key进行分析 |
|
对不同数据类型的目标Key,分别通过如下风险较低的命令进行分析,来判断目标Key是否符合大Key判定标准。
说明
DEBUG OBJECT
与
MEMORY USAGE
命令在执行时需占用较多资源,且时间复杂度为O(N),有阻塞Redis实例的风险,不建议使用。
|
通过业务层定位热Key |
|
通过在业务层增加相应的代码对Redis的访问进行记录并异步汇总分析。 |
通过redis-rdb-tools工具以定制化方式找出大Key |
|
Redis-rdb-tools 是通过Python编写,支持定制化分析Redis RDB快照文件的开源工具。您可以根据您的精细化需求,全面地分析Redis实例中所有Key的内存占用情况,同时也支持灵活地分析查询。 |
通过 MONITOR 命令找出热Key |
|
Redis的
MONITOR
命令能够忠实地打印Redis中的所有请求,包括时间信息、Client信息、命令以及Key信息。
在发生紧急情况时,可以通过短暂执行 MONITOR 命令并将返回信息输入至文件,在关闭 MONITOR 命令后,对文件中请求进行归类分析,找出这段时间中的热Key。
说明
由于
MONITOR
命令对Redis实例性能消耗较大,非特殊情况不推荐使用
MONITOR
命令。
|
优化大Key与热Key
类别 | 处理方法 |
---|---|
大Key |
|
热Key |
|