Reids 列表与集合命令使用

Posted by 暮夏有五 on 2021-01-25
Estimated Reading Time 7 Minutes
Words 1.7k In Total
Viewed Times

列表


列表是 Redis 中另外一种数据类型。下面我们来看看列表中一些基本的操作命令。

lpush

将一个或多个值 value 插入到列表 key 的表头,如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头,如下:

1
2
127.0.0.1:6379> lpush k1 v1 v2 v3
(integer) 3

lrange

返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定,下标 (index) 参数 start 和 stop 都以 0 为底,即 0 表示列表的第一个元素,1 表示列表的第二个元素,以此类推。我们也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。如下:

1
2
3
4
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "v2"
3) "v1"

prush

prush 与 lpush 的功能基本一致,不同的是 prush 的中的 value 值是按照从右到左的顺序依次插入,如下:

1
2
3
4
5
6
7
8
127.0.0.1:6379> prush k2 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lpush k2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

drop

drop 命令可以移除并返回列表 key 的尾元素。如下:

1
2
3
4
5
6
7
127.0.0.1:6379> drop k2
"5"
127.0.0.1:6379> lrange k2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"

lpop

lpop 和 rpop 类似,不同的是 lpop 移除并返回列表 key 的头元素,如下:

1
2
3
4
5
6
127.0.0.1:6379> lpop  k2
"1"
127.0.0.1:6379> lrange k2 0 -1
1) "2"
2) "3"
3) "4"

lindex

lindex 命令可以返回列表 key 中,下标为 index 的元素,正数下标 0 表示第一个元素,也可以使用负数下标,-1 表示倒数第一个元素,如下:

1
2
3
4
127.0.0.1:6379> lindex k2 0
"2"
127.0.0.1:6379> lindex k2 -1
"4"

ltrim

ltrim 命令可以对一个列表进行修剪,即让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。下标与之前介绍的写法都一致,这里不赘述。如下:

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> ltrim k1 0 1
OK
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "v2"

blpop

blpop 是阻塞式列表的弹出原语。它是命令 lpop 的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 blpop 命令阻塞。当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。同时,在使用该命令时也需要指定阻塞的时长,时长单位为秒,在该时长内如果没有元素可供弹出,则阻塞结束。返回的结果是 key 和 value 的组合,如下:

1
2
3
4
5
6
127.0.0.1:6379> blpop k1 10
1) "k1"
2) "v2"
127.0.0.1:6379> blpop k1 10
(nil)
(10.03s)

最后,brpop、bpoplpush、brpoplpush 都是相应命令的阻塞版本,这里就不赘述了。

集合


接下来我们来看看集合中一些常见的操作命令:

sadd

sadd 命令可以添加一个或多个指定的 member 元素到集合的 key 中,指定的一个或者多个元素 member 如果已经在集合 key 中存在则忽略,如果集合 key 不存在,则新建集合 key ,并添加 member 元素到集合 key 中。如下:

1
2
127.0.0.1:6379> SADD k1 v1 v2 v3 v4
(integer) 4

srem

srem 命令可以在 key 集合中移除指定的元素,如果指定的元素不是 key 集合中的元素则忽略。如果 key 集合不存在则被视为一个空的集合,该命令返回 0 。如下:

1
2
3
4
127.0.0.1:6379> srem k1 v2
(integer) 1
127.0.0.1:6379> srem k1 v10
(integer) 0

sismember

sismember 命令可以返回成员 member 是否是存储的集合 key 的成员。如下:

1
2
127.0.0.1:6379> sismember k1 v3
(integer) 1

scard

scard 命令可以返回集合存储的 key 的基数(集合元素的数量),如下:

1
2
127.0.0.1:6379> scard k1
(integer) 3

smembers

smembers 命令可以返回 key 集合所有的元素,如下:

1
2
3
4
127.0.0.1:6379> smembers k1
1) "v4"
2) "v1"
3) "v3"

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
127.0.0.1:6379> srandmember k1
"v4"
127.0.0.1:6379> srandmember k1 2
1) "v4"
2) "v1"
127.0.0.1:6379> srandmember k1 5
1) "v4"
2) "v1"
3) "v3"
127.0.0.1:6379> srandmember k1 -1
1) "v4"
127.0.0.1:6379> srandmember k1 -5
1) "v3"
2) "v1"
3) "v1"
4) "v3"
5) "v3"

spop

spop 命令的用法和 srandmember 类似,不同的是,spop 每次选择一个随机的元素之后,该元素会出栈,而 srandmember 则不会出栈,只是将该元素展示出来。

smove

smove 命令可以将 member 从 source 集合移动到 destination 集合中,如下:

1
2
3
4
5
6
7
127.0.0.1:6379> smove k1 k2 v1
(integer) 1
127.0.0.1:6379> smembers k1
1) "v4"
2) "v3"
127.0.0.1:6379> smembers k2
1) "v1"

sdiff

sdiff 可以用来返回一个集合与给定集合的差集的元素,如下:

1
2
3
127.0.0.1:6379> sdiff k1 k2
1) "v4"
2) "v3"

k1 中的元素是 v3、v4,k2 中的元素是 v1,差集就是 v3、v4.

sdiffstore

sdiffstore 命令与 sdiff 命令基本一致,不同的是 sdiffstore 命令会将结果保存在一个集合中,如下:

1
2
3
4
5
127.0.0.1:6379> sdiffstore key k1 k2
(integer) 2
127.0.0.1:6379> smembers key
1) "v4"
2) "v3"

sinter

sinter 命令可以用来计算指定 key 之间元素的交集,如下:

1
2
3
4
5
6
7
8
127.0.0.1:6379> smembers k1
1) "v4"
2) "v3"
127.0.0.1:6379> smembers k2
1) "v1"
2) "v3"
127.0.0.1:6379> sinter k1 k2
1) "v3"

sinterstore

sinterstore 命令和 sinter 命令类似,不同的是它会将结果保存到一个新的集合中,如下:

1
2
3
4
127.0.0.1:6379> sinterstore k3 k1 k2
(integer) 1
127.0.0.1:6379> smembers k3
1) "v3"

sunion

sunion 可以用来计算两个集合的并集,如下:

1
2
3
4
127.0.0.1:6379> sunion k1 k2
1) "v4"
2) "v1"
3) "v3"

sunionstore

sunionstore 和 sunion 命令类似,不同的是它会将结果保存到一个新的集合中,如下:

1
2
3
4
5
6
127.0.0.1:6379> sunionstore k4 k1 k2
(integer) 3
127.0.0.1:6379> smembers k4
1) "v4"
2) "v1"
3) "v3"

更多命令可以参考官方文档

更多干货请移步:https://antoniopeng.com


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !