定义
名词 定义 大Key
容量比较大的。String类型,单个Key对应的大小大于10KB。其他集合类型的Key,所有成员总大小大于1MB的
Key的元素较多。一般定义集合类型的Key中元素超过3000个,则认为其为大Key
热Key
一个Key被操作的频率和资源占用多少来判定其是否为热Key
访问频率高:比如总QPS(每秒查询率)为5,000,而其中一个Key的每秒访问量达到了3,000
带宽使用率高:某个Key大小可能占了1MB,每秒内频繁去查询, 占用了网络的大部分带宽
大Key和热Key引发的问题
场景 问题 大Key 客户端执行命令的时长变慢 Redis内存达到maxmemory参数定义的内存使用上限,导致操作阻塞或重要的Key被逐出,更可能引发OOM导致被操作系统杀死 对大Key频繁执行读请求,会占用大量网络带宽,导致服务变慢,同时易影响其他使用的服务 对大Key执行修改或删除,可能造成主库较长时间的阻塞,进而可能引发同步中断或主从切换 对集群版或CLUSTER版实例,容易造成内存使用不均 热Key 占用大量的CPU资源,影响其他请求响应,导致整体性能降低 对集群版或CLUSTER版实例,容易造成分片压力分配不均的情况。会导致单个分片成为性能瓶颈点 容易造成缓存击穿。可能超出缓存的承受能力,缓存处理不过来。大量业务请求可能直接访问后端数据库,数据库承受不了大量请求访问可能导致服务不可用,严重影响业务
大Key和热Key产生的原因
未正确使用Redis、业务规划不足、无效数据的堆积、访问量突增等都会产生大Key与热Key,如:
大Key:
- 在不适用使用Redis,Key对应的value过大,如使用String类型的Key存放大体积二进制文件型数据;
- 没有对Key中的成员进行合理的拆分,造成个别Key中的成员数量过多。
- 未定期清理无效数据,造成如LIST、HASH等集合类型Key中的成员持续不断地增加;
热Key:
- 业务安排的不合理,没有对Key进行合理的拆分,业务都集中访问同一个Key。
- 预期外的访问量陡增,如访问量暴涨的热点新闻等。
如何发现大Key和热Key
方法 说明 大Key和热Key功能分析 参考文档:大Key和热Key分析 通过redis-cli的bigkeys和hotkeys参数查找大Key和热Key Redis-cli提供了bigkeys参数,能够使redis-cli以遍历的方式分析Redis实例中的所有Key,并返回Key的整体统计信息与每个数据类型中Top1的大Key,bigkeys仅能分析并输入六种数据类型(STRING、LIST、HASH、SET、ZSET、STREAM),命令示例为:redis-cli -h <实例的连接地址> -p <端口> -a <密码> --bigkeys。 自Redis 4.0版本起,redis-cli提供了hotkeys参数,可以快速帮您找出业务中的热Key,该命令需要在业务实际运行期间执行,以统计运行期间的热Key。命令示例为:redis-cli -h <实例的连接地址> -p <端口> -a <密码> --hotkeys。热Key的详情可以在结果中的summary部分获取到。 通过Redis内置命令对目标Key进行分析 对不同数据类型的目标Key,分别通过如下风险较低的命令进行分析,来判断目标Key是否符合大Key判定标准。
STRING类型:执行STRLEN命令,返回对应Key的value的字节数。
LIST类型:执行LLEN命令,返回对应Key的列表长度。
HASH类型:执行HLEN命令,返回对应Key的成员数量。
SET类型:执行SCARD命令,返回对应Key的成员数量。
ZSET类型:执行ZCARD命令,返回对应Key的成员数量。
STREAM类型:执行XLEN命令,返回对应Key的成员数量。
通过业务层定位热Key 通过在业务层增加相应的代码对Redis的访问进行记录并异步汇总分析。
如何处理大Key和热Key
场景 方法 说明 大Key 对大Key进行拆分 例如将含有数万成员的一个HASH Key拆分为多个HASH Key,并确保每个Key的成员数量在合理范围。在Redis集群架构中,拆分大Key能对数据分片间的内存平衡起到显著作用 对大Key进行清理 将不适合Redis的数据存至其它存储,并在Redis中删除此类数据 对过期数据进行定期清理 堆积大量过期数据会造成大Key的产生,例如LIST或HASH类型数据都以增量的方式写入数据,而忽略数据的有效性和时效性。可以定时清理这些过期失效数据。
可配合缓存分析功能使用热Key 使用客户端本地缓存 设计客户端(本地)和Redis的两级缓存架构。热点数据优先从本地缓存获取。对于一些不频繁修改的数据,可优先使用本地缓存 Redis集群架构中对热Key进行复 集群架构中,可以将对应热Key进行复制并迁移至其他数据分片,例如将热Key 复制出3个内容完全一样的Key,将这三个Key迁移到其他数据分片来解决单个数据分片的热Key压力