Redis:集合SADD、SISMEMBER、SPOP、SRANDMEMBER、SREM、SMOVE、SCARD、SMEMBERS、SSCAN命令介绍

本文详细介绍了Redis中集合类型的常用命令,如SADD、SISMEMBER等,包括它们的功能、使用场景、时间复杂度及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SADD

SADD key member [member …]
可用版本: >= 1.0.0
时间复杂度: O(N), N 是被添加的元素的数量。

将一个或多个member元素加入到集合key当中,已经存在于集合的member元素将被忽略(集合中的元素各不相同)。

演示

key不存在时,会先创建一个空集合,再执行SADD命令将这些member元素加入到空集合中去。SADD命令返回被添加到集合中的新元素的数量,不包括被忽略的元素。

127.0.0.1:6379> exists set
(integer) 0
127.0.0.1:6379> sadd set 1 2 3 4
(integer) 4
127.0.0.1:6379> smembers set
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> sadd set 3 5 2 1 1 6 7 8 9 0
(integer) 6
127.0.0.1:6379> smembers set
 1) "0"
 2) "1"
 3) "2"
 4) "3"
 5) "4"
 6) "5"
 7) "6"
 8) "7"
 9) "8"
10) "9"

key不是集合类型时,返回一个错误。

127.0.0.1:6379> lpush list 1 2 3
(integer) 3
127.0.0.1:6379> sadd list 1
(error) WRONGTYPE Operation against a key holding the wrong kind of value

SISMEMBER

SISMEMBER key member
可用版本: >= 1.0.0
时间复杂度: O(1)

判断member元素是否是集合key中的成员。

演示

如果member元素是集合中的成员,SISMEMBER命令返回1

127.0.0.1:6379> smembers set
 1) "0"
 2) "1"
 3) "2"
 4) "3"
 5) "4"
 6) "5"
 7) "6"
 8) "7"
 9) "8"
10) "9"
127.0.0.1:6379> sismember set 9
(integer) 1

如果member元素不是集合中的成员,或者key不存在,命令则返回0

127.0.0.1:6379> smembers set
 1) "0"
 2) "1"
 3) "2"
 4) "3"
 5) "4"
 6) "5"
 7) "6"
 8) "7"
 9) "8"
10) "9"
127.0.0.1:6379> sismember set 10
(integer) 0
127.0.0.1:6379> exists set2
(integer) 0
127.0.0.1:6379> sismember set2 0
(integer) 0

SPOP

SPOP key [count]
可用版本: >= 1.0.0
时间复杂度: 只提供 key 参数时为 O(1) 。如果提供了 count 参数,那么为 O(N) ,N 为返回数组的元素个数。

移除并返回集合中的一个或多个随机元素,如果你的Redis版本中SPOP命令没有这个可选的count参数,就只能移除并返回集合中的一个随机元素。

演示

key不存在或key是空集合时,SPOP命令返回(nil)。并且当count大于集合成员数量时,会移除并返回集合全部成员。

127.0.0.1:6379> exists set2
(integer) 0
127.0.0.1:6379> spop set2
(nil)
127.0.0.1:6379> sadd set2 1
(integer) 1
127.0.0.1:6379> spop set2 10
1) "1"
127.0.0.1:6379> spop set2
(nil)

其他情况,SPOP命令返回被移除的所有随机元素。

127.0.0.1:6379> smembers set
 1) "0"
 2) "1"
 3) "2"
 4) "3"
 5) "4"
 6) "5"
 7) "6"
 8) "7"
 9) "8"
10) "9"
127.0.0.1:6379> spop set 4
1) "2"
2) "0"
3) "3"
4) "6"
127.0.0.1:6379> smembers set
1) "1"
2) "4"
3) "5"
4) "7"
5) "8"
6) "9"
127.0.0.1:6379> smembers set
1) "0"
2) "1"
3) "2"
4) "3"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"
127.0.0.1:6379> spop set -20
(error) ERR index out of range
127.0.0.1:6379> spop set 0
(empty list or set)

SRANDMEMBER

SRANDMEMBER key [count]
可用版本: >= 1.0.0
时间复杂度: 只提供 key 参数时为 O(1) 。如果提供了 count 参数,那么为 O(N) ,N 为返回数组的元素个数。

