0
点赞
收藏
分享

微信扫一扫

Redis基本类型学习之Set(1)| 8月更文挑战

你必须非常努力,才能看起来毫不费力!

微信搜索公众号[ 漫漫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路

举报

相关推荐

0 条评论