前言

Set,即集合,与数学中的集合概念一致,不过Redis Set中包含的元素类型是string。Set中元素值是唯一的,不能出现重复的数据。下面就来看下Set基本类型相关的指令吧。

SADD

可用版本:>= 1.0.0

时间复杂度: 添加一个元素的复杂度为O(1),添加N个元素的复杂度为O(N)

命令格式

1
SADD key member [member ...]

命令描述

  • 将一个或多个member元素添加至key对应的集合中,如果集合中已经存在member元素,本次操作会被忽略
  • 如果key对应的集合不存在,会创建一个空集合,然后把member元素插入
  • 如果key对应的不是集合类型,会返回错误

返回值

整数值:真正插入到列表的中元素个数(已经存在列表的元素不会被插入)

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 添加一个元素
127.0.0.1:6379> sadd myset hello
(integer) 1

# 添加两个元素,‘hello’已存在,只会添加一个
127.0.0.1:6379> sadd myset hello world
(integer) 1

# 查看所有元素
127.0.0.1:6379> smembers myset
1) "hello"
2) "world"

SMEMBERS

可用版本:>= 1.0.0

时间复杂度:O(N),N为集合大小

命令格式

1
SMEMBERS key

命令描述

  • 返回key对应集合中的所有元素
  • 这个命令会返回所有元素,如果集合较大,会影响Redis性能,建议线上不要使用这个命令,可以使用SSCAN命令代替

返回值

数组:集合中所有元素

示例

1
2
3
4
5
6
7
127.0.0.1:6379> sadd myset hello world
(integer) 1

# 查看所有元素
127.0.0.1:6379> smembers myset
1) "hello"
2) "world"

SISMEMBER

可用版本:>= 1.0.0

时间复杂度:O(1)

命令格式

1
SISMEMBER key member

命令描述

  • 判断member是否为key集合中的元素

返回值

1:member是集合中的元素

0:集合不存在或者member不是集合中的元素

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
127.0.0.1:6379> sadd myset hello world
(integer) 0

# 不是集合中的元素
127.0.0.1:6379> sismember myset west
(integer) 0

# 是集合中的元素
127.0.0.1:6379> sismember myset hello
(integer) 1

SMISMEMBER

可用版本:>= 6.2.0

时间复杂度:O(N),N为提供的元素数量

命令格式

1
SMISMEMBER key member [member ...]

命令描述

  • 判断给定的多个member是否为key集合中的元素

  • 对于每一个member元素,返回1表示存在集合key中,当不在集合中或者集合本身就不存在时,返回0

返回值

数组:由1和0组成,与member数量一致,且位置一一对应,表示对应位置的member是否在集合中。

示例

1
2
3
4
5
6
7
127.0.0.1:6379> sadd member_set hello world
(integer) 2

# hello在集合中
127.0.0.1:6379> smismember member_set hello lifelmy
1) (integer) 1
2) (integer) 0

SPOP

可用版本:>= 1.0.0

时间复杂度:未提供count值时,复杂度为O(1);提供count值时,复杂度为O(N),N为返回元素的个数

3.2.0版本后增加可选参数count

命令格式

1
SPOP key [count]

命令描述

  • 从集合中随机移除一个元素,并返回该元素值

  • 如果只想返回元素但不移除,使用 SRANDMEMBER 命令

  • 默认移除并返回一个元素,指定count后返回count个元素;若count大于集合长度时,返回集合中所有元素

返回值

未指定count时:返回元素值或者nil(key不存在)

指定count时:移除的元素集合或者空集合(key不存在)

示例

 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 myset1 hello
(integer) 1
127.0.0.1:6379> sadd myset1 world
(integer) 1
# 随机移除并返回一个值
127.0.0.1:6379> spop myset1
"world"

127.0.0.1:6379> sadd myset1 lifelmy
(integer) 1
127.0.0.1:6379> smembers myset1
1) "lifelmy"
2) "hello"

# count大于集合长度时
127.0.0.1:6379> spop myset1 3
1) "lifelmy"
2) "hello"

# 不存在的集合
127.0.0.1:6379> spop notexist 2
(empty array)

SRANDMEMBER

可用版本:>= 1.0.0

时间复杂度:未提供count值时,复杂度为O(1);提供count值时,复杂度为O(N),N为返回元素的个数

