bboyjing's blog

Redis学习笔记四【Redis命令(一)】

本章以及下面几章将介绍一些第一章没有出现过的常用命令,学习这些命令有助于构建更为复杂的应用。

字符串(STRING)

在Redis中字符串可以存储以下三种类型的值:

  • 字节串(byte string)
  • 整数
  • 浮点数

可以通过给定一个任意的数值,对存储这整数或者浮点数的字符串执行自增或者自减操作,下面列举一下相关命令并测试:

命令 描述
INCR 将键存储的值加上1
DECR 将键存储的值减去1
INCRBY 将键存储的值加上指定整数
DECRBY 将键存储的值减去指定整数
INCRBYFLOAT 将键存储的值加上指定浮点数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//尝试获取不存在的key,返回nil
127.0.0.1:6379> get incr_test
(nil)
//incr不存在的key,当前值当做0处理,返回+1之后的值
127.0.0.1:6379> incr incr_test
(integer) 1
//再次incr,返回2
127.0.0.1:6379> incr incr_test
(integer) 2
//最后测试下incr_test的值为2,正确
127.0.0.1:6379> get incr_test
"2"
...
//上述其余命令用法类似,如果需要,请自行测试吧。

除了自增、自减操作之外,Redis还拥有对字节串的其中一部分内容进行读取或写入的操作,下面列举处理字符串和二进制的命令并测试:

命令 描述
APPEND 将值追加到给定键当前存储的值的末尾
GETRANGE 获取一个由偏移量start至end范围内所有的字符组成的子串,包含start和end
SETRANGE 将从偏移量start开始的子串设置为给定值
GETBIT 将字节串看作是二进制位串,并返回指定偏移量的二进制位的值
SETBIT 将字节串看作是二进制位串,并设置指定偏移量的二进制位的值
BITCOUNT 统计二进制位串里面值为1的二进制位的数量
BITOP 位运算操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//将字符串追加到不存在的key里,返回字符串当前长度
127.0.0.1:6379> append new-string-key 'hello '
(integer) 6
127.0.0.1:6379> append new-string-key world!
(integer) 12
//Redis的索引以0开始,获取包含第三位到第七位子串
127.0.0.1:6379> getrange new-string-key 3 7
"lo wo"
//将第0位字符改成'H'
127.0.0.1:6379> setrange new-string-key 0 H
(integer) 12
127.0.0.1:6379> get new-string-key
"Hello world!"
//setrange既可以用于替换字符串里已有的内容,又可以用于增长字符串
127.0.0.1:6379> setrange new-string-key 11 ', how are you?'
(integer) 25
//将bit-key的第二位、第七位设置成1即00100001,键的值将变为"!",也就是编码为33的字符
127.0.0.1:6379> setbit bit-key 2 1
(integer) 0
127.0.0.1:6379> setbit bit-key 7 1
(integer) 0
127.0.0.1:6379> get bit-key
"!"
//获取bit-key中面值为1的二进制位的数量
127.0.0.1:6379> bitcount bit-key
(integer) 2

列表(LIST)

先列一些基本的常用命令,有些第一章已经接触过了,再回顾下:

命令 描述
RPUSH 将一个或多个值推入列表的右端
LPUSH 将一个或多个值推入列表的左端
RPOP 移除并返回最右端的元素
LPOP 移除并返回最左端的元素
LINDEX 返回列表中指定偏移量的元素
LRANGE 返回列表中指定偏移量范围的元素,包含首尾
LTRIM 对列表进行修改,保留指定偏移量范围的元素,包含首尾
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//向列表中推入元素
127.0.0.1:6379> rpush list-key last
(integer) 1
127.0.0.1:6379> lpush list-key first
(integer) 2
127.0.0.1:6379> rpush list-key 'new last'
(integer) 3
127.0.0.1:6379> lrange list-key 0 -1
1) "first"
2) "last"
3) "new last"
//弹出元素
127.0.0.1:6379> lpop list-key
"first"
127.0.0.1:6379> lpop list-key
"last"
127.0.0.1:6379> lrange list-key 0 -1
1) "new last"
//推入新元素
127.0.0.1:6379> rpush list-key a b c
(integer) 4
127.0.0.1:6379> lrange list-key 0 -1
1) "new last"
2) "a"
3) "b"
4) "c"
//从第二位开始截取List
127.0.0.1:6379> ltrim list-key 2 -1
OK
127.0.0.1:6379> lrange list-key 0 -1
1) "b"
2) "c"

