Redis中过期键是如何被删除的

设置过期时间

Redis 提供了四个为键添加过期时间的命令:

  • EXPIRE <key> <ttl>:将键 key 的生存时间设为 ttl
  • PEXPIRE <key> <ttl>:将键 key 的生存时间设为 ttl 毫秒
  • EXPIREAT <key> <timestamp>:将键 key 的过期时间设为 timestamp 所指定的秒数时间戳。
  • EXPIREAT <key> <timestamp>:将键 key 的过期时间设为 timestamp 所指定的毫秒数时间戳。

可以通过生存时间/过期时间,秒/毫秒区分上述四个命令。
实际上,EXPIRE,PEXPIRE,EXPIREAT 都是通过将参数转换为毫秒级的过期时间,然后调用 PEXPIREAT 来实现的。

Redis 用一个专门的小本本(一个名为 expires 的字典)记录每个键的过期时间。每次调用上述命令时,就会将过期信息记录到该字典中。

命令拾遗
删除过期时间:PERSIST <key>
查询剩余时间:TTL <key>;PTTL <key>

删除策略

Redis 提供了三种删除策略,在CPU和内存两个方面各有利弊。

定时删除

在设置键过期的同时,创建一个定时器,在到达过期时间时,定时器触发删除逻辑。该策略可以保证在到达过期时间后立即删除键。
定时删除策略对内存比较友好:通过使用定时器,定时删除策略可以保证过期键会尽可能快的被删除,并释放过期键所占用的内存。
但该策略对CPU相当不友好:在删除键较多时,删除操作可能会占用相当多的CPU时间,在CPU时间非常紧张时,可能会服务的响应时间和吞吐量造成影响。

惰性删除

该策略不会在到达过期时间后主动触发删除逻辑,而是在读取键值之前判断键是否已经过期。如果键已经过期,则删除之,否则执行正常流程。这使得该策略对CPU非常友好,即使有大量的键同时过期也不会出现扎堆删除键的情况。
与之相应的,该策略对内存不太友好,因为过期的键不会被立即删除,导致内存中存放了大量的过期键。还有一些情况甚至会造成"内存泄漏",比如有一些键可能和日期有关,在一个时间点之后就不会再访问了,那么这些键永远都不会被删除了。

定期删除

定期删除策略在CPU和内存之间做了权衡。定期删除策略会每隔一段时间执行一次删除操作,并通过限制删除操作的时间和频率来减轻对CPU时间的影响。该策略虽然不会立即删除过期键,但可以保证过期键会在一定时间内被删除,在一定程度上也减轻了内存的负担。

总结

在实际应用中,一般会采用惰性+定期两种策略。通过配合使用这两种策略,服务器可以很好的在CPU和内存之间取得平衡。

猜你喜欢

转载自blog.csdn.net/Time_Limit/article/details/107441346