3. 常用指令
在这部分中呢,我们家学习两个知识,第一个是key的常用指令,第二个是数据库的常用指令。和前面我们学数据类型做一下区分,前面你学的那些指令呢,都是针对某一个数据类型操作的,现在学的都是对所有的操作的,来看一下,我们在学习Key的操作的时候,我们先想一下的操作我们应该学哪些东西:
3.1 key 操作分析
3.1.1 key应该设计哪些操作?
key是一个字符串,通过key获取redis中保存的数据
对于key自身状态的相关操作,例如:删除,判定存在,获取类型等
对于key有效性控制相关操作,例如:有效期设定,判定是否有效,有效状态的切换等
对于key快速查询操作,例如:按指定策略查询key
3.1.2 key 基本操作
删除指定key
del key
获取key是否存在
exists key
获取key的类型
type key
127.0.0.1:6379> set name itheima
OK
127.0.0.1:6379> type name
string
127.0.0.1:6379> lpush list1 aa
(integer) 5
127.0.0.1:6379> type list1
list
127.0.0.1:6379> exists list1
(integer) 1
127.0.0.1:6379>
3.1.3 拓展操作
排序
sort
改名
rename key newkey
renamenx key newkey 存在改名
integer) 1
127.0.0.1:6379> rename list1 list2
OK
127.0.0.1:6379> lrange list1 0 -1
(empty list or set)
127.0.0.1:6379> lrange list2 0 -1
1) "aa"
2) "zl"
3) "ww"
4) "ls"
5) "zs"
127.0.0.1:6379> sort list1
(empty list or set)
127.0.0.1:6379> sort list2
(error) ERR One or more scores can't be converted into double
127.0.0.1:6379> sort list2 alpha
1) "aa"
2) "ls"
3) "ww"
4) "zl"
5) "zs"
127.0.0.1:6379> sort list2
(error) ERR One or more scores can't be converted into double
127.0.0.1:6379> lrange list2 0 -1
1) "aa"
2) "zl"
3) "ww"
4) "ls"
5) "zs"
127.0.0.1:6379> sort list2 alpha desc
1) "zs"
2) "zl"
3) "ww"
4) "ls"
5) "aa"
127.0.0.1:6379>
3.1.3 key 扩展操作(时效性控制)
为指定key设置有效期
expire key seconds
pexpire key milliseconds
expireat key timestamp
pexpireat key milliseconds-timestamp
127.0.0.1:6379> set dd 123
OK
127.0.0.1:6379> ttl dd
(integer) -1
127.0.0.1:6379> expire dd 10
(integer) 1
127.0.0.1:6379> ttl dd
(integer) 3
127.0.0.1:6379> ttl dd
(integer) 2
127.0.0.1:6379> ttl dd
(integer) 1
127.0.0.1:6379> ttl dd
(integer) -2
127.0.0.1:6379>
获取key的有效时间
ttl key
pttl key
127.0.0.1:6379> set aa 123
OK
127.0.0.1:6379> ttl aa
(integer) -1 -1代表永久有效
127.0.0.1:6379> ttl bb
(integer) -2 -2代表目前不存在
127.0.0.1:6379> setex cc 100 123
OK
127.0.0.1:6379> ttl cc
(integer) 96
127.0.0.1:6379> ttl cc
(integer) 95
127.0.0.1:6379> ttl cc
(integer) 94
127.0.0.1:6379> pttl cc
(integer) 84289
127.0.0.1:6379> pttl cc
(integer) 48043
127.0.0.1:6379>
切换key从时效性转换为永久性
persist key
(integer) -2
127.0.0.1:6379> set ee 123
OK
127.0.0.1:6379> ttl ee
(integer) -1
127.0.0.1:6379> expire ee 100
(integer) 1
127.0.0.1:6379> persist ee
(integer) 1
127.0.0.1:6379> expire ee 100
(integer) 1
127.0.0.1:6379> ttl ee
(integer) 96
127.0.0.1:6379> ttl ee
(integer) 95
127.0.0.1:6379> ttl ee
(integer) 94
127.0.0.1:6379> persist ee
(integer) 1
127.0.0.1:6379> ttl ee
(integer) -1
127.0.0.1:6379>
3.1.4 key 扩展操作(查询模式)
查询key
keys pattern
127.0.0.1:6379> keys *
1) "num"
2) "s2"
3) "id:001"
4) "setmealPicDbResources"
5) "set1"
6) "aa"
7) "s1"
8) "age"
9) "user"
10) "s4"
11) "user:123"
12) "name"
13) "k1"
14) "ee"
15) "setmealPicResources"
16) "k3"
17) "k2"
18) "list2"
19) "s3"
20) "k4"
21) "h1"
127.0.0.1:6379>
查询模式规则
*匹配任意数量的任意符号 ? 配合一个任意符号 [] 匹配一个指定符号
keys * keys 查询所有
it* keys 查询所有以it开头
*heima 查询所有以heima结尾
keys ??heima 查询所有前面两个字符任意,后面以heima结尾 查询所有以
keys user:? user:开头,最后一个字符任意
keys u[st]er:1 查询所有以u开头,以er:1结尾,中间包含一个字母,s或t
3.2 数据库指令
3.2.1 key 的重复问题
在这个地方我们来讲一下数据库的常用指令,在讲这个东西之前,我们先思考一个问题:
假如说你们十个人同时操作redis,会不会出现key名字命名冲突的问题。
一定会,为什么?因为你的key是由程序而定义的。你想写什么写什么,那在使用的过程中大家都在不停的加,早晚有一天他会冲突的。
redis在使用过程中,伴随着操作数据量的增加,会出现大量的数据以及对应的key。
那这个问题我们要不要解决?要!怎么解决呢?我们最好把数据进行一个分类,除了命名规范我们做统一以外,如果还能把它分开,这样是不是冲突的机率就会小一些了,这就是咱们下面要说的解决方案!
3.2.2 解决方案
redis为每个服务提供有16个数据库,编号从0到15
每个数据库之间的数据相互独立
在对应的数据库中划出一块区域,说他就是几,你就用几那块,同时,其他的这些都可以进行定义,一共是16个,这里边需要注意一点,他们这16个共用redis的内存。没有说谁大谁小,也就是说数字只是代表了一块儿区域,区域具体多大未知。这是数据库的一个分区的一个策略!
3.2.3 数据库的基本操作
切换数据库
select index
其他操作
ping
127.0.0.1:6379> set name1 123
OK
127.0.0.1:6379> get name
"itheima"
127.0.0.1:6379> get name1
"123"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get name1
(nil)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
3.2.4 数据库扩展操作
数据移动
move key db
数据总量
dbsize
数据清除
flushdb flushall
127.0.0.1:6379> set name1 123
OK
127.0.0.1:6379> get name
"itheima"
127.0.0.1:6379> get name1
"123"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get name1
(nil)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set name itheima
OK
127.0.0.1:6379> get name
"itheima"
127.0.0.1:6379> move name 1
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get name
"itheima"
127.0.0.1:6379[1]> dbsize
(integer) 1
127.0.0.1:6379[1]> set age 19
OK
127.0.0.1:6379[1]> dbsize
(integer) 2
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> set name itheima
OK
127.0.0.1:6379> get name
"itheima"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get name
"itheima"