
PTTL 命令的伪代码:
def PTTL(key):
#键不存在于数据库 if key not in redisDb.dict return -2 #尝试获取键的过期时间 #如果键没有设置过期时间,那么 expire_time_in_ms 将为 none expire_time_in_ms = redisDb.expires.get(key) #键没有设置过期时间 if expire_time_in_ms is None: return -1 #获取当前时间 now_ms = ge_current_unix_timestamp_in_ms() #返回过期时间 return expire_time_in_ms - now_ms 就这个方法而言,为什么 redis 要返回-2 和-1 来表示键不存在于数据库中和键没有设置过期时间,因为 redis 过期的键不会被立即清除掉,expire_time_in_ms-now_ms 是会存在-2 和-1 ,这样不是会造成误判嘛,-2 的话到无所谓应该反正过期了,也可以理解为该键不存在于数据库中(当然不能使用 PTTL 命令来判断一个 key 是否存在),但是-1 的话含义就差老大了
1 TJT 2023-01-03 00:09:19 +08:00 |
4 nicreve 2023-01-03 10:35:13 +08:00 “因为 redis 过期的键不会被立即清除掉,expire_time_in_ms-now_ms 是会存在-2 和-1” 这个错误结论是怎么得出来的?你是不是对懒驱逐有什么误解? |
5 Ymmmmmmmm OP @nicreve redis 服务器采用过期删除策略是惰性删除和定期删除,所以 redis 过期的键不会被立即清除掉,你的理解是,还望赐教 |
6 nicreve 2023-01-06 17:44:09 +08:00 @Ymmmmmmmm 懒驱逐只是内部实现,对于客户端来说,访问一个已过期的 key 就是返回-2 ,不用关心这个 key 在 Redis 内是 10 分钟前被驱逐的还是访问时被驱逐的。 说白了,你贴的伪代码逻辑就是错的,对于已过期的 key ,Redis 怎么可能返回 expire_time_in_ms - now_ms 呢? |
7 nicreve 2023-01-06 18:01:24 +08:00 |