一、big key
大Key通常都会以数据大小与成员数量来判定
一个STRING类型的Key,它的值为5MB(数据过大)
一个LIST类型的Key,它的列表数量为20000个(列表数量过多)
一个ZSET类型的Key,它的成员数量为10000个(成员数量过多)
一个HASH格式的Key,它的成员数量虽然只有1000个但这些成员的value总大小为100MB(成员体积过大)
1、大key引发的问题
1、存储引发OOM:Redis内存不断变大引发OOM
2、存储:分布不均衡:Redis Cluster中的某个node内存远超其余node,无法将node上的内存均衡化
3、查询占带宽:大Key上的读请求使Redis占用服务器全部带宽
4、删除时阻塞:删除一个大Key造成主库较长时间的阻塞
2、找出大key
1、通过Redis官方客户端redis-cli的big keys参数发现大Key
2、Memory Usage:命令来帮助分析Key的内存占用,相对debug object命令,它的执行代价更低仍有阻塞风险。
3、Redis对于不同的数据结构提供了不同的命令来返回其长度或成员数量,如下图
4、redis-rdb-tools工具以定制化方式找出大Key
3、解决方案
1、存-对大Key进行拆分:HASH Key拆分为多个HASH Key,确保每个Key的成员数量在合理范围
2、删-对大Key进行清理:Redis自4.0起提供了unlink命令,该命令能够以非阻塞的方式缓慢逐步的清理传入的Key,
通过UNLINK,你可以安全的删除大Key甚至特大Key。
3、监控Redis的内存水位:通过[监控系统],比如普罗米修斯,并设置合理的Redis内存报警阈值来提醒我们此时可
能有大Key正在产生,如:Redis内存使用率超过70%,Redis内存1小时内增长率超过20%等。
二、hotkey
热Key则以其接收到的请求频率,请求次数来判定,比如:Redis实例的每秒总访问量为10000,而其中一个Key的每秒访问量达到了7000
1、带来的问题
1、查询-占用CPU:热Key占用大量的Redis CPU时间使其性能变差
2、查询-节点请求不均衡: Redis Cluster中Node流量不均衡造成Redis Cluster的分布式优势无法被Client利用
2、找出HotKey
1、通过Redis官方客户端redis-cli的hot keys参数发现热Key
2、通过业务层定位热Key
3、使用monitor命令:在紧急情况时找出热Key,能够打印真实的请求,缺点就是Redis的CPU、内存、网络资源均有一定的占用
3、处理方式
1、存储-多节点复制:在Redis Cluster结构中对热Key进行复制,因为分布的时候是通过Hash key来得到节点,
所以通过修改Key的值,来改变value的分布。
2、查询-使用读写分离架构:在使用读写分离架构时可以通过不断的【增加从节点】来降低每个Redis实例中的读请求压力
三、Tair
大key
删-使用阿里云的Tair(Redis企业版)服务避开失效数据的清理工作
hotkey
使用阿里云Tair的QueryCache特性,其实就是类似于二级缓存,把缓存放在redis proxy层。
1、介绍
Tair(Tair缓存框架)是阿里巴巴开发的分布式缓存系统,它并不是直接基于Redis实现的。相反,Tair是一个独立的分布式缓存解决方案,具有自己的架构和特性。
虽然Tair和Redis都是分布式缓存系统,但它们是由不同的团队开发,采用了不同的设计和实现。Tair在设计上考虑了阿里巴巴业务的特点和需求,提供了一些针对大规模分布式环境的优化和功能。
2、过期算法:
TairHash使用高效的【Active Expire】算法,实现了在对响应时间几乎无影响的前提下,高效完成对field过期判断和删除的功能。此类高级功能的合理使用能够解放大量Redis的运维、故障处理工作并降低业务的代码复杂度,让运维将精力投入到其它更有价值的工作中,让研发有更多的时间来写更有价值的代码。
2、QueryCache是阿里云Tair(Redis企业版)服务的企业级特性之一,
Tair QueryCache原理
阿里云数据库Redis会根据高效的排序和统计算法识别出实例中存在的热点Key,开启该功能后,Proxy点会根据设定的规则【缓存】热点Key的请求和查询结果(仅缓存热点Key的查询结果,无需缓存整个Key),当在缓存有效时间内收到相同的请求时【Proxy会直接返回结果至客户端】,无需和后端的Redis分片执行交互。在提升读取速度的同时,降低了热点Key对数据分片的性能影响,避免发生请求倾斜。
至此,来自客户端的同样的请求无需再与Proxy后端的Redis进行交互而由Proxy直接返回数据,指向热Key的请求由一个Redis节点承担转为多个Proxy共同承担,能够大幅度降低Redis节点的热Key压力,同时Tair的QueryCache功能还提供了大量的命令来方便用户查看、管理,如通过querycache keys命令查看所有被缓存热Key,通过querycache listall获取所有已缓存的所有命令等。
Tair QueryCache智能化的热Key判定与缓存联动功同样能够降低运维及研发的工作负担。与传统的Redis同步中间件相比,阿里云Redis全球分布式缓存具有高可靠性、高吞吐低延迟、同步正确性高等特点。