有几个命令可以将元素从一个列表移动到另一个列表,或者阻塞执行命令的客户端,知道有其他客户端给列表添加元素为止:

命令 描述
BLPOP 从第一个非空列表中弹出最左端元素,或者在指定时间内阻塞并等待可弹出元素出现
BRPOP 从第一个非空列表中弹出最右端元素,或者在指定时间内阻塞并等待可弹出元素出现
RPOPLPUSH 从列表中弹出最右端元素,然后将弹出的元素推入到目标列表的最左端,并返回这个元素
BRPOPLPUSH 从列表中弹出最右端元素,然后将弹出的元素推入到目标列表的最左端,并返回这个元素;或者在指定时间内阻塞并等待可弹出元素出现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//构造测试数据
127.0.0.1:6379> rpush list item1
(integer) 1
127.0.0.1:6379> rpush list item2
(integer) 2
127.0.0.1:6379> rpush list2 item3
(integer) 1
//将list2最右端的元素移到list最左端,并返回该元素
127.0.0.1:6379> brpoplpush list2 list 1
"item3"
127.0.0.1:6379> lrange list 0 -1
1) "item3"
2) "item1"
3) "item2"
//当列表不包含元素时,会在给定时间内等待可弹出元素出现,当时限到达后返回nil
127.0.0.1:6379> brpoplpush list2 list 1
(nil)
(1.00s)
//构造测试blpop数据
127.0.0.1:6379> brpoplpush list list2 1
"item2"
//从左到右检测,对第一个遇到的非空队列进行弹出操作,并返回非空队列的key和弹出元素
127.0.0.1:6379> blpop list list2 1
1) "list"
2) "item3"
127.0.0.1:6379> blpop list list2 1
1) "list"
2) "item1"
127.0.0.1:6379> blpop list list2 1
1) "list2"
2) "item2"
//若传入的队列都为空,操作阻塞至给定时间后返回nil
127.0.0.1:6379> blpop list list2 1
(nil)
(1.04s)

集合(SET)

命令 描述
SADD 将元素添加到集合中,返回该元素在集合中的数量
SREM 从集合中删除元素,返回被删除元素的数量
SISMEMBER 检查元素是否存在于集合中
SCARD 返回集合中包含给定元素的数量
SMEMBERS 返回集合包含的所有元素
SRANDOMEMBER 从集合里随机返回一个或多个元素
SPOP 随机地移除集合中的一个元素,并返回被删除的元素
SMOVE 将集合中的一个元素移除到另一个集合,返回是否成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//向集合中添加元素
127.0.0.1:6379> sadd set-key a b c
(integer) 3
//删除集合中的元素
127.0.0.1:6379> srem set-key c d
(integer) 1
127.0.0.1:6379> srem set-key c d
(integer) 0
//获取集合中元素的个数
127.0.0.1:6379> scard set-key
(integer) 2
//获取集合中的元素
127.0.0.1:6379> smembers set-key
1) "b"
2) "a"
//将元素移到另一个集合
127.0.0.1:6379> smove set-key set-key2 a
(integer) 1
127.0.0.1:6379> smove set-key set-key2 c
(integer) 0
127.0.0.1:6379> smembers set-key2
1) "a"

集合真正厉害的地方在于组合关联多个集合,下面列举并测试:

命令 描述
SDIFF 返回存在于第一个集合,但不存在于其他集合中的元素
SDIFFSTORE 将存在于第一个集合,但不存在于其他集合中的元素存储到给定key中
SINTER 返回同时存在所有集合中的元素
SINTERSTORE 将同时存在于所有集合的元素存储到给定key中
SUNION 返回至少存在于一个集合中的元素
SUNIONSTORE 将至少存在于一个集合的元素存储到给定key中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//准备测试元素
127.0.0.1:6379> sadd skey-1 a b c d
(integer) 4
127.0.0.1:6379> sadd skey-2 c d e f
(integer) 4
//存在第一个集合,但不存在其他集合的元素
127.0.0.1:6379> sdiff skey-1 skey-2
1) "a"
2) "b"
//同时存在于所有集合的元素
127.0.0.1:6379> sinter skey-1 skey-2
1) "d"
2) "c"
//两个集合包含的所有不相同的元素
127.0.0.1:6379> sunion skey-1 skey-2
1) "b"
2) "c"
3) "e"
4) "a"
5) "f"
6) "d"

下一章将继续学习Redis其他数据结构的命令。