程序员

redis-py中ttl返回None 但是键没消失

2017-11-13  本文已影响0人  辰辰沉沉沉

问题复现

r = redis.Redis()
lock_name = "test_lock"
r.set(lock_name, "test")
r.expire(lock_name, 1)

t1 = 0
t2 = 0
while True:
    # 过期
    if not r.ttl(lock_name):
        # 记录下过期的时间
        if t1 == 0: t1 = time.time()
        # 记录键消失的时间
        if not r.exists(lock_name):
            t2 = time.time()
            break
    time.sleep(.01)
print t2 - t1

expire方法设置过期时间,ttl方法获取过期时间(不存在则为None),按理说过期之后,键就会消失,即t2 - t1 应该为0,但上面的case返回大约是0.5s。

解决方法

原因

首先要确认一点,这是redis-py的锅,人家redis在某个版本之后已经能在1毫秒以内干掉过期的键了。具体是啥锅,得好好理一理

redis正常的返回值
StrictRedis 和Redis 区别

问题就出在Redis 对redis返回的值的包装上,lambda r: r >= 0 and r or None 我猜测他本意应该是当对象存在ttl时返回ttl,不存在key或者没有设置expire时返回None(即返回值为-2 或者为-1 或者返回值就是None的时候),然而因为四舍五入的存在,0.4会变为0,lambda r: r >= 0 and r or None返回值则为None。私以为这里变为lambda r: r >= 0 and r is not None or None更为合适。

综上。

上一篇 下一篇

猜你喜欢

热点阅读