如果命令只提供了key参数,那么返回集合中的一个随机元素。

该命令和SPOP命令相似,但SPOP命令是将随机元素从集合中移除并返回,而SRANDMEMBER命令则仅仅返回随机元素,而不对集合进行任何改动。并且在两个命令的演示过程中,也可以发现count参数的效果也有点不一样(正负值)。

演示

只提供key参数时,将返回一个元素;如果集合为空,则返回(nil)

127.0.0.1:6379> smembers set
1) "0"
2) "1"
3) "2"
4) "3"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"
127.0.0.1:6379> srandmember set
"2"
127.0.0.1:6379> del set
(integer) 1
127.0.0.1:6379> srandmember set
(nil)

如果提供了count参数,那么会返回一个数组;如果集合为空,会返回空数组。

count为正数时,且小于集合基数,那么命令返回一个包含count个元素的数组,并且数组中的元素各不相同。如果count大于等于集合基数,那么会将整个集合做为一个数组进行返回。

127.0.0.1:6379> smembers set
1) "0"
2) "1"
3) "2"
4) "3"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"
127.0.0.1:6379> srandmember set 1
1) "3"
127.0.0.1:6379> srandmember set 0
(empty list or set)
127.0.0.1:6379> srandmember set 20
1) "0"
2) "1"
3) "2"
4) "3"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"
127.0.0.1:6379> del set
(integer) 1
127.0.0.1:6379> srandmember set 5
(empty list or set)

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

127.0.0.1:6379>  smembers set
1) "0"
2) "1"
3) "2"
4) "3"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"
127.0.0.1:6379> srandmember set -2
1) "5"
2) "5"
127.0.0.1:6379> srandmember set -10
 1) "3"
 2) "0"
 3) "9"
 4) "1"
 5) "0"
 6) "3"
 7) "7"
 8) "6"
 9) "2"
10) "3"
127.0.0.1:6379> srandmember set -20
 1) "1"
 2) "9"
 3) "2"
 4) "3"
 5) "3"
 6) "8"
 7) "6"
 8) "6"
 9) "7"
10) "1"
11) "9"
12) "7"
13) "2"
14) "5"
15) "5"
16) "1"
17) "3"
18) "9"
19) "2"
20) "6"
127.0.0.1:6379> del set
(integer) 1
127.0.0.1:6379> srandmember set -7
(empty list or set)

SREM

SREM key member [member …]
可用版本: >= 1.0.0
时间复杂度: O(N), N 为给定 member 元素的数量。

移除集合key中的一个或多个member元素,不存在的member元素会被忽略。

演示

SREM命令返回被成功移除的元素的数量,不包括被忽略的元素。

127.0.0.1:6379> smembers set
1) "0"
2) "1"
3) "2"
4) "3"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"
127.0.0.1:6379> srem set 9 0 10 11 2 4 4 9 0
(integer) 3
127.0.0.1:6379> smembers set
1) "1"
2) "3"
3) "5"
4) "6"
5) "7"
6) "8"
127.0.0.1:6379> del set
(integer) 1
127.0.0.1:6379> srem set 0 1 2 3 4
(integer) 0

key不是集合类型,命令返回一个错误。

127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> srem list 1
(error) WRONGTYPE Operation against a key holding the wrong kind of value

SMOVE

SMOVE source destination member
可用版本: >= 1.0.0
时间复杂度: O(1)

member元素从source集合移动到destination集合,并且这是一个原子命令。

演示

如果source集合不存在或不包含指定的member元素,则SMOVE命令不执行任何操作,仅返回0

127.0.0.1:6379> del set
(integer) 1
127.0.0.1:6379> sadd set 3 5 2 1 1 6 7 8 9 0
(integer) 9
127.0.0.1:6379> del set1
(integer) 0
127.0.0.1:6379> exists set1
(integer) 0
127.0.0.1:6379> smove set1 set 0
(integer) 0
127.0.0.1:6379> sadd set1 0
(integer) 1
127.0.0.1:6379> smove set1 set 1
(integer) 0
127.0.0.1:6379> smembers set
1) "0"
2) "1"
3) "2"
4) "3"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"

否则, member元素从source集合中被移除,并添加到destination集合中去。

