什么是大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?
方法 | 说明 |
---|---|
使用Redis自带的分析工具 | 请参考TOP KEY分析和离线全量KEY分析 |
通过redis-cli的bigkeys和hotkeys参数查找大Key和热Key | 查询大key: Redis-cli提供了—bigkeys参数,通过遍历的方式分析实例中的所有Key,并返回Key的整体统计信息与每个数据类型(STRING、LIST、HASH、SET、ZSET、STREAM)中最大的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命令,返回对应Key的value的字节数。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将不可访问。
通过ttl命令可以查询key的过期时间,具体使用命令为:TTL KEY_NAME。
如何设置Key的过期时间?
通过使用expire或pexpire命令可设置key的过期时间,具体命令:expire key_x 100,含义是设置key_x的过期时间为100s。 expire和pexpire的不同之处是:expire是以秒作为key过期时间,而pexpire是以毫秒作为key过期时间。
也可通过SETEX指定key的过期时间,具体执行命令为:SETEX key seconds value。
通过TTL查询key的过期时间。
Redis执行大Key分析后内存使用率降低的原因
Redis执行大Key分析后内存使用率降低,可能是redis实例中本身存在大量的过期key,由于过期key的惰性删除机制(对于过期的key,只有被再次访问时,才会被删除),导致过期的key的积压,在进行大key分析,会对redis的实例进行遍历,当过期的key被遍历到时会被删除,因而使得内存使用率降低。