Redis中exists、ttl、setex、setnx、set、getset等常用命令
1、exists
通常情况下用exists来判断一个key是否存在没什么问题。但如果过期时间需要精确到秒或十秒级,那么exists就可能错误返回。
原因是在redis Key过期之后,但是执行exists命令的返回值可能还为true,这个时候使用TTL命令发现返回值已经小于等于0了。
ps :
redis key 过期的方式有三种:
- 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略(执行exists不会触发惰性删除),直接删除掉这个过期key
- 主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key
- 当前已用内存超过maxmemory限定时,触发主动清理策略
2、ttl
使用TTL key可以访问key的生存时间。
时间复杂度:
O(1)
返回值:
当 key 不存在时,返回 -2 。
当 key 存在但没有设置剩余生存时间时,返回 -1 。
否则,以秒为单位,返回 key 的剩余生存时间。
3、set
set key value
设置指定 key 的值为 value。
如果 key 已经存储其他值, SET 就覆写旧值,且无视类型。
4、setex
setex key seconds value
设置指定 key 的值为 value,并将 key 的过期时间设为 seconds (以秒为单位)。
如果 key 已经存在, SETEX 命令将会替换旧的值。
5、setnx
setnx key value
设置指定 key 的值为 value,只有在 key 不存在时设置 key 的值。
setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。
设置成功,返回 1 。 设置失败,返回 0 。
6、getset
getset key value
设置指定 key 的值为 value,并返回 key 的旧值(old value)。
返回给定 key 的旧值。 当 key 没有旧值时,即 key 不存在时,返回 nil 。
当 key 存在但不是字符串类型时,返回一个错误。
7、其它
已经设置生存时间的key,如果想清除掉生存时间,将其变成永久存在的key,可以使用persist命令。
返回值:
- 1 if the timeout was removed.
- 0 if key does not exist or does not have an associated timeout.
以上所有命令时间单位都是秒,如果需要设置、访问毫秒级别的时间,在所有命令前加p就可以了。
- pttl
- pexpire
- psetex key milliseconds value
- set key value [ex seconds] [px milliseconds] [nx|xx]
eg.
set key value px 1000
可选参数说明:
从 Redis 2.6.12 版本开始, SET 命令的行为可以通过一系列参数来修改:
- EX seconds : 将键的过期时间设置为 seconds 秒。 执行 SET key value EX seconds 的效果等同于执行 SETEX key seconds value 。
- PX milliseconds : 将键的过期时间设置为 milliseconds 毫秒。 执行 SET key value PX milliseconds 的效果等同于执行 PSETEX key milliseconds value 。
- NX : 只在键不存在时, 才对键进行设置操作。 执行 SET key value NX 的效果等同于执行 SETNX key value 。
- XX : 只在键已经存在时, 才对键进行设置操作。
因此:
因为 SET 命令可以通过参数来实现 SETNX 、 SETEX 以及 PSETEX 命令的效果, 所以 Redis 将来的版本可能会移除并废弃 SETNX 、 SETEX 和 PSETEX 这三个命令。