V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Ymmmmmmmm
V2EX  ›  Java

关于 Redis 的 PTTL 命令的一个疑惑

  •  
  •   Ymmmmmmmm · 2023-01-02 23:54:54 +08:00 · 1312 次点击
    这是一个创建于 688 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 = get_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 的话含义就差老大了

    8 条回复    2023-01-09 17:20:17 +08:00
    TJT
        1
    TJT  
       2023-01-03 00:09:19 +08:00
    多看看文档: https://redis.io/commands/pttl/

    没有什么特别的,就是因为负数被定义为错误而已,利用好这个错误可以区分出不同的情况,减少后续不必要的查询。
    Ymmmmmmmm
        2
    Ymmmmmmmm  
    OP
       2023-01-03 00:31:44 +08:00
    @TJT 好吧,个人觉得错误可以定义成唯一点比较好,不应该有歧义
    v2wtf
        3
    v2wtf  
       2023-01-03 09:35:22 +08:00
    @Ymmmmmmmm

    错误是多样的,需要进行多种错误分支处理。

    而正确往往都只会进行同一种分支处理。
    nicreve
        4
    nicreve  
       2023-01-03 10:35:13 +08:00
    “因为 redis 过期的键不会被立即清除掉,expire_time_in_ms-now_ms 是会存在-2 和-1”
    这个错误结论是怎么得出来的?你是不是对懒驱逐有什么误解?
    Ymmmmmmmm
        5
    Ymmmmmmmm  
    OP
       2023-01-06 17:27:04 +08:00
    @nicreve redis 服务器采用过期删除策略是惰性删除和定期删除,所以 redis 过期的键不会被立即清除掉,你的理解是,还望赐教
    nicreve
        6
    nicreve  
       2023-01-06 17:44:09 +08:00
    @Ymmmmmmmm 懒驱逐只是内部实现,对于客户端来说,访问一个已过期的 key 就是返回-2 ,不用关心这个 key 在 Redis 内是 10 分钟前被驱逐的还是访问时被驱逐的。
    说白了,你贴的伪代码逻辑就是错的,对于已过期的 key ,Redis 怎么可能返回 expire_time_in_ms - now_ms 呢?
    Ymmmmmmmm
        8
    Ymmmmmmmm  
    OP
       2023-01-09 17:20:17 +08:00
    @nicreve 受教了,多谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1180 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:36 · PVG 02:36 · LAX 10:36 · JFK 13:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.