述
前文中,介绍了String数据类型的一些常用的命令,那么下面来看一下一些针对列表与集合的常用命令
列表(list)
列表是Redis中另外一种数据类型,下面我们来看看列表中一些基本的操作命令
lpush
语法如下:1
LPUSH key value [value ...]
将一个或多个值插入到列表key的表头,如果有多个value,则会按从左到右的顺序依次插入表头,具体使用如下:1
2
3
4
5
6
7
8172.16.12.3:6379> lpush k1 v1 v2 v3
(error) WRONGTYPE Operation against a key holding the wrong kind of value
172.16.12.3:6379> del k1
(integer) 1
172.16.12.3:6379> lpush k1 v1 v2 v3
(integer) 3
172.16.12.3:6379> lpush k1 v4 v5
(integer) 5
来看一下上面的命令,我在第一次执行的时候,报了一个错,因为我们之前k1对应的值不是一个list,就会报错.
第二点,lpush命令的返回值是push操作后的list的长度,如上面,我第一次push了3个value进去, 长度就是3,然后又加了两个.那长度就是5
lrange
返回列表key中的指定 区间内的元素,区间以偏移量start和stop指定,start和stop都以0开始,即0代表第一个元素,1代表第二个元素… 以此类推,也可以使用负数作为下标,以-1表示列表的最后一个元素,-2表示倒数第二个元素…. 以此类推,具体使用如下:1
2
3
4
5
6
7
8
9
10
11172.16.12.3:6379> lrange k1 0 -2
1) "v5"
2) "v4"
3) "v3"
4) "v2"
172.16.12.3:6379> lrange k1 0 5
1) "v5"
2) "v4"
3) "v3"
4) "v2"
5) "v1"
rpush
rpush和lpush的功能基本一致,只不过rpush中,value是按照从右到左的顺序依次插入的,使用如下:1
2
3
4
5
6
7
8
9
10
11
12172.16.12.3:6379> get k2
"c"
172.16.12.3:6379> del k2
(integer) 1
172.16.12.3:6379> rpush k2 1 2 3 4 5
(integer) 5
172.16.12.3:6379> lrange k2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
rpop
rpop命令,可以移除列表中最后一个元素,并且返回该元素的值,使用如下:1
2
3
4
5
6
7
8172.16.12.3:6379> rpop k2
"5"
172.16.12.3:6379> lrange k2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
172.16.12
lpop
lpop和rpop类似,只不过移除的是列表中的第一个元素,使用如下:1
2
3
4
5
6172.16.12.3:6379> lpop k2
"1"
172.16.12.3:6379> lrange k2 0 -1
1) "2"
2) "3"
3) "4"
lindex
lindex命令,可以返回指定下标对应的元素的值,可以用正数下标,0表示第一个元素,也可以用负数下标, -1表示最后一个元素,使用如下:1
2
3
4172.16.12.3:6379> lindex k2 0
"2"
172.16.12.3:6379> lindex k2 -1
"4"
ltrim
ltrim命令,可以对一个列表进行修剪,需要指定一个下标开始值和结束值, 不在这个区间的元素都会被删除掉, 下标的取值和上面都一样的,使用如下:
1 | 172.16.12.3:6379> lrange k1 0 -1 |
blpop
BLPOP是阻塞式列表的弹出原语,blpop是lpop的阻塞版本
当给定列表内,没有任何元素可以供弹出的时候,连接将被blpop命令阻塞, 当 给定的是多个key时,按参数key的先后顺序依次检查各个列表,弹出一个非空列表的第一个元素
使用这个命令的时候,需要指定阻塞的时长,单位是秒,如果在规定时间内没有元素可供弹出,则阻塞结束,返回结果是key-value的组合,具体使用如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16172.16.12.3:6379> lrange k1 0 -1
1) "v5"
2) "v4"
3) "v3"
172.16.12.3:6379> blpop k1 5
1) "k1"
2) "v5"
172.16.12.3:6379> blpop k1 5
1) "k1"
2) "v4"
172.16.12.3:6379> blpop k1 5
1) "k1"
2) "v3"
172.16.12.3:6379> blpop k1 5
(nil)
(5.02s)
来看一下上面的命令,最开始集合是有三个元素的,然后每次给定阻塞时长是5秒,弹出第一个元素,然后一共执行三次,列表中也就没有元素了,这时候,执行第四次弹出的操作,就可以看到,这里阻塞了5秒中之后,发现,还是没有可以弹出的元素,然后就阻塞结束,返回nil了
集合(set)
接下来看一些针对集合的操作命令
sadd
sadd命令,可以添加一个或多个指定的member元素到集合的key中, 如果值在这个集合中存在的话就忽略掉,如果集合key不存在就先新建集合,然后添加member元素到集合,具体使用如下:
1 | 172.16.12.3:6379> sadd k1 v1 v2 |
第一个命令添加了v1,v2,然后下面又去添加v2,是直接被忽略掉了,已经存在的元素不会被加进去, 这里的返回值是新添加到集合里的元素的数量,不包括已经存在于集合中的元素
srem
srem命令可以在key集合中移除指定的元素,如果指定的元素不存在,则忽略,如果key集合不存在,则被视为一个空的集合,返回0,使用如下:1
2
3
4172.16.12.3:6379> srem k1 v1
(integer) 1
172.16.12.3:6379> srem k1 v3
(integer) 0
sismember
sismember可以返回指定的值,是不是这个key里面的成员 ,使用如下:1
2
3
4172.16.12.3:6379> sismember k1 v3
(integer) 0
172.16.12.3:6379> sismember k1 v2
(integer) 1
v3是不在k1这个集合中的, 所以返回0 , v2存在,就返回1
scard
scard 命令可以返回指定集合中的元素的数量,如下:1
2
3
4
5
6172.16.12.3:6379> scard k1
(integer) 1
172.16.12.3:6379> sadd k1 v1
(integer) 1
172.16.12.3:6379> scard k1
(integer) 2
可以看到,最开始元素的数量是1,然后添加一个元素进去,再查一下就是2了.
smember
smember命令,可以返回指定key集合中的所有元素,如下:1
2
3
4
5
6
7
8
9172.16.12.3:6379> sadd k1 v3 v4 v5 v6
(integer) 4
172.16.12.3:6379> smembers k1
1) "v4"
2) "v1"
3) "v3"
4) "v5"
5) "v6"
6) "v2"
srandmember
srandmember命令,传入key的名称,然后会随机返回key集合中的一个元素,从redis2.6开始,这个命令可以指定返回元素的个数(count)
count参数详解:
- 如果是整数且小于元素的个数,就会返回count个随机元素
- 如果count是整数且大于集合中元素的个数时,则返回集合中的所有元素
- 当count是负数,则会返回一个包含count的绝对值的个数元素的数组
- 如果count的绝对值大于元素的个数,则返回的结果集里会出现一个元素出现多次的情况
如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24172.16.12.3:6379> srandmember k1
"v2"
172.16.12.3:6379> srandmember k1 2
1) "v5"
2) "v4"
172.16.12.3:6379> srandmember k1 9
1) "v2"
2) "v6"
3) "v4"
4) "v5"
5) "v3"
6) "v1"
172.16.12.3:6379> srandmember k1 -1
1) "v6"
172.16.12.3:6379> srandmember k1 -9
1) "v3"
2) "v1"
3) "v5"
4) "v4"
5) "v1"
6) "v4"
7) "v4"
8) "v2"
9) "v3"
spop
spop命令和srandmember类似,不同的是 spop每次返回的元素都会被从这个集合中移除掉,如下:1
2
3
4
5
6
7
8172.16.12.3:6379> spop k1
"v3"
172.16.12.3:6379> SMEMBERS k1
1) "v5"
2) "v6"
3) "v2"
4) "v4"
5) "v1"
sdiff
sdiff用来取两个集合的差集,如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15172.16.12.3:6379> smembers k1
1) "v5"
2) "v6"
3) "v2"
4) "v4"
5) "v1"
172.16.12.3:6379> smembers k2
1) "v7"
2) "v2"
3) "v3"
172.16.12.3:6379> sdiff k1 k2
1) "v5"
2) "v6"
3) "v1"
4) "v4"
sdiffstore
sdiffstore和sdiff命令基本一致,不同的是会把返回的结果保存在一个新的集合中,使用如下:1
2
3
4
5
6
7
8
9
10
11
12172.16.12.3:6379> sdiff k1 k2
1) "v5"
2) "v6"
3) "v1"
4) "v4"
172.16.12.3:6379> sdiffstore k3 k1 k2
(integer) 4
172.16.12.3:6379> smembers k3
1) "v5"
2) "v6"
3) "v1"
4) "v4"
sinter
sinter命令,用来计算指定集合的交集,如下:1
2
3
4
5
6
7
8
9
10
11
12172.16.12.3:6379> smembers k1
1) "v5"
2) "v6"
3) "v2"
4) "v4"
5) "v1"
172.16.12.3:6379> smembers k2
1) "v7"
2) "v2"
3) "v3"
172.16.12.3:6379> sinter k1 k2
1) "v2"
sinterstore
sinterstore命令,和上面的sinter类似,但是会把返回值保存到一个新的集合中,如下:1
2
3
4172.16.12.3:6379> sinterstore k4 k1 k2
(integer) 1
172.16.12.3:6379> smembers k4
1) "v2"
sunion
用来计算集合的并集,如下:1
2
3
4
5
6
7
8172.16.12.3:6379> sunion k1 k2
1) "v5"
2) "v6"
3) "v2"
4) "v4"
5) "v3"
6) "v7"
7) "v1"
sunionstore
sunionstore和sunion类似,但是会把返回结果保存在一个新的集合中,如下:1
2
3
4
5
6
7
8
9
10172.16.12.3:6379> sunionstore k5 k1 k2
(integer) 7
172.16.12.3:6379> smembers k5
1) "v5"
2) "v6"
3) "v2"
4) "v4"
5) "v3"
6) "v7"
7) "v1"
关于list和set的一些常用命令就说这么多,主要就是一些添加,删除,交集并集差集的操作