命令格式

1
SRANDMEMBER key [count]

命令描述

  • 未指定count值时,随机返回集合中一个元素值

  • count为正数时,且小于等于集合长度时,返回大小为count的集合,集合中元素各不相同;如果count大于集合长度,则返回集合中全部元素

  • count为负数时,那么命令返回一个数组,数组中的元素可能会重复出现多次,数组的长度为 count 的绝对值。

返回值

未指定count时:返回随机元素值或者nil(当集合不存在时)

指定count时:返回的元素集合或者空集合(当集合不存在时)

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
127.0.0.1:6379> sadd myset2 hello
(integer) 1
127.0.0.1:6379> sadd myset2 world
(integer) 1

# 未指定count参数
127.0.0.1:6379> srandmember myset2
"hello"

# count大于列表长度
127.0.0.1:6379> srandmember myset2 3
1) "hello"
2) "world"

# count为负数
127.0.0.1:6379> srandmember myset2 -3
1) "hello"
2) "world"
3) "world"

SREM

可用版本:>= 1.0.0

时间复杂度:O(N),N为给定的元素数量

命令格式

1
SREM key member [member ...]

命令描述

  • 从集合中移除给定的元素值member

  • 给定的元素值member不属于该集合时,会忽略该元素

  • 给定key集合不存在时,会被当成空集合来处理

  • key对应的不是集合类型时,返回错误

返回值

整数值:真正从集合中移除的元素个数

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
127.0.0.1:6379> sadd myset3 hello
(integer) 1
127.0.0.1:6379> sadd myset3 world
(integer) 1
127.0.0.1:6379> smembers myset3
1) "hello"
2) "world"

# 移除一个元素
127.0.0.1:6379> srem myset3 hello
(integer) 1
127.0.0.1:6379> smembers myset3
1) "world"

# 移除不存在的元素
127.0.0.1:6379> srem myset3 lifelmy
(integer) 0
127.0.0.1:6379> smembers myset3
1) "world"

SMOVE

可用版本:>= 1.0.0

时间复杂度:O(1)

命令格式

1
SMOVE source destination member

命令描述

  • source集合中的元素member,移动到集合destination
  • 这是一个原子操作,在任何时刻,member要么在source中,要么在destination
  • 如果集合source不存在,或者source集合中没有member元素,不执行任何操作,直接返回0
  • 如果destination集合中已经存在了member元素值,那么只会将source中的member移除
  • 如果source或者destination对应的不是set类型的元素,返回error

返回值

1:元素移动成功

0:source集合中不包含member元素,未执行任何操作

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
127.0.0.1:6379> sadd myset4 hello world
(integer) 2
127.0.0.1:6379> sadd myset5 hello
(integer) 1

# 移动成功
127.0.0.1:6379> smove myset4 myset5 world
(integer) 1

# myset4移除元素,myset5已包含该元素,不会添加
127.0.0.1:6379> smove myset4 myset5 hello
(integer) 1

# 查看集合元素
127.0.0.1:6379> smembers myset4
(empty array)
127.0.0.1:6379> smembers myset5
1) "hello"
2) "world"

# 集合myset4中不存在’hello‘,返回0
127.0.0.1:6379> smove myset4 myset5 hello
(integer) 0

SCARD

可用版本:>= 1.0.0

时间复杂度:O(1)

命令格式

1
SCARD key

命令描述

  • 返回集合的基数(长度)

返回值

整数值:集合长度,当集合不存在时返回0

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
127.0.0.1:6379> sadd myset6 hello world
(integer) 2

# 返回集合长度
127.0.0.1:6379> scard myset6
(integer) 2

# 不存在的集合返回0
127.0.0.1:6379> scard notexists
(integer) 0

SSCAN

可用版本:>= 2.8.0

时间复杂度:每次调用时间复杂度为O(1),完整遍历为O(N),N为集合元素个数

命令格式

1
SSCAN key cursor [MATCH pattern] [COUNT count]

命令描述

  • 遍历集合
  • 具体命令描述,见后续数据库操作章节中的SCAN部分

SINTER

可用版本:>= 1.0.0

时间复杂度:O(N*M),N为所有给定集合中最小的集合长度,M为给定集合的个数

命令格式

1
SINTER key [key ...]

命令描述

  • 返回给定集合的交集

例如:

