Redis set命令会去掉过期时间
对于字符串类型键,执行set命令会去掉过期时间,这个问题很容易在开发中被忽视。
先给个例子:
127.0.0.1:6379> set hello world
ok
127.0.0.1:6379>expire hello 50
(integer) 1
127.0.0.1:6379> ttl hello
(integer) 46
127.0.0.1:6379> set hello everyone
ok
127.0.0.1:6379>ttl hello
(integer) -1
ttl 变为-1,说明set会导致过期时间失效。所以建议 set之后加上过期时间,或者使用setex
为什么会这样?我们看一下源码:
在set命令的函数setKey最后执行了 removeExpire(db,key)函数去掉了过期时间。
void setKey(redisDb *db, robj *key, robj *val){
if (lookupKeyWrite (db,key,val) == NULL) {
dbAdd(db,key,val);
} else {
dbOverwrite(db,key,val);
}
incrRefCount(val);
// 去掉过期时间
removeExpire(db,key);
signalModifiedKey(db,key);
}
《Redis 开发与运营》 付磊,张益军;P63.