set 数据类型
前面我们提到了 list 链表数据类型,它本质是双向链表,这种数据类型拥有 有序性 和 可重复性 的特性。
set 数据类型与 list 数据类型大致相同,但它拥有 无序性 和 不可重复性(或称 唯一性)的特性,即在 set 数据类型的底层中,其仅存储 key,不存储 value(因为都是 nil)。
-----------------------------
| -------- --------- |
| | key1 | | (nil) | |
| -------- --------- |
| |
| -------- --------- |
| | key2 | | (nil) | |
------- | -------- --------- |
| key | | |
------- | |
| -------- --------- |
| | key3 | | (nil) | |
| -------- --------- |
| |
| -------- --------- |
| | key4 | | (nil) | |
| -------- --------- |
| |
-----------------------------
在 list 数据类型中,每一个数据被称为 元素;但在 set 数据类型中,每一个数据被称为 成员 。每一个 set 数据类型可以容纳 2^32-1 个成员。
sadd
命令
该命令用来向 set 数据类型中添加一个或多个成员。如果 key 不存在,则创建 key ;如果使用 sadd
命令添加一个或多个已经存在的成员,则会添加失败(命令执行后返回 0 )。
192.168.100.3:6379> select 3
OK
192.168.100.3:6379[3]> help sadd
SADD key member [member ...]
summary: Adds one or more members to a set. Creates the key if it doesn't exist.
since: 1.0.0
group: set
192.168.100.3:6379[3]> sadd department:name IT HR finance logistics
(integer) 4
192.168.100.3:6379[3]> sadd department:name other
(integer) 1
192.168.100.3:6379[3]> sadd department:name other
(integer) 0
smembers
命令
该用来用来查看 set 数据类型中的所有成员。
192.168.100.3:6379[3]> smembers department:name
1) "IT"
2) "HR"
3) "finance"
4) "logistics"
5) "other"
scard
命令
该命令用来查看成员的个数。
192.168.100.3:6379[3]> scard department:name
(integer) 5
sismember
命令
该命令用来判断单个成员是否存在。若成员存在,返回 1 ;若成员不存在,返回 0 。
192.168.100.3:6379[3]> sismember department:name IT
(integer) 1
192.168.100.3:6379[3]> sismember department:name sale
(integer) 0
smove
命令
在同一个库中,针对两个 set 数据类型,将源 key 中的单个成员移动到目标 key 中。
# 创建一个新的 set 数据类型
192.168.100.3:6379[3]> sadd company:name wanmei
(integer) 1
192.168.100.3:6379[3]> smove department:name company:name IT
(integer) 1
192.168.100.3:6379[3]> smembers company:name
1) "wanmei"
2) "IT"
192.168.100.3:6379[3]> smembers department:name
1) "HR"
2) "finance"
3) "logistics"
4) "other"
srem
命令
该命令用来删除 key 中的一个或多个成员,命令返回的是实际被删除的成员数量。
192.168.100.3:6379[3]> srem department:name other logistics
(integer) 2
192.168.100.3:6379[3]> smembers department:name
1) "HR"
2) "finance"
为了方便后面演示,将删除的数据重新添加:
192.168.100.3:6379[3]> sadd department:name IT other logistics
(integer) 3
192.168.100.3:6379[3]> smembers department:name
1) "HR"
2) "finance"
3) "IT"
4) "other"
5) "logistics"
srandmember
命令
该命令用来随机获取一个或多个成员。参数 count 是可选的,不键入则默认为 1 。count 可以是正整数和负整数,请注意!指定为负整数后返回的成员可能会有重复。
# 这里的 count 指定为 2
192.168.100.3:6379[3]> srandmember department:name 2
1) "finance"
2) "logistics"
192.168.100.3:6379[3]> srandmember department:name 2
1) "HR"
2) "other
# 如果命令指定的成员数超过了 set 里面的成员数,则会显示所有的成员。
192.168.100.3:6379[3]> srandmember department:name 10
1) "HR"
2) "finance"
3) "IT"
4) "other"
5) "logistics"
# count 为负整数
192.168.100.3:6379[3]> srandmember department:name -10
1) "finance"
2) "finance"
3) "HR"
4) "IT"
5) "IT"
6) "other"
7) "finance"
8) "finance"
9) "logistics"
10) "logistics"
spop
命令
随机弹出 set 数据类型中的一个或多个成员。命令执行后返回的是已经被弹出的成员。参数 count 是可选的,不键入则默认为 1,必须为正整数。如果命令指定的 count 大于了 set 数据类型中的成员数,则会将所有成员弹出,所有成员被弹出后,key 则会被删除。
192.168.100.3:6379[3]> spop department:name 2
1) "IT"
2) "logistics"
192.168.100.3:6379[3]> SMEMBERS department:name
1) "HR"
2) "finance"
3) "other"
# 弹出剩余的 3 个成员,由于没有了成员,因此 department:name 这个 key 被删除
192.168.100.3:6379[3]> spop department:name 3
1) "HR"
2) "finance"
3) "other"
192.168.100.3:6379[3]> keys *
1) "company:name"
与数学集合相关的命令
请注意!这里的集合命令针对的是 2 个或 2 个以上的 key。
交集:两个或多个集合的共有元素所组成的集合。在关系型数据库管理系统中,用在查询语句的 内连接 当中。
并集:将两个或多个集合中的所有元素合并在一起所组成的集合。在关系型数据库管理系统中,用在查询语句的 全连接 当中。
set 数据类型交集所使用的命令为 sinter
,将交集的结果保存所使用的命令为 sinterstore
。
set 数据类型并集所使用的命令为 sunion
,将交集的结果保存所使用的命令为 sunionstore
。
# 添加第一个 set 并拥有 6 个成员
192.168.100.3:6379[3]> sadd test:1 a b c d e f
(integer) 6
192.168.100.3:6379[3]> SMEMBERS test:1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
# 添加第二个 set 并拥有 7 个成员
192.168.100.3:6379[3]> sadd test:2 c d e f x y z
(integer) 7
192.168.100.3:6379[3]> smembers test:2
1) "c"
2) "d"
3) "e"
4) "f"
5) "x"
6) "y"
7) "z"
# 交集。sinter 命令执行之后返回的是交集结果
192.168.100.3:6379[3]> sinter test:1 test:2
1) "c"
2) "d"
3) "e"
4) "f"
## 保存交集结果到另外一个 key 中
192.168.100.3:6379[3]> sinterstore k1 test:1 test:2
(integer) 4
192.168.100.3:6379[3]> smembers k1
1) "c"
2) "d"
3) "e"
4) "f"
# 并集。sunion 命令执行之后返回的是并集结果
192.168.100.3:6379[3]> sunion test:1 test:2
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
7) "x"
8) "y"
9) "z"
## 保存并集结果到另外一个 key 中
192.168.100.3:6379[3]> sunionstore k2 test:1 test:2
(integer) 9
192.168.100.3:6379[3]> smembers k2
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
7) "x"
8) "y"
9) "z"
sdiff
命令和 sdiffstore
命令
针对两个或多个 key ,返回除共有成员之外的成员,依据 key 输入位置的不同,返回不同的结果。
# 返回 test:1 中除公共成员外的成员
192.168.100.3:6379[3]> sdiff test:1 test:2
1) "a"
2) "b"
## 将差异结果保存到另外一个 key 中
192.168.100.3:6379[3]> sdiffstore k3 test:1 test:2
(integer) 2
192.168.100.3:6379[3]> smembers k3
1) "a"
2) "b"
# 返回 test:2 中除公共成员外的成员
192.168.100.3:6379[3]> sdiff test:2 test:1
1) "x"
2) "y"
3) "z"
## 将差异结果保存到另外一个 key 中
192.168.100.3:6379[3]> sdiffstore k4 test:2 test:1
(integer) 3
192.168.100.3:6379[3]> smembers k4
1) "x"
2) "y"
3) "z"