分布式缓存Redis

大Key/热Key分析/过期Key扫描

2024-05-22 09:17:07

什么是大Key/Key?

key和热key的定义

名词

定义

key

Redis中存储的value可以分为两类,一类是String类型的元素,一类是集合元素,根据这两类,通过大key可分为以下两种情况:* String类型的value,值超过1 MB* 集合类型的value,成员数超过3000

key

key通常以其被访问的请求频率来判定,当每秒请求数超过3000时,被判定为热key;

存在大Key/Key,有什么影响?

类别

影响

key

* 客户端查询大key时,执行命令的时长变慢;* 集群规格实例,存在大key会使得某个分片的内存占用远超于其他分片,导致内存资源利用不均衡;* 若存在对大key的高频率请求,会导致redis实例出方向带宽被打满,导致流控,从而影响本身业务其他使用到redis的业务;* key占用过高,使得Redis内存使用达到上限,导致重要的Key被逐出,甚至引发内存溢出。

key

* 占用cpu资源,影响其他请求,导致整体性能降低;* 易造成缓存击穿,即当热Key的请求数超出Redis的承受能力时,大量请求将直接访问后端数据库,导致数据库压力激增甚至宕机,从而影响其他业务;* 集群规格实例下,某个分片存在热key,会导致当前分片的请求压力增加,易产生单分片性能瓶颈;

为了减少大Key和热Key过大,有什么使用建议?

类别

建议

key

* 对于String类型的value,其值大小尽量控制在1MB以内;* 集合类型的value,其成员数尽量不超过3000* 使用合适的数据结构,例如对于复杂的数据结构,如果JSON,可以考虑拆分分多个小的key* key合理设置过期时间

key

* 客户端使用本地缓存,对于热点key,优先从本地获取,分担redis的请求压力;

如何分析Redis 3.0实例的热Key

由于Redis 3.0本身不提供热Key能力

方法

说明

通过业务层定位热Key

通过在业务层增加相应的代码对Redis的访问进行记录并异步汇总分析。* 优点:在业务层能够快速定位热key* 缺点:需要熟悉了解当前业务系统逻辑

通过MONITOR命令

MONITOR命令用于实时监控客户端与Redis服务器之间的请求,通过MONITOR命令与重定向符号结合使用,将监视到的命令记录到日志文件中,通过分析日志文件的请求记录来找出热key;* 优点:简单易操作* 缺点:MONITOR命令会持续输出所有处理的命令,这会对Redis服务器的性能产生影响,生产环境要慎用MONITOR命令

如何提前发现大Key和热Key

方法

说明

使用CT-DCS自带的分析工具

请参考TOP KEY分析和离线全量KEY分析

 

 

 

 

通过redis-clibigkeyshotkeys参数查找大Key和热Key

 

 

 

* 查询大key: Redis-cli提供了—bigkeys参数,通过遍历的方式分析实例中的所有Key,并返回Key的整体统计信息与每个数据类型(STRINGLISTHASHSETZSETSTREAM)中最大的Key,查询大key的命令示例:redis-cli -h <实例的连接地址> -p <端口> -a <密码> --bigkeys

* 查询热key: Redis 4.0版本起,redis-cli工具提供了—hotkeys参数,能够快速定位业务中的热Key,该命令需要在业务实际运行期间执行,以统计运行期间的热Key。查询热key命令示例:redis-cli -h <实例的连接地址> -p <端口> -a <密码> --hotkeys。热Key的详情可以在输出结果中的summary部分获取到。

 

 

 

通过Redis内置命令对目标Key进行分析

 

对不同数据类型的目标Key,分别通过如下风险较低的命令进行分析,来判断目标Key是否符合大Key判定标准。STRING类型:执行STRLEN命令,返回对应Keyvalue的字节数。LIST类型:执行LLEN命令,返回对应Key的列表长度。HASH类型:执行HLEN命令,返回对应Key的成员数量。SET类型:执行SCARD命令,返回对应Key的成员数量。ZSET类型:执行ZCARD命令,返回对应Key的成员数量。STREAM类型:执行XLEN命令,返回对应Key的成员数量。

通过业务层定位热Key

通过在业务层增加相应的代码对Redis的访问进行记录并异步汇总分析。

DCS删除过期key

过期key的删除机制在Redis中主要有两种策略:

1、惰性删除:在执行读写命令前,Redis会检查key是否过期。若过期,则立即删除该key,并返回key不存在的结果;若未过期,则继续执行原命令。

2、定期删除:Redis通过定时任务实现定期删除过期key。该任务以一定频率运行,每次随机选取一定数量的key进行检查,并删除其中的过期key

这两种策略结合使用,确保了Redis中过期数据的及时清理,从而优化了缓存性能。

如何查询过期key

通过TTL key_name命令查询该key_name的过期时间;

如果输出结果为-1,则表示该key无失效时间,永久保存;

如果输出结果为-2,则表示该key已经过期或者已经被删除;

如果输出结果为>=0的正数,则表示该key的过期时间;

DCS控制台提供了删除过期key功能,支持立即删除和定期删除,详情请参考过期key删除;

Key的保存时间是多久?如何设置Key的过期时间?

Key的保存时间是多久?

如果不对key过期设置过期时间,数据会一直保存;

如果对key设置了过期时间,则数据保存时间为所设置的时间。当key达到过期时间时,该key将不可访问;

通过ttl命令可以查询key的过期时间,具体使用命令为:TTL KEY_NAME

如何设置Key的过期时间?

通过使用expirepexpire命令可设置key的过期时间,具体命令:expire key_x 100,含义是设置key_x的过期时间为100s expirepexpire的不同之处是:expire是以秒作为key过期时间,而pexpire是以毫秒作为key过期时间

也可通过SETEX指定key的过期时间,具体执行命令为:SETEX key seconds value

通过TTL查询key的过期时间

Redis执行大Key分析后内存使用率降低的原因

Redis执行大Key分析后内存使用率降低,可能是redis实例中本身存在大量的过期key,由于过期key的惰性删除机制(对于过期的key,只有被再次访问时,才会被删除),导致过期的key的积压,在进行大key分析,会对redis的实例进行遍历,当过期的key被遍历到时会被删除,因而使得内存使用率降低。

 


.erCFrxP7wmC