你必须非常努力,才能看起来毫不费力!
微信搜索公众号[ 漫漫Coding路 ],一起From Zero To Hero !
前言
Set,即集合,与数学中的集合概念一致,不过Redis Set中包含的元素类型是string。Set中元素值是唯一的,不能出现重复的数据。下面就来看下Set基本类型相关的指令吧。
SADD
可用版本:>= 1.0.0
时间复杂度: 添加一个元素的复杂度为O(1),添加N个元素的复杂度为O(N)
命令格式
SADD key member [member ...]
命令描述
- 将一个或多个
member
元素添加至key
对应的集合中,如果集合中已经存在member
元素,本次操作会被忽略 - 如果
key
对应的集合不存在,会创建一个空集合,然后把member
元素插入 - 如果
key
对应的不是集合类型,会返回错误
返回值
整数值:真正插入到列表的中元素个数(已经存在列表的元素不会被插入)
示例
# 添加一个元素
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为集合大小
命令格式
SMEMBERS key
命令描述
- 返回
key
对应集合中的所有元素 - 这个命令会返回所有元素,如果集合较大,会影响Redis性能,建议线上不要使用这个命令,可以使用
SSCAN
命令代替
返回值
数组:集合中所有元素
示例
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)
命令格式
SISMEMBER key member
命令描述
- 判断
member
是否为key
集合中的元素
返回值
1:member
是集合中的元素
0:集合不存在或者member
不是集合中的元素
示例
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为提供的元素数量
命令格式
SMISMEMBER key member [member ...]
命令描述
- 判断给定的多个
member
是否为key
集合中的元素 - 对于每一个
member
元素,返回1
表示存在集合key
中,当不在集合中或者集合本身就不存在时,返回0
返回值
数组:数组中的每个值,对应相应的member
是否为集合中的元素。数组长度与给定的member
数量一致,且位置一一对应。
示例
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
命令格式
SPOP key [count]
命令描述
- 从集合中随机移除一个元素,并返回该元素值
- 如果只想返回元素但不移除,使用
SRANDMEMBER
命令 - 默认移除并返回一个元素,指定
count
后返回count
个元素;若count
大于集合长度时,返回集合中所有元素
返回值
未指定count时:返回元素值或者nil(key不存在)
指定count时:移除的元素集合或者空集合(key不存在)
示例
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为返回元素的个数
命令格式
SRANDMEMBER key [count]
命令描述
- 未指定
count
值时,随机返回集合中一个元素值 count
为正数时,且小于等于集合长度时,返回大小为count
的集合,集合中元素各不相同;如果count
大于集合长度,则返回集合中全部元素count
为负数时,那么命令返回一个数组,数组中的元素可能会重复出现多次
,数组的长度为count
的绝对值。
返回值
未指定count时:返回随机元素值或者nil(当集合不存在时)
指定count时:返回的元素集合或者空集合(当集合不存在时)
示例
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为给定的元素数量
命令格式
SREM key member [member ...]
命令描述
- 从集合中移除给定的元素值
member
- 给定的元素值
member
不属于该集合时,会忽略该元素 - 给定
key
集合不存在时,会被当成空集合来处理 - 当
key
对应的不是集合类型时,返回错误
返回值
整数值:真正从集合中移除的元素个数
示例
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)
命令格式
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
元素,未执行任何操作
示例
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)
命令格式
SCARD key
命令描述
- 返回集合的基数(长度)
返回值
整数值:集合长度,当集合不存在时返回0
示例
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为集合元素个数
命令格式
SSCAN key cursor [MATCH pattern] [COUNT count]
命令描述
- 遍历集合
- 具体命令描述,见后续数据库操作章节中的
SCAN
部分
更多
个人博客: lifelmy.github.io/
微信公众号:漫漫Coding路