1
2
3
4
key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
SINTER key1 key2 key3 = {c}
  • 当给定集合中包含空集时,返回的结果一定也是空集,因为空集与其他集合的交集一定是空集

返回值

数组:所有集合交集的元素列表

示例

1
2
3
4
5
6
127.0.0.1:6379> sadd myset hello world
(integer) 2
127.0.0.1:6379> sadd otherset hello
(integer) 1
127.0.0.1:6379> sinter myset otherset
1) "hello"

SINTERSTORE

可用版本:>= 1.0.0

时间复杂度:O(N*M),N为所有给定集合中最小的集合长度,M为给定集合的个数

命令格式

1
SINTERSTORE destination key [key ...]

命令描述

  • 命令与与SINTER 功能类似,即取多个集合的交集,但是不返回结果,而是将结果保存到destination

  • 如果destination集合已经存在,数据将会被覆盖

返回值

整数值:结果集长度

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# dest集合
127.0.0.1:6379> sadd dest test
(integer) 1
127.0.0.1:6379> smembers dest
1) "test"

# 两个集合
127.0.0.1:6379> sadd myset hello world
(integer) 2
127.0.0.1:6379> sadd myset2 hello world lifelmy
(integer) 3

# 取交集后存入dest
127.0.0.1:6379> sinterstore dest myset myset2
(integer) 2

# dest中原有的“test”被覆盖掉
127.0.0.1:6379> smembers dest
1) "hello"
2) "world"

SUNION

可用版本:>= 1.0.0

时间复杂度:O(N),N给定集合的元素总数

命令格式

1
SUNION key [key ...]

命令描述

  • 返回给定集合的并集

例如:

1
2
3
4
key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
SUNION key1 key2 key3 = {a,b,c,d,e}

返回值

数组:所有集合并集的元素列表

示例

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> sadd uset hello world
(integer) 2
127.0.0.1:6379> sadd uset1 lifelmy test
(integer) 2
127.0.0.1:6379> sunion uset uset1
1) "lifelmy"
2) "hello"
3) "test"
4) "world"

SUNIONSTORE

可用版本:>= 1.0.0

时间复杂度:O(N),N给定集合的元素总数

命令格式

1
SUNIONSTORE destination key [key ...]

命令描述

  • 命令与与SUNION 功能类似,即取多个集合的并集,但是不返回结果,而是将结果保存到destination

  • 如果destination集合已经存在,数据将会被覆盖

返回值

整数值:结果集长度

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
127.0.0.1:6379> sadd uset hello world
(integer) 2
127.0.0.1:6379> sadd uset1 lifelmy test
(integer) 2

127.0.0.1:6379> sunion uset uset1
1) "lifelmy"
2) "hello"
3) "test"
4) "world"

SDIFF

可用版本:>= 1.0.0

时间复杂度:O(N),N给定集合的元素总数

命令格式

1
SDIFF key [key ...]

命令描述

  • 返回第一个集合,与后续所有集合的差集

例如:

1
2
3
4
key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
SDIFF key1 key2 key3 = {b,d}

返回值

数组:结果集的元素列表

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
127.0.0.1:6379> sadd key1 a b c d
(integer) 4
127.0.0.1:6379> sadd key2 a b
(integer) 2
127.0.0.1:6379> sadd key3 a b c
(integer) 3

# key1集合与 key2 key3集合的差集
127.0.0.1:6379> sdiff key1 key2 key3
1) "d"

SDIFFSTORE

可用版本:>= 1.0.0

时间复杂度:O(N),N给定集合的元素总数

命令格式

1
SDIFFSTORE destination key [key ...]

命令描述

  • 命令与与SDIFF 功能类似,即计算第一个集合与后续给定集合的差集,但是不返回结果,而是将结果保存到destination

  • 如果destination集合已经存在,数据将会被覆盖

返回值

整数值:结果集长度

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
127.0.0.1:6379> sadd key1 a b c d
(integer) 4
127.0.0.1:6379> sadd key2 a b
(integer) 2
127.0.0.1:6379> sadd key3 a b c
(integer) 3

# 取差集后,结果保存到key4集合中
127.0.0.1:6379> sdiffstore key4 key1 key2 key3
(integer) 1
127.0.0.1:6379> smembers key4
1) "d"

更多

微信公众号:CodePlayer