【Redis】自动过期

Posted by 西维蜀黍 on 2019-10-28, Last Modified on 2021-09-21

自动过期

Redis中有个设置时间过期的功能,通过 setex 或者 expire 关键字来实现。

redis 127.0.0.1:6379> hset expire:me name tom
(integer) 0
redis 127.0.0.1:6379> hget expire:me name
"tom"
 
redis 127.0.0.1:6379> expire expire:me 20
(integer) 1
redis 127.0.0.1:6379> ttl expire:me     # 获得还有多久过期,比如这里就是就有 19 秒才过期
(integer) 19
 
...
...
...
 
redis 127.0.0.1:6379> ttl expire:me
(integer) -1
redis 127.0.0.1:6379> hget expire:me name

即对存储在Redis数据库中的键值对(key-value pair)可以设置一个过期时间。作为一个缓存数据库,这是非常实用的。如我们一般项目中的token、登录信息或者短信验证码都是有时间限制的,按照传统的数据库处理方式,一般都是自己判断过期,这样无疑会严重影响项目性能。

Redis对存储值的过期处理实际上是针对该值的键(key)处理的,即时间的设置也是设置key的有效时间。

Expires字典保存了所有键的过期时间,Expires也被称为过期字段。

四种处理策略

  • EXPIRE:将key的生存时间设置为x秒,即 x 秒后该 key 会被自动删除。
  • PEXPIRE:将key的生成时间设置为 x 毫秒,即 x 毫秒后该 key 会被自动删除。
  • EXPIREAT:将key的过期时间设置为timestamp所代表的的秒数的时间戳,即到达该特定时间后,该 key 会被自动删除。
  • PEXPIREAT:将key的过期时间设置为timestamp所代表的的毫秒数的时间戳,即到达该特定时间后,该 key 会被自动删除。

其实,以上几种处理方式都是通过PEXPIREAT来实现的,设置生存时间的时候是redis内部计算好时间之后在内存处理的,最终的处理都会转向PEXPIREAT。

1、2两种方式是设置一个过期的时间段,就是咱们处理验证码最常用的策略,设置三分钟或五分钟后失效,把分钟数转换成秒或毫秒存储到redis中。 3、4两种方式是指定一个过期的时间 ,比如优惠券的过期时间是某年某月某日,只是单位不一样。

删除策略

过期键的处理就是把过期键删除,这里的操作主要是针对过期字段处理的。

Redis中有三种处理策略:定时删除、惰性删除和定期删除。

定时删除:在设置键的过期时间的时候创建一个定时器,当过期时间到的时候立马执行删除操作。不过这种处理方式是即时的,不管这个时间内有多少过期键,不管服务器现在的运行状况,都会立马执行,所以对CPU不是很友好。 惰性删除:惰性删除策略不会在键过期的时候立马删除,而是当有 client获取这个键的时候才会主动删除。处理过程为:接收get执行、判断是否过期(这里按过期判断)、执行删除操作、返回nil(空)。 定期删除:定期删除是设置一个时间间隔,每个时间段都会检测是否有过期键,如果有执行删除操作。这个概念应该很好理解。通过TTL命令用于获取键到期的剩余时间(秒)。 判断大于0还是其他,这样可以实现定期删除。

Reference