目录
SADD 插入集合
SADD key member [member ...]:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略
- 假如 key 不存在,则创建一个只包含 member 元素作成员的集合
- 当 key 不是集合类型时,返回一个错误
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd myset a b c d e f g h i j k l m n # 向key中添加集合元素,key不存在则自动创建空的key集合
(integer) 14
127.0.0.1:6379> set name lisi # 初始化非集合key
OK
127.0.0.1:6379> sadd name zhangsan # 向非集合中执行sadd
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(N), N 是被添加的元素的数量。
返回值:
- 被添加到集合中的新元素的数量,不包括被忽略的元素。
- 对非集合执行sadd,报错。
SCARD 取元素数量
SCARD key:返回集合中的元素数量
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> scard myset2 # 不存在key
(integer) 0
127.0.0.1:6379> sadd myset a b c d e f g h i j k l m n
(integer) 14
127.0.0.1:6379> scard myset # 存在集合key
(integer) 14
127.0.0.1:6379> set name lisi # 初始化非集合key
OK
127.0.0.1:6379> scard name # 对非集合key执行scard命令
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(1)。
返回值:
- 不存在key似为空集合,返回0
- 存在集合key,返回元素个数
- 对非集合key,报错
SPOP 随机移除元素
SPOP key:移除并返回集合中的一个随机元素。
- 如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER 命令。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd myset a # 初始化集合
(integer) 1
127.0.0.1:6379> spop myset
"a"
127.0.0.1:6379> spop myset # 集合为空
(nil)
127.0.0.1:6379> spop myset2 # 不存在的key
(nil)
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> spop name # key 不为集合
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(1)。
返回值:
- 被随机移除的元素。
- 当 key 不存在或 key 是空集时,返回 nil
- 当 key 不为集合,报错。
SREM 移除多个元素
SREM key member [member ...]:移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd myset a b c d e # 初始化集合
(integer) 5
127.0.0.1:6379> srem myset a b c d # 移除 a b c d
(integer) 4
127.0.0.1:6379> srem myset a b c d e
(integer) 1 # 移除 a b c d e,不存在元素忽视了
127.0.0.1:6379> srem myset2 a
(integer) 0 # 移除不存在key似为空集合
127.0.0.1:6379> set name list
OK
127.0.0.1:6379> srem name 1 # key不为集合,报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度为O(N), N 为给定 member 元素的数量
返回值:
- 不存在key似为空集合,返回0。
- key为集合,返回成功移除的元素的数量(不包括被忽视的元素),不存在的元素直接被忽视。
- key不为集合,报错。
SMOVE 移动元素到别的集合
SMOVE source destination member:将 member 元素从 source 集合移动到 destination 集合。
- 该操作是原子性的。
- 如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。
- 当 destination 集合已经包含 member 元素时,SMOVE 命令只是简单地将 source 集合中的 member 元素删除。
- 当 source 或 destination 不是集合类型时,返回一个错误。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b # 初始化集合
(integer) 2
127.0.0.1:6379> smove s1 dest a # 移动集合
(integer) 1
127.0.0.1:6379> smembers s1 # 查看集合元素
1) "b"
127.0.0.1:6379> smembers dest # 查看dest元素
1) "a"
127.0.0.1:6379> set name cxian
OK
127.0.0.1:6379> smove s1 name b # 有非集合key报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(1)。
返回值:
- 如果 member 元素被成功移除,返回 1 。
- 如果 member 元素不是 source 集合的成员,并且没有任何操作对 destination 集合执行,那么返回 0 。
SMEMBERS 取所有成员
SMEMBERS key:返回集合 key 中的所有成员。
- 不存在的 key 被视为空集合。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b c d e
(integer) 5
127.0.0.1:6379> smembers s1
1) "d"
2) "b"
3) "a"
4) "c"
5) "e"
127.0.0.1:6379> smembers s2
(empty array)
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> smembers name
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(N), N 为集合的基数。
返回值:
- 集合中的所有成员。
- 不存在的key返回空。
- 非集合key,报错。
SRANDMEMBER 取指定数量元素
SRANDMEMBER key [count]:取指定数量count的元素。
- count不指定:默认为1,即随机取一个元素。
- count为正数:count小于集合大小,返回不重复的count个元素的数组;count大于等于集合大小,则返回整个集合的元素。
- count为负数:那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b c
(integer) 3
127.0.0.1:6379> srandmember s1
"a"
127.0.0.1:6379> srandmember s1 2
1) "a"
2) "b"
127.0.0.1:6379> srandmember s1 5
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> srandmember s1 -5
1) "a"
2) "c"
3) "a"
4) "c"
5) "c"
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> srandmember lisi
(nil)
时间复杂度:
- 只提供 key 参数时为 O(1) 。
-
如果提供了 count 参数,那么为 O(N) ,N 为返回数组的元素个数。
返回值:
- 只提供 key 参数时,返回一个元素;如果集合为空,返回 nil
- 如果提供了 count 参数,那么返回一个数组;如果集合为空,返回空数组。
- 对非集合key执行srandmember返回nil。
SISMEMBER 判断元素是否存在
SISMEMBER key member:判断 member 元素是否集合 key 的成员。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b c # 初始化集合
(integer) 3
127.0.0.1:6379> sismember s1 a # 查看是否存在
(integer) 1
127.0.0.1:6379> sismember s1 f
(integer) 0
127.0.0.1:6379> sismember s2 f # 不存在key似为空集合
(integer) 0
127.0.0.1:6379> set name cxian
OK
127.0.0.1:6379> sismember name f # 对非集合key操作,报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(1)。
返回值:
- 存在返回1
- 不存在返回0
- 对非集合执行 SISMEMBER 命令,报错。
SUNION 多集合求并集
SUNION key [key ...]:返回一个集合的全部成员,该集合是所有给定集合的并集。
- 不存在的 key 被视为空集。
- 原理:把所有key集合的元素组合在一起并且去重后的元素集合。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd myset a b # 初始化集合
(integer) 2
127.0.0.1:6379> sadd myset2 a b c d # 初始化集合
(integer) 4
127.0.0.1:6379> sunion myset myset2 myset3 # myset3不存在被似为空集合
1) "d"
2) "a"
3) "b"
4) "c"
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> sunion myset name # 有key存在且不为集合,报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(N), N 是所有给定集合的成员数量之和。
返回值:
- 并集成员的列表。
- 有key存在且不为集合则报错。
SUNIONSTORE 多集合求并集(存储)
SUNIONSTORE destination key [key ...]:与SUNION操作相似。
- 不同点:它将结果保存到 destination 集合,而不是简单地返回结果集。
- 如果 destination 已经存在,则将其覆盖。
- destination 可以是 key 本身。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b # 初始化集合
(integer) 2
127.0.0.1:6379> sadd s2 c
(integer) 1
127.0.0.1:6379> sunionstore dest s1 s2 s3 # 取并集
(integer) 3
127.0.0.1:6379> smembers dest # 查看dest信息
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> set name cxian
OK
127.0.0.1:6379> sunionstore dest s1 s2 s3 name # 有非命令key报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(N), N 是所有给定集合的成员数量之和。
返回值:
- 结果集中的元素数量。
- 对非集合key执行SUNIONSTORE命令报错。
SINTER 多集合求交集
SINTER key [key ...]:返回所有给定集合的交集。
- 不存在的 key 被视为空集。
- 原理:取都存在于所有key集合中的元素集合。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b c d e # 初始化集合
(integer) 5
127.0.0.1:6379> sadd s2 b e f g # 初始化集合
(integer) 4
127.0.0.1:6379> sinter s1 s2 # 取交集
1) "e"
2) "b"
127.0.0.1:6379> sinter s1 s2 s3 # 取交集,有不存在的key似为空集
(empty array)
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> sinter s1 s2 name # 存在不为集合的key报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(N * M), N 为给定集合当中基数最小的集合, M 为给定集合的个数。
返回值:
- 交集成员的列表(不存在key似为空集合)。
- 存在key不为集合,报错。
SINTERSTORE 多集合求取交集(存储)
SINTERSTORE destination key [key ...]:跟SINTER操作相似。
- 不同点:SINTERSTORE 它将结果保存到 destination 集合中。
- 如果 destination 已经存在,则将其覆盖。
- destination 可以是 key 本身。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b d # 初始化集合
(integer) 3
127.0.0.1:6379> sadd s2 d e f # 初始化集合
(integer) 3
127.0.0.1:6379> sinterstore dest s1 s2
(integer) 1
127.0.0.1:6379> smembers dest # 查看集合dest
1) "d"
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> sinterstore dest s1 s2 name # 存在不为集合的key
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(N * M), N 为给定集合当中基数最小的集合, M 为给定集合的个数。
返回值:
- 结果集中的成员数量。
- 存在key不为集合,报错。
SDIFF 多集合求取差集
SDIFF key [key ...]:取给定集合之间的差集
- 不存在的key似为空集合
- 原理:以第个key集合为主减去存在于后面所有key集合的并集的元素,剩下的元素集合。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd myset a b c d e # 初始化几个集合key
(integer) 5
127.0.0.1:6379> sadd myset2 d e
(integer) 2
127.0.0.1:6379> sadd myset3 c d
(integer) 2
127.0.0.1:6379> sdiff myset myset2 myset3 # 取三个集合的差集
1) "b"
2) "a"
127.0.0.1:6379> sdiff myset myset2 myset3 myset4 # 取4个集合的差集,其中一个不存在似为空集合
1) "b"
2) "a"
127.0.0.1:6379> set name lisi # 定义一个非集合key
OK
127.0.0.1:6379> sdiff myset myset2 myset3 myset4 name # 有一个key不为集合
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(N), N 是所有给定集合的成员数量之和。
返回值:
- 交集成员的列表
- 若有不存在的key,似为空集合
- 若有非集合key,报错
SDIFFSTORE 多集合求取差集(存储)
SDIFFSTORE destination key [key ...]:与SDIFF操作相拟。
- 不同点:SDIFFSTORE 它将结果保存到 destination 集合中。
- 如果 destination 已经存在,则将其覆盖。
- destination 可以是 key 本身。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 'baidu' 'google' 'alibaba' 'banana' # 初始化集合
(integer) 4
127.0.0.1:6379> sadd s2 'apple' 'banana' 'orange' # 初始化集合
(integer) 3
127.0.0.1:6379> sdiffstore dest s1 s2 # 求差集并保存到dest中
(integer) 3
127.0.0.1:6379> smembers dest # 查看dest中元素
1) "baidu"
2) "google"
3) "alibaba"
127.0.0.1:6379> set name cxian
OK
127.0.0.1:6379> sdiffstore dest s1 name # 存在不为集合的key报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(N), N 是所有给定集合的成员数量之和。
返回值:
- 结果集中的成员数量。
- 存在key不为集合,报错。