127.0.0.1:6379> smembers set
1) "0"
2) "1"
3) "2"
4) "3"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"
127.0.0.1:6379> smembers set1
1) "0"
2) "10"
127.0.0.1:6379> smove set1 set 10
(integer) 1
127.0.0.1:6379> smembers set
 1) "0"
 2) "1"
 3) "2"
 4) "3"
 5) "5"
 6) "6"
 7) "7"
 8) "8"
 9) "9"
10) "10"
127.0.0.1:6379> smembers set1
1) "0"

而当destination集合已经包含member元素时, SMOVE命令只是简单地将source集合中的member元素删除。

127.0.0.1:6379> smembers set
 1) "0"
 2) "1"
 3) "2"
 4) "3"
 5) "5"
 6) "6"
 7) "7"
 8) "8"
 9) "9"
10) "10"
127.0.0.1:6379> smembers set1
1) "0"
127.0.0.1:6379> smove set1 set 0
(integer) 1
127.0.0.1:6379> smembers set
 1) "0"
 2) "1"
 3) "2"
 4) "3"
 5) "5"
 6) "6"
 7) "7"
 8) "8"
 9) "9"
10) "10"
127.0.0.1:6379> smembers set1
(empty list or set)

sourcedestination不是集合类型时,命令返回一个错误。

SCARD

SCARD key
可用版本: >= 1.0.0
时间复杂度: O(1)

返回集合key的基数(集合中元素的数量)。

演示

key不存在或是空集合时,命令返回0

127.0.0.1:6379> del set1
(integer) 0
127.0.0.1:6379> scard set1
(integer) 0
127.0.0.1:6379> sadd set1 1
(integer) 1
127.0.0.1:6379> spop set1
"1"
127.0.0.1:6379> scard set1
(integer) 0

否则,返回集合的基数。

127.0.0.1:6379> scard set
(integer) 10
127.0.0.1:6379> smembers set
 1) "0"
 2) "1"
 3) "2"
 4) "3"
 5) "5"
 6) "6"
 7) "7"
 8) "8"
 9) "9"
10) "10"

key不是集合类型时,命令返回一个错误。

127.0.0.1:6379> scard list
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"

SMEMBERS

SMEMBERS key
可用版本: >= 1.0.0
时间复杂度: O(N), N 为集合的基数。

返回集合key中的所有成员。

演示

不存在的key被视为空集合。

127.0.0.1:6379> exists set1
(integer) 0
127.0.0.1:6379> smembers set1
(empty list or set)
127.0.0.1:6379> sadd set1 90
(integer) 1
127.0.0.1:6379> spop set1
"90"
127.0.0.1:6379> smembers set1
(empty list or set)

key是有成员的集合时,命令返回集合中的所有成员。

127.0.0.1:6379> smembers set
 1) "0"
 2) "1"
 3) "2"
 4) "3"
 5) "5"
 6) "6"
 7) "7"
 8) "8"
 9) "9"
10) "10"
127.0.0.1:6379> scard set
(integer) 10

key不是集合类型时,命令返回一个错误。

127.0.0.1:6379> smembers list
(error) WRONGTYPE Operation against a key holding the wrong kind of value

SSCAN

SSCAN key cursor [MATCH pattern] [COUNT count]
可用版本: >= 2.8.0
时间复杂度:增量式迭代命令每次执行的复杂度为 O(1) , 对数据集进行一次完整迭代的复杂度为 O(N) , 其中 N 为数据集中的元素数量。

SSCAN命令用于增量式迭代集合中的成员。

选项

  • MATCH :MATCH选项为增量式迭代命令提供一个集合中成员的模式参数, 让命令只返回和给定模式参数相匹配的成员, 这一点可以通过在执行增量式迭代命令时, 通过给定MATCH <pattern>参数来实现,在下面会进行演示。
  • COUNT:COUNT选项的作用就是让用户告知迭代命令, 在每次迭代中应该从数据集里返回多少元素。但COUNT选项只是对增量式迭代命令的一种提示(并不一定会遵守)。COUNT参数的默认值为10 。用户可以在每次迭代中按自己的需要随意改变COUNT参数的值, 只要记得将上次迭代返回的游标用到下次迭代里面就可以了。

演示

SSCAN命令是一个基于游标的迭代器,SSCAN命令每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为SSCAN命令的游标参数, 以此来延续之前的迭代过程。

