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命令的组合,不但是原子操作,同时减少了一次网络通讯的时间