ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Redis进阶 - 朝生暮死之Redis过期计谋
[打印本页]
作者:
不到断气不罢休
时间:
2024-8-9 00:34
标题:
Redis进阶 - 朝生暮死之Redis过期计谋
概述
Redis 是一种常用的内存数据库,其所有的数据布局都可以设置过期时间,时间一到,就会自动删除。你可以想象 Redis 内部有一个死神,时刻盯着所有设置了过期时间的 key,寿命一到就会立即收割。
你还可以进一步站在死神的角度思考,会不会由于同一时间太多的 key 过期,以至于忙不外来。同时由于 Redis 是单线程的,收割的时间也会占用线程的处理时间,如果收割的太过于繁忙,会不会导致线上读写指令出现卡顿。所有在过期这件事上,Redis 非常小心。
一、Redis 数据过期
1.1 Redis中key的过期时间
通过 EXPIRE key seconds 命令来设置数据的过期时间。返回1表明设置乐成,返回0表明key不存在大概不能乐成设置过期时间。在key上设置了过期时间后key将在指定的秒数后被自动删除。
127.0.0.1:6379> SETEX key 5 value
OK
127.0.0.1:6379> ttl s
(integer) 5
127.0.0.1:6379> GET key
"value"
127.0.0.1:6379> GET key ## 5 秒过后
(nil)
复制代码
命令 TTL 用于返回给定键距离过期还有多长时间。
注意:当key被DEL命令删除大概被SET、GETSET命令重置后与之关联的过期时间会被扫除
。
Redis 有四个命令可以设置键的生存时间(可以存活多久)和过期时间(什么时间到期),如下表所示:
命令说明
expire key seconds
以秒为单位设置键的生存时间
pexpire key milliseconds
以毫秒为单位设置键的生存时间
expireat key timestamp
以秒为单位,设置键的过期 UNIX 时间戳
pexpireat key milliseconds-timestamp
以毫秒为单位,设置键的过期 UNIX 时间戳
1.2 基于时间的过期计谋
在Redis中,可以利用EXPIRE和PEXPIRE命令为键设置生存时间,以秒或毫秒为单位。比方:
# 设置多少秒后过期
EXPIRE key seconds
# 设置多少毫秒后过期
PEXPIRE key milliseconds
# 设置 key 过期时间的时间戳(unix timestamp) 以秒计
EXPIREAT key timestamp
# 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计
PEXPIREAT key milliseconds-timestamp
复制代码
可以利用TTL命令或PTTL命令来查看键的剩余生存时间(以秒或毫秒为单位)。比方:
# 以秒为单位,返回给定 key 的剩余生存时间
TTL key
# 以毫秒为单位返回 key 的剩余的过期时间
PTTL key
复制代码
可以利用PERSIST命令来取消键的生存时间,使其永久保存。比方:
# 移除key的过期时间,key将保持永久
PERSIST key
复制代码
二、Redis数据过期计谋
Redis的过期计谋主要是通过定时删除、惰性删除和定期删除三种方式来管理键的生命周期。
过期计谋说明定时删除为每个设置了过期时间的键创建一个定时器,一旦过期就立即删除。
但是这种方式可能会消耗大量的CPU资源,因此Redis默认不利用这种计谋。定期删除每隔一段时间随机抽查一些键,删除其中已经过期的键。
这种方式是前两种方式的折衷,联合了定时任务和惰性删除的优点,是Redis默认采用的计谋。惰性删除只有在访问键时,才会查抄键是否过期,过期则删除。
这种方式可以最洪流平地节省CPU资源,但可能会导致大量的空间浪费。
2.1 定时删除
Redis 在设置键的过期时间时,创建一个定时势件,当过期时间到达时,由事件处理器自动实行键的删除操纵。定时删除计谋对内存是最友爱的,由于它包管过期键会在第一时间被删除, 过期键所消耗的内存会立即被开释。但它对 CPU 时间是最不友爱的,由于删除操纵可能会占用大量的 CPU 时间,将 CPU 时间花在删除那些和当前任务无关的过期键上,从而影响缓存的相应时间和吞吐量,这种做法毫无疑问会是低效的,因此Redis默认不利用这种计谋。
2.2 定期删除
Redis 的定期删除计谋是一种均衡的方法,它定时地查抄 Redis 库中的过期数据,采用随机抽样的方法,根据过期数据的比例来调解删除的速度。过期数据的比例是指 Redis 在定期删除计谋中,根据每次随机抽样的键中有多少是过期的来决定是否继续删除。如果过期的键比例超过 1/4,就继续抽样和删除。这样可以根据过期数据的麋集水平来控制删除的频率,制止过多占用 CPU 资源或内存空间。
Redis 会将每个设置了过期时间的 key 存入到一个单独的字典中,默认每秒进行 10 次过期查抄一次数据库。每次查抄数据库并不是遍历过期的所有 key,而是从数据库中随机抽取一定数量的 key 进行过期查抄。接下来,详细说说 Redis 的定期删除的流程。
此时,会有人问“至于为什么不扫描所有的 key?”,这个题目很简朴,Redis 作为一个单线程系统,全面扫描所有键值对可能会大幅度地影响性能。因此,Redis 限定每次过期扫描的最大耗时,这个限定默认是 25ms。如果用户将操纵超时设置得太短,比如 10ms,那么许多连接可能会由于超时而关闭,导致应用出现许多异常。此时,Redis 的慢查询日志可能并没有任何记录,由于慢查询记录的只是命令的处理时间,而不包括等候时间。当大量键值对在同一时刻过期时,Redis 会多次扫描过期字典,直到过期键的比例低于四分之一。这可能会导致短暂的系统卡顿,尤其在并发请求高的情况下,这可能引发所谓的缓存雪崩。
2.3 惰性删除
与定期删除差别,懒惰删除计谋并不会定时地去扫描和删除过期的键,而是在每次访问 key 时,才会判断该key是否已过期。如果过期则扫除,而且删除的目标仅限于当前处理的键;如果没有过期,不做任那里理,然后返回正常的键值对给客户端。如下图所示:
惰性删除对比定期删除而言,可以节省处理器时间,由于只有在键被访问时,Redis 才会去查抄并删除过期的键。这种计谋在许多情况下都能有效地处理过期的键,由于许多过期的键可能永远都不会被访问,因此没有须要花费时间去删除它们。
然而,惰性删除可能会导致过期的键占用内存空间。由于只有在键被访问时,Redis才会删除它,如果一个过期的键不绝没有被访问,那么它就会不绝占用内存空间,这在内存告急的环境下可能会成为一个题目。举个例子, 对于一些按时间点来更新的数据, 比如日志(log), 在某个时间点之后, 对它们的访问就会大大减少, 如果大量的这些过期数据积存在数据库内里, 用户以为它们已经过期了(已经被删除了), 但实际上这些键却没有真正的被删除(内存也没有被开释), 那效果肯定是非常糟糕。
三、结语
Redis 缓存的过期计谋是包管缓存可靠性和性能的关键之一,通过设置键值对缓存、设置过期时间、取消过期时间和查看 Redis 内存利用情况等操纵,可以实现对缓存的控制和管理。需要注意的是,在设置缓存过期时间时,应根据业务场景和数据范例来选择符合的时间。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4