当SSCAN命令的游标参数被设置为0时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为0的游标时, 表示迭代已结束。

127.0.0.1:6379> smembers set
 1) "0"
 2) "1"
 3) "2"
 4) "3"
 5) "5"
 6) "6"
 7) "7"
 8) "8"
 9) "9"
10) "10"
11) "11"
12) "12"
13) "13"
14) "14"
15) "15"
16) "16"
17) "17"
18) "18"
19) "19"
20) "20"
21) "21"
22) "22"
23) "23"
127.0.0.1:6379> sscan set 0
1) "0"
2)  1) "0"
    2) "1"
    3) "2"
    4) "3"
    5) "5"
    6) "6"
    7) "7"
    8) "8"
    9) "9"
   10) "10"
   11) "11"
   12) "12"
   13) "13"
   14) "14"
   15) "15"
   16) "16"
   17) "17"
   18) "18"
   19) "19"
   20) "20"
   21) "21"
   22) "22"
   23) "23"

使用MATCH选项。

sscan set 0 match 2*
127.0.0.1:6379> sscan set 0 match 2*
1) "0"
2) 1) "2"
   2) "20"
   3) "21"
   4) "22"
   5) "23"

使用COUNT选项(其实是不起作用的)。

127.0.0.1:6379> sscan set 0 match 1* count 5
1) "0"
2)  1) "1"
    2) "10"
    3) "11"
    4) "12"
    5) "13"
    6) "14"
    7) "15"
    8) "16"
    9) "17"
   10) "18"
   11) "19"

和之前介绍过的HSCAN命令是类似的:Redis - 哈希表HLEN、HSTRLEN、HINCRBY、HINCRBYFLOAT、HSCAN命令介绍

所以这也说明了,COUNT选项只是对增量式迭代命令的一种提示(并不一定会遵守)。

Redis中集合的SADD、SISMEMBER、SPOP、SRANDMEMBER、SREM、SMOVE、SCARD、SMEMBERS、SSCAN命令就介绍到这里。

写博客是博主记录自己的学习过程,如果有错误,请指正,谢谢!

### 解决PyCharm无法加载Conda虚拟环境的方法 #### 配置设置 为了使 PyCharm 能够成功识别并使用 Conda 创建的虚拟环境,需确保 Anaconda 的路径已正确添加至系统的环境变量中[^1]。这一步骤至关重要,因为只有当 Python 解释器及其关联工具被加入 PATH 后,IDE 才能顺利找到它们。 对于 Windows 用户而言,在安装 Anaconda 时,默认情况下会询问是否将它添加到系统路径里;如果当时选择了否,则现在应该手动完成此操作。具体做法是在“高级系统设置”的“环境变量”选项内编辑 `Path` 变量,追加 Anaconda 安装目录下的 Scripts 文件夹位置。 另外,建议每次新建项目前都通过命令行先激活目标 conda env: ```bash conda activate myenvname ``` 接着再启动 IDE 进入工作区,这样有助于减少兼容性方面的问题发生概率。 #### 常见错误及修复方法 ##### 错误一:未发现任何解释器 症状表现为打开 PyCharm 新建工程向导页面找不到由 Conda 构建出来的 interpreter 列表项。此时应前往 Preferences/Settings -> Project:...->Python Interpreter 下方点击齿轮图标选择 Add...按钮来指定自定义的位置。按照提示浏览定位到对应版本 python.exe 的绝对地址即可解决问题。 ##### 错误二:权限不足导致 DLL 加载失败 有时即使指定了正确的解释器路径,仍可能遇到由于缺乏适当的操作系统级许可而引发的功能缺失现象。特别是涉及到调用某些特定类型的动态链接库 (Dynamic Link Library, .dll) 时尤为明显。因此拥有管理员身份执行相关动作显得尤为重要——无论是从终端还是图形界面触发创建新 venv 流程均如此处理能够有效规避此类隐患。 ##### 错误三:网络连接异常引起依赖下载超时 部分开发者反馈过因网速慢或者其他因素造成 pip install 操作中途断开进而影响整个项目的初始化进度条卡住的情况。对此可尝试调整镜像源加速获取速度或是离线模式预先准备好所需资源包后再继续后续步骤。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITKaven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值