Redis ExpireAt 未按预期工作

标签 redis

根据 Redis 文档,EXPIREAT 接受 unixtime 作为指定删除键的时间的参数。

当我在 redis-cli 中执行以下命令时:

127.0.0.1:6379> set bb bb
OK
127.0.0.1:6379> EXISTS bb
(integer) 1
127.0.0.1:6379> TTL bb
(integer) -1
127.0.0.1:6379> EXPIREAT bb 1462173420000 //executed at 1462173300000 ====>>> 1
(integer) 1
127.0.0.1:6379> EXISTS bb //executed after 1462173420000
(integer) 1 =============>>> 2
127.0.0.1:6379> TTL bb
(integer) 1460711246668
127.0.0.1:6379> TTL bb
(integer) 1460711246663
127.0.0.1:6379> EXPIREAT bb 100
(integer) 1 ===================>> 3
127.0.0.1:6379> EXISTS bb
(integer) 0 ===================>> 4

EXPIREAT 在 bb 上执行时间 - 2016 年 5 月 2 日下午 12:47,2016 年 5 月 2 日下午 12:45。

即使在 2016 年 5 月 2 日下午 12:47 之后, key 仍然存在。 为什么会这样?

为什么 EXPIREAT 接受无效的 unixtime - 100?

最佳答案

EXPIREAT 将值作为秒,而不是毫秒。对于毫秒,您必须使用 PEXPIREAT。您已将值指定为毫秒,因此过期时间设置为更高的值。

针对您的用例进行的小实验:

127.0.0.1:6379> set karthik 10
OK
127.0.0.1:6379> time //You can use this command to see redis time
1) "1462174316"
2) "692726"
127.0.0.1:6379> EXPIREAT karthik 1462174350 //setting the key to expire at 1462174350
(integer) 1
127.0.0.1:6379> get karthik 
"10"

127.0.0.1:6379> ttl karthik //use this to see the time left
(integer) 22
127.0.0.1:6379> time
1) "1462174336"
2) "316226"
127.0.0.1:6379> get karthik
"10"
127.0.0.1:6379> time
1) "1462174343"
2) "310511"
127.0.0.1:6379> ttl karthik
(integer) 1
127.0.0.1:6379> time //time crossed 1462174350
1) "1462174351"
2) "48589"
127.0.0.1:6379> get karthik //key has got expired
(nil)
127.0.0.1:6379> 

关于Redis ExpireAt 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36977090/

相关文章:

redis - 如何使用纯Redis以原子方式删除与模式匹配的数百万个键?

python - Redis pubsub 导致太多文件打开错误

java - @用户脚本:1: WRONGTYPE Operation against a key holding the wrong kind of value

ruby-on-rails - Redis 中带有前缀的元素的统计信息

java - Redis - 过期索引不会被删除

php - 用户在 Laravel 中使用 Redis 加入广播 channel 后,在后端获取事件

redis跨数据中心复制

php - Redis 请求延迟

Redis:如何将 "normal"集与排序集相交?

redis - Redis 中的绝对和滑动缓存