今天来学习redis的通用操作命名。
keys pattern 查询相应的key
在redis里,允许模糊查询key
有3个通配符 *, ? ,[]
*: 通配任意多个字符 (包括0个)
?: 通配单个字符(不包括0个)
[]: 通配括号内的某1个字符
启动redis服务器:
./bin/redis-server redis.conf
如果不加后面的配置文件redis.conf,就会找默认的配置文件了。
启动redis的客户端:
./bin/redis-cli
使用:keys *(查看当前数据库中的所有key)
使用正则表达式:
127.0.0.1:6379> KEYS *
1) "age"
2) "name"
127.0.0.1:6379> set agg 20
OK
127.0.0.1:6379> get agg
"20"
127.0.0.1:6379> keys *
1) "age"
2) "name"
3) "agg"
现在,目前有三个key了。
127.0.0.1:6379> keys age*
1) "age"
说明*能匹配0个字符
127.0.0.1:6379> keys ag*
1) "age"
2) "agg"
说明*能匹配一个字符
127.0.0.1:6379> set aggg 25
OK
127.0.0.1:6379> get aggg
"25"
127.0.0.1:6379> keys ag*
1) "age"
2) "aggg"
3) "agg"
说明能*能匹配多个字符
=====================================
127.0.0.1:6379> keys age?
(empty list or set)
说明?不能匹配0个字符!!!
127.0.0.1:6379> keys ag?
1) "age"
2) "agg"
127.0.0.1:6379>
说明?只能匹配一个字符
=====================================
127.0.0.1:6379> keys ag[gjer]
1) "age"
2) "agg"
[]:只能匹配[]中的一个字符
127.0.0.1:6379> keys *
1) "age"
2) "name"
3) "aggg"
4) "agg"
127.0.0.1:6379> keys ag[aekgllgg]
1) "age"
2) "agg"
[]中有两个gg,但是还是只能匹配一个g。
127.0.0.1:6379> keys ag[a-h]
1) "age"
2) "agg"
[a-h]:匹配a到h之间的一个字符
randomkey 返回随机key
127.0.0.1:6379> randomkey
"name"
127.0.0.1:6379> randomkey
"agg"
127.0.0.1:6379> randomkey
"age"
127.0.0.1:6379> randomkey
"aggg"
127.0.0.1:6379> randomkey
"name"
exists key [判断key是否存在]
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists nafdjkfjd
(integer) 0
127.0.0.1:6379> exists age name
(integer) 2
127.0.0.1:6379> exists age narefdf
(integer) 1
存在返回1,不存在返0,也可以测试多个key,存在几个key的话,就返回数字几。
type key [测试key的类型]
返回key存储的值的类型
有string , link , set , order set , hash
127.0.0.1:6379> type name
string
127.0.0.1:6379> type age
string
del key [key,···] 删除key
del key :删除一个key
del key1 key2 ···:删除多个key
127.0.0.1:6379> del aggg
(integer) 1
127.0.0.1:6379> del aggg
(integer) 0
删除成功,返回1;删除失败,返回0.
===========================================
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> set b 2
OK
127.0.0.1:6379> set c 3
OK
127.0.0.1:6379> keys *
1) "age"
2) "b"
3) "name"
4) "c"
5) "agg"
6) "a"
删除多个key
del a b c
127.0.0.1:6379> del a b c
(integer) 3
127.0.0.1:6379> del a b c
(integer) 0
如果要删除的多个key中,有不存在的key的话,就不会删除这个key。删除几个可以成功,就会返回数字几。
如果 a b 键存在,c不存在,那么就返回2。
127.0.0.1:6379> del a b c
(integer) 2
rename key newkey [修改key的名字]
127.0.0.1:6379> keys *
1) "age"
2) "name"
3) "agg"
127.0.0.1:6379>
127.0.0.1:6379> rename agg jidan
OK
127.0.0.1:6379> keys *
1) "age"
2) "jidan"
3) "name"
127.0.0.1:6379> rename zzz fdfdf
(error) ERR no such key
修改名字成功,返回ok。修改失败,返回:(error) ERR no such key
注意:如果新给的名字存在的话,那么会把已经存在的key的值给覆盖。
例如:如果 a 和 b 都存在的话,rename a b 的话,b里面的值就是a里面的值了。
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> get b
"2"
127.0.0.1:6379>
127.0.0.1:6379> rename a b
OK
127.0.0.1:6379> get a
(nil)
127.0.0.1:6379> get b
"1"
此时,a不存在了,b里面存在的是a以前的值。
renamenx key newkey [newkey存在的话,不覆盖]
renamenx 与 rename 的作用是一样的。
只是当newkey本身已经存在的话,是不会修改成功的。
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> get b
"2"
127.0.0.1:6379> renamenx a b
(integer) 0
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> get b
"2"
b已经存在了,所以不会修改名字成功。
127.0.0.1:6379> get c
(nil)
127.0.0.1:6379> renamenx a c
(integer) 1
127.0.0.1:6379> get a
(nil)
127.0.0.1:6379> get c
"1"
c不存在,所以修改a的名字为c成功。
move key db [移动key到指定的数据库中]
前提知识点:redis默认会创建16个数据库。编号是:0~15.
默认打开的是编号为0的数据库。
打开redis.conf配置文件:
127.0.0.1:6379> keys *
1) "b"
2) "age"
3) "jidan"
4) "name"
5) "c"
现在将 c 这个key 移动到数据库编号为1的数据中。
move c 1
127.0.0.1:6379> move c 1
(integer) 1
127.0.0.1:6379> get c
(nil)
切换到编号为1的数据库中:
select 1
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get c
"1"
切换成功后,在端口号后面有一个数字:[1]。
注意:( 一个redis进程,打开了不止一个数据库, 默认打开16个数据库,从0到15编号, 如果想打开更多数据库,可以从配置文件修改)
ttl key [查看key的过期时间]
ttl:返回的是key过期时间的单位是秒。
127.0.0.1:6379> keys *
1) "b"
2) "age"
3) "jidan"
4) "name"
127.0.0.1:6379> ttl name
(integer) -1
注意:如果key存在的话,-1:代表的是没有过期时间,即永久存在;如果key不存在的话,也会返回-1。所以-1会有歧义!!!
Redis2.8中,对于不存在的key,返回-2。
pttl key
pttl 与 ttl一样,都是返回一个key的过期时间,只是单位是毫秒。
expire key 整型值[设置key的过期时间]
作用: 设置key的生命周期,以秒为单位
127.0.0.1:6379> expire name 5
(integer) 1
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379> get name
(nil)
设置name的这个key的过期时间是:5秒。5秒过后就会删除name这个key。
pexpire key 毫秒数
作用: 设置key的生命周期,以毫秒为单位
127.0.0.1:6379> pexpire age 9000
(integer) 1
127.0.0.1:6379> ttl age
(integer) 6
127.0.0.1:6379> ttl age
(integer) 5
127.0.0.1:6379> ttl age
(integer) 4
127.0.0.1:6379> ttl age
(integer) 3
127.0.0.1:6379> ttl age
(integer) 1
127.0.0.1:6379> ttl age
(integer) -2
设置age的过期时间为:9000毫秒。
persist key[设置key为永久存在]
作用: 把指定key置为永久有效
127.0.0.1:6379> expire b 10
(integer) 1
127.0.0.1:6379> ttl b
(integer) 8
127.0.0.1:6379> ttl b
(integer) 6
127.0.0.1:6379> ttl b
(integer) 5
127.0.0.1:6379> ttl b
(integer) 4
127.0.0.1:6379> ttl b
(integer) 3
127.0.0.1:6379> persist b
(integer) 1
127.0.0.1:6379> ttl b
(integer) -1
设置b这个key的过期时间为:10秒,当b这个key快要过期的时候,将其设置为永久有效。
还有更多的通用keys的操作,如看redis的官网:
在图中,可以看到还有:expireat key timestamp [设置key的在哪个时间戳过期]、pexpireat key milliseconds-timestamp
redis> SET mykey "Hello"
"OK"
redis> EXISTS mykey
(integer) 1
redis> EXPIREAT mykey 1293840000
(integer) 1
redis> EXISTS mykey
(integer) 0
redis>
======================================
redis> SET mykey "Hello"
"OK"
redis> PEXPIREAT mykey 1555555555005
(integer) 1
redis> TTL mykey
(integer) 10097634
redis> PTTL mykey
(integer) 10097633581
redis>