用法实例及测试:
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set db redis
OK
127.0.0.1:6379> get db
"redis"
可选参数命令4种:
用法实例及测试:
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set db redis ex 20 //设置db=redis的键值对,且该键值对有效期为20秒
OK
127.0.0.1:6379> get db
"redis"
效果等同于
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> setex db 20 redis
OK
127.0.0.1:6379> get db
"redis"
用法实例及测试:
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set db redis px 10000 //设置db-redis的键值对,有效时间10000毫秒,即10秒
OK
127.0.0.1:6379> get db
"redis"
效果等同于
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> psetex db 10000 redis
OK
127.0.0.1:6379> get db
"redis"
补充:
a.和sex key value进行对比,sex key value不管之前是否存在该key都会进行操作,没有则设置value,有则覆盖value;set key value nx只有在不存在key的情况才会执行操作,存在该key的话不会执行操作。
b.和set key value xx对比,两者前提条件相反,nx是不存在该键值对时才会操作,xx是在存在该键值对时才会操作。
用法实例及测试:
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set db redis //先测试已经存在db-redis的键值对的情况
OK
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> set db redis nx //当已有db-redis的键值对时操作不被执行,返回nil
(nil)
127.0.0.1:6379> del db //然后删除db-redis键值对,测试不存在db-redis的键值对的情况
(integer) 1
127.0.0.1:6379> get db
(nil)
127.0.0.1:6379> set db redis nx //当没有db-redis的键值对时设置成功,返回ok
OK
127.0.0.1:6379> get db
"redis"
效果等同于
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set db redis //先测试已经存在db-redis键值对的情况
OK
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> setnx db redis //当已经存在db-redis键值对时操作不被执行,返回0
(integer) 0
127.0.0.1:6379> del db //然后删除db-redis键值对,测试没有该键值对的情况
(integer) 1
127.0.0.1:6379> get db
(nil)
127.0.0.1:6379> setnx db redis //当不存在db-redis键值对时设置成功,返回1
(integer) 1
127.0.0.1:6379> get db
"redis"
补充:
a.和sex key value进行对比,sex key value不管之前是否存在该key都会进行操作,没有则设置value,有则覆盖value;set key value xx只有key存在的情况才会执行操作,不存在该key的话不会执行操作。
b.和set key value nx对比,两者前提条件相反,xx是在存在该键值对时才会操作,nx是不存在该键值对时才会操作。
c.注意:没有setxx命令。
用法实例及测试:
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set db redis xx //当不存在该key的时候,返回nil
(nil)
127.0.0.1:6379> setnx db redis
(integer) 1
127.0.0.1:6379> exists db
(integer) 1
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> set db mysql xx //当存在该key的时候,返回OK,且value会被覆盖
OK
127.0.0.1:6379> get db
"mysql"
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set db redis ex 20 //ex命令先设置db-redis键值对,且20秒有效时间
OK
127.0.0.1:6379> ttl db
(integer) 18
127.0.0.1:6379> set db redis //然后在有效时间内用该命令
OK
127.0.0.1:6379> ttl db //发现有效时间被清除,变为永久键值对。
(integer) -1
127.0.0.1:6379> set db mysql xx //然后用xx命令对键db重新设置
OK
127.0.0.1:6379> ttl db
(integer) -1
127.0.0.1:6379> get db //发现value被替换覆盖
"mysql"
127.0.0.1:6379> set db mysql nx //nx命令对该键设置,因为已经存在,所以返回了nil
(nil)
127.0.0.1:6379> set db redis ex 20 //ex命令对db键用ex命令设置,并且设置20秒有效时间
OK
127.0.0.1:6379> get db //结果1:value被ex的value覆盖
"redis"
127.0.0.1:6379> ttl db //结果2:该键值对从永久变为上面ex命令添加的有效期
(integer) 14
127.0.0.1:6379> exists db //此时已经没有db键
(integer) 0
127.0.0.1:6379> set db redis ex 20 nx //nx命令设置键值对,且20秒有效时间
OK
127.0.0.1:6379> ttl db
(integer) 14
127.0.0.1:6379> get db
"redis"
总结:
1.通过set命令和ex(或px)命令可以完成永久和有效时间两种状态的转变
2.ex(或px)可以和nx(或xx)命令一起用,且nx(或xx)命令必须放在最后
3.若想达到ex(或px)可以和nx(或xx)命令一起用的效果的时候,不可以使用setex key seconds value nx命令(px xx也一样),这是违法操作,不存在这样的命令,只能用如下操作
127.0.0.1:6379> set db redis ex 20 nx //或px
OK
127.0.0.1:6379> set db redis ex 20 xx //或px
OK