前言
随着时间推移,Redis中会出现越来越多的数据,有的数据可能使用频率比较低,但是这些数据一直占用着内存资源,为了提高资源利用率,将一些无用的数据或者使用频率较低的数据移出Redis数据库,Redis提供了自动的键过期功能,通过这个功能,用户可以让特定的键在指定的时间之后自动被移除,从而避免了无用数据长期占用资源的问题发生。
EXPIRE、PEXPIRE:设置生存时间
用户可以通过执行EXPIRE命令或者PEXPIRE命令为键设置一个生存时间(Time To Live,TTL):键的生存时间在设置之后流会随着时间的流逝而不断减少,当一个键的生存时间被消耗殆尽时,Redis就会移除这个键。
EXPIRE命令和PEXPIRE命令都可以用来设置生存时间,它们的区别在于时间精度上,前者设置的时间精度为秒,后者的设置的时间精度为毫秒:
EXPIRE key seconds
PEXPIRE key milliseconds
它们的含义时:在指定 N N N 秒或者毫秒之后自动被移除。
如果设置成功,则返回1,如果指定的键不存在,那么返回0表示设置失败。
当用户对一个已经生成时间的键执行EXPIRE命令或者PEXPIRE命令时,键原有的生成时间会被移除,然后重新设置新的生存时间。
SET命令的EX选项和PX选项
Redis从2.6.12版本开始为SET命令提供了EX和PX选项,用户可以通过使用这两个选项来达到同时执行SET和设置生存时间的效果:
SET key value [EX seconds] [PX millseconds]
组合命令的使用不仅可以减少Redis执行命令的次数,同时,由于Redis执行命令的原子性,使用组合键还可以保证设置值和生成时间同时进行,保证了命令的执行的安全性。
EXPIREAT、PEXPIREAT:设置过期时间
Redis不仅提供了设置生存时间来让键在指定的秒数或毫秒数之后自动移除,还可以通过设置过期时间(Expire Time),让Redis在指定UNIX时间来临之后自动移除给定的键:
EXPIREAT key seconds_timestamp
PEXPIREAT key millseconds_timestamp
EXPIREAT命令和PEXPIREAT命令的区别也是精度上的,前者是秒级精度,后者是毫秒级精度。同样的,如果对已有设置过期时间的键执行这两个命令,那么就会重新为该键设置新的过期时间。
注意:无论是EXPIRE/PEXPIRE,还是EXPIREAT/PEXPIREAT,它们都只能对整个键进行设置,而无法对键中的某个元素进行设置。
复杂度:
O
(
1
)
O(1)
O(1)
版本要求:EXPIREAT命令从Redis 1.2.0版本开始可用,PEXPIREAT命令从Redis 2.6.0版本开始可用。
TTL、PTTL:获取键的剩余生存时间
在为键设置生存时间或过期时间之后,用户可以使用TTL命令或PTTL命令查看键的剩余生存时间,即键还有多久会被移除:
TTL key -- 返回秒级精度的时间
PTTL key -- 返回毫秒级精度的时间
如果给定的键存在,但是并没有设置生存时间或者过期时间,那么命令会返回 -1 。
注意:在使用 TTL 命令时,有时会与遇到返回0的情况,出现这种情况的原因在于 TTL 的精度只能返回秒级精度的时间,所以当给定的键剩余生存时间不足 1s 时,TTL命令就会返回0,这时使用 PTTL命令就会看到实际的剩余生存时间
复杂度:
O
(
1
)
O(1)
O(1)
版本要求:TTL命令从Redis 1.0.0版本开始可用,PTTL命令从Redis 2.6.0版本开始可用。