Redis键过期命令使用注意事项
1、如果expire key 的键不存在,返回结果为0
127.0.0.1:6379> expire not_exist_key 30
(integer) 0
2、如果过期时间为负值,键会立即被删除,犹如使用del命令一样
127.0.0.1:6379>set hello world
OK
127.0.0.1:6379>expire hello-2
(integer)1
127.0.0.1:6379>get hello
(nil)
3、persist命令可以将键的过期时间清除
127.0.0.1:6379>hset key f1 v1
(integer)1
127.0.0.1:6379>expire key 50
(integer)1
127.0.0.1:6379>ttl key
(integer)46
127.0.0.1:6379>persist key
(integer)1
127.0.0.1:6379>ttl key
(integer)-1
4、对于字符串类型键,执行set命令会去掉过期时间(开发过程中很容易被忽略)
在Redis源码中,set命令的函数setKey,可以看到最后执行了removeExpire(db,key)函数去掉了过期时间:
void setKey(redisDb *db, robj *key, robj *val) {
if (lookupKeyWrite(db,key) == NULL) {
dbAdd(db,key,val);
} else {
dbOverwrite(db,key,val);
}
incrRefCount(val);
// 去掉过期时间
removeExpire(db,key);
signalModifiedKey(db,key);
}
举例说明 set 命令会导致过期时间失效,因为 ttl 变为-1
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 world
OK
127.0.0.1:6379> ttl hello
(integer) -1
5、Redis不支持二级数据结构(例如哈希,列表)内部元素的过期功能,例如不能对列表类型的一个元素做过期时间设置。
6、setex命令作为set+expire命令的组合,不但是原子操作,同时减少了一次网络通讯的时间