redis有关key的命令
(1)查看当前库的所有key及get、set的衍生操作
DBSIZE查看当前库的key的个数,keys * 查看当前库的所有key。
127.0.0.1:6379> DBSIZE(integer) 0127.0.0.1:6379> 127.0.0.1:6379> keys *(empty list or set)127.0.0.1:6379>
先获取当前值返回,再设置值
127.0.0.1:6379> get k4"thanks"127.0.0.1:6379>127.0.0.1:6379>127.0.0.1:6379> getset k4 welcome"thanks"127.0.0.1:6379> get k4"welcome"
获取多个,设置多个
127.0.0.1:6379> mget k1 k2 k3 k41) "99"2) "i love anyone but ye to leave"3) (nil)4) "welcome"127.0.0.1:6379>127.0.0.1:6379> mset k1 100 k2 'I love you, but have to leave.' k3 v3 k4 thanksOK127.0.0.1:6379> mget k1 k2 k3 k41) "100"2) "I love you, but have to leave."3) "v3"4) "thanks"127.0.0.1:6379>
(2)查看某个键是否存在
命令:exists 【key名称】
127.0.0.1:6379> set k1 v1OK127.0.0.1:6379> set k2 v2OK127.0.0.1:6379> set k3 v3OK127.0.0.1:6379> exists k1(integer) 1127.0.0.1:6379> exists k10(integer) 0127.0.0.1:6379> 127.0.0.1:6379>
在使用Java通过Jedis来操作redis中的键值对时,需要判断某个键是否存在时就可以用到EXISTS命令。(Jedis是Redis的Java客户端)
如下面的代码便是java通过jedis访问本地的redis服务的示例。
//连接本地Jedis服务Jedis jedis = new Jedis("127.0.0.1",6379);//查看服务是否运行,打出PONG,表示OKSystem.out.println("connection is ok =====> : " + jedis.ping());
只要将这些redis命令掌握,就可以轻松的在java程序中通过jedis对redis进行操作。
如果想在设置某个键的值时希望:如果该键存在不赋值,该键不存在则设置value。那么可以用命令:
setnx 【key名称】【value值】
1) "k3"2) "k2"3) "k1"127.0.0.1:6379>127.0.0.1:6379>127.0.0.1:6379>127.0.0.1:6379> get k3"hello"127.0.0.1:6379> setnx k3 bye(integer) 0127.0.0.1:6379> get k3"hello"127.0.0.1:6379>127.0.0.1:6379>127.0.0.1:6379> setnx k4 thanks(integer) 1127.0.0.1:6379> get k4"thanks"127.0.0.1:6379>
如果需要同时操作多个不存在则设置,可以用命令:
msetnx 【key名称1】【value值1】【key名称2】【value值2】... ...
但是需要注意的是,msetnx 就像一个完整的事务,一旦一个setnx不成功,则整个都完蛋。
127.0.0.1:6379> keys *1) "k2"2) "k1"3) "k4"127.0.0.1:6379> msetnx k3 v3 k4 v4 k5 v5(integer) 0127.0.0.1:6379> keys *1) "k2"2) "k1"3) "k4"127.0.0.1:6379> get k4"thanks"127.0.0.1:6379>
(3)将当前库的某个键值对移动得到其他库。
命令:move 【key名称】 【其他库的dbid】
127.0.0.1:6379> 127.0.0.1:6379> keys *1) "k3"2) "k1"3) "k2"127.0.0.1:6379> move k3 2(integer) 1127.0.0.1:6379> keys *1) "k1"2) "k2"127.0.0.1:6379> select 2OK127.0.0.1:6379[2]> keys *1) "k3"127.0.0.1:6379[2]>
(4)给当前库的某个key设置有效时间,过期后自动清除
命令:expire 【key名称】【过期时间(单位:秒)】
下面设置了key3的有效期是10秒,然后不停的查看本地库的键列表,10秒之后,k3消失。
127.0.0.1:6379[2]> EXPIRE k3 10(integer) 1127.0.0.1:6379[2]> keys *1) "k3"127.0.0.1:6379[2]> keys *1) "k3"127.0.0.1:6379[2]> keys *1) "k3"127.0.0.1:6379[2]> keys *(empty list or set)127.0.0.1:6379[2]> keys *
如果是想设置key的value的同时设置过期时限,用命令:
setex 【key名称】【过期时间(单位:秒)】【value值】
127.0.0.1:6379> setex k3 600 helloOK127.0.0.1:6379> ttl k3(integer) 593127.0.0.1:6379>
(5)查看某个键的有效期还有多久(秒)
命令:ttl 【键的名称】
ttl 即 time to live
下面我们在当前库建了k1、k2、k3三个键值对。然后k1不设置有效期,即永久的;k2设置1小时,即3600秒;k3设置为5秒钟过期。
之后我们可以通过ttl来查看每个键过期的秒数。
如果是-1,则表示永久有效,不存在过期;如果是-2,则表示已经过期或者该键根本不曾存在。
非负数则表示剩余的秒数。
127.0.0.1:6379[2]> set k1 v1OK127.0.0.1:6379[2]> set k2 v2OK127.0.0.1:6379[2]> set k3 v3OK127.0.0.1:6379[2]> expire k2 3600(integer) 1127.0.0.1:6379[2]> expire k3 5(integer) 1127.0.0.1:6379[2]> keys *1) "k3"2) "k1"3) "k2"127.0.0.1:6379[2]> keys *1) "k1"2) "k2"127.0.0.1:6379[2]> 127.0.0.1:6379[2]> get k1"v1"127.0.0.1:6379[2]> get k2"v2"127.0.0.1:6379[2]> get k3(nil)127.0.0.1:6379[2]> 127.0.0.1:6379[2]> 127.0.0.1:6379[2]> ttl k1(integer) -1127.0.0.1:6379[2]> ttl k2(integer) 3547127.0.0.1:6379[2]> ttl k3(integer) -2127.0.0.1:6379[2]>
这里我们需要引出一个问题:
如果一个已经设置了有效期的键被再次set了新的值那么,它的有效期是:
A. 继续原先的已经消耗的有效期,即使用剩余的有效时间之后过期;
B. 还是过期时间会被重置为原先一开始的过期时间长度;
C. 还是过期时间设置被消除成为永久有效
答案是C
127.0.0.1:6379[2]> ttl k2(integer) 3097127.0.0.1:6379[2]> set k2 v2222OK127.0.0.1:6379[2]> ttl k2(integer) -1127.0.0.1:6379[2]>
在做一点扩展:如果set k2的新值与原先的值一样呢,这时候k2的值相当于没有变化,那么其过期时间会被消除掉吗?
答案是,无论你设置的新值与旧值是否相同,过期时间的设置都会被消除。
127.0.0.1:6379[2]> EXPIRE k2 3600(integer) 1127.0.0.1:6379[2]> ttl k2(integer) 3593127.0.0.1:6379[2]> ttl k2(integer) 3583127.0.0.1:6379[2]> set k2 v2222OK127.0.0.1:6379[2]> ttl k2(integer) -1127.0.0.1:6379[2]>
所以,将键重新赋予自己本身的值,可以作为一种消除过期时间的手段。但这是旁门左道,redis有将键的重新设置为永久有效的命令。
(6)将键设置为永久有效。
将键重新赋予自己本身的值,可以作为一种消除过期时间的手段。但正规的命令应该是:persist k1
127.0.0.1:6379[2]> get k1"v1"127.0.0.1:6379[2]> EXPIRE k1 5000(integer) 1127.0.0.1:6379[2]> ttl k1(integer) 4995127.0.0.1:6379[2]> PERSIST k1(integer) 1127.0.0.1:6379[2]> ttl k1(integer) -1127.0.0.1:6379[2]>
(7)查看某个键的类型
命令:type 【key名称】
我们查看之前的k2类型,是string类型;再设置一个k4类型,为4,结果还是string类型。还记得上一篇博客的redis五大数据类型吗?千万别还傻傻以为“是不是有可能会是integer”。
如果创建一个list,用lpush。我们可以看到其数据类型为list。
注意,查看list的时候不能用get,应该借助于lrange命令查看它的0到最后(用-1表示)的整个列表。
127.0.0.1:6379[2]> type k2string127.0.0.1:6379[2]> set k4 4OK127.0.0.1:6379[2]> type k4string127.0.0.1:6379[2]> 127.0.0.1:6379[2]> lpush k5 1 2 3 4 5(integer) 5127.0.0.1:6379[2]> type k5list127.0.0.1:6379[2]> lrange k5 0 -11) "5"2) "4"3) "3"4) "2"5) "1"
(8)最后拓展:
key的命令还有很多,你可以查阅redisdoc.com。下面列几个结束本文:
(1) pttl 查看某个键过期时间,但是单位是ms。
127.0.0.1:6379[2]> 127.0.0.1:6379[2]> EXPIRE k1 5000(integer) 1127.0.0.1:6379[2]> pttl k1(integer) 4993502127.0.0.1:6379[2]>
(2) del 删除键
127.0.0.1:6379[2]> del k1(integer) 1127.0.0.1:6379[2]> get k1(nil)127.0.0.1:6379[2]>
(3) dump 序列化某个键的值:注意是对值本身,而不是键;值相同,序列化值相同。
127.0.0.1:6379[2]> set k1 gdgdOK127.0.0.1:6379[2]> DUMP k1"\x00\x04gdgd\a\x00\xa1\xe6=s\xa9\xbf\x83\xec"127.0.0.1:6379[2]> set k6 abcOK127.0.0.1:6379[2]> DUMP k6"\x00\x03abc\a\x00&\x9e\xe5\xceI\xb8w\xf8"127.0.0.1:6379[2]> set k7 abcOK127.0.0.1:6379[2]> DUMP k7"\x00\x03abc\a\x00&\x9e\xe5\xceI\xb8w\xf8"127.0.0.1:6379[2]>
(4) expireat 把某个键设置过期时间,但过期的时间设置的是一个unix时间戳值,即一个具体的时刻。
127.0.0.1:6379[2]> EXPIREAT k1 1478357279(integer) 1127.0.0.1:6379[2]> ttl k1(integer) 23127.0.0.1:6379[2]> ttl k1(integer) 21127.0.0.1:6379[2]> ttl k1(integer) 15127.0.0.1:6379[2]> ttl k1(integer) 11127.0.0.1:6379[2]> ttl k1(integer) 8127.0.0.1:6379[2]> ttl k1(integer) 7127.0.0.1:6379[2]> ttl k1(integer) 3127.0.0.1:6379[2]> ttl k1(integer) 1127.0.0.1:6379[2]> ttl k1(integer) -2127.0.0.1:6379[2]> get k1(nil)127.0.0.1:6379[2]>
(5) pexpire 设置某个键的过期时间,但是单位是ms。
127.0.0.1:6379[2]> ttl k2(integer) -1127.0.0.1:6379[2]> PEXPIRE k2 500(integer) 1127.0.0.1:6379[2]> ttl k2(integer) -2127.0.0.1:6379[2]>