redis 设置零点过期
Redis可以通过设置过期时间来自动删除key,但是默认情况下,过期时间是相对于当前时间的。如果需要设置一个固定的过期时间,可以使用Redis的过期时间戳机制。具体实现如下:
- 获取当前时间戳
使用Redis的TIME命令可以获取当前时间戳(秒级别)和微秒数。
127.0.0.1:6379> TIME
1) "1577276011"
2) "467107"
其中,第一个元素是秒级别的时间戳,第二个元素是微秒数。
- 计算距离零点的秒数
假设需要在每天的零点过期,可以先计算距离零点的秒数,然后将这个秒数加上当前时间戳,得到过期时间戳。
// 获取当前时间戳
127.0.0.1:6379> TIME
1) "1577276011"
2) "467107"
// 计算距离零点的秒数
127.0.0.1:6379> set zero 0
OK
127.0.0.1:6379> EVAL "return redis.call('TIME')[1] - tonumber(redis.call('get', 'zero')) % 86400" 0
(integer) 63189
// 计算过期时间戳
127.0.0.1:6379> EVAL "return tonumber(redis.call('TIME')[1]) + 63189" 0
(integer) 1577319217
在上面的例子中,我们首先设置了一个固定的零点时间戳为0。然后使用EVAL命令计算距离零点的秒数,即当前时间距离零点的秒数(1577276011 % 86400 = 63189)。最后,将计算出来的秒数加上当前时间戳,得到过期时间戳(1577276011 + 63189 = 1577319217)。
- 设置过期时间戳
最后,将key设置过期时间戳即可:
127.0.0.1:6379> setexat mykey 1577319217 "hello"
OK
这样,mykey的过期时间就是每天的零点。
需要注意的是,如果在计算距离零点的秒数时,当前时间已经过了零点,那么计算出来的秒数会是负数。此时需要将计算出来的秒数加上一天的秒数(即86400)才能得到正确的过期时间戳
原文地址: https://www.cveoy.top/t/topic/eNTM 著作权归作者所有。请勿转载和采集!