版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议
前言
继续学习操作集合 sets 类型的命令,今天这3个命令非常的简单,基本上看名字就能知道命令的作用,SISMEMBERS 命令查看元素是否在集合中,可以参考下 LINDEX 这个列表命令,这个命令可以返回元素在列表中的索引,如果结果为nil就说明不再列表中了,SMOVE 是一个移动命令,很像 RPOPLPUSH 的作用,SREM命令就是从集合中删除指定元素,接下来看下具体使用方法。
这篇笔记中的3个命令分别是 SISMEMBER 、 SMOVE 、 SREM ,可以参考:
- 《Redis每日一练(23):LSET和LINDEX命令》 中的 LINDEX 命令
- 《Redis每日一练(27):RPOPLPUSH和BRPOPLPUSH命令》 中的 RPOPLPUSH 命令
- 《Redis每日一练(25):LREM和LINSERT命令》 中的 LREM 命令
SISMEMBER
- 最早出现版本:1.0.0
- 时间复杂度:O(1)
- 命令参数:SISMEMBER key member
- 操作类型:sets
- 官方文档
作用
查看一个元素是否在集合中,如果在集合中返回1,如果不在集合中,或者指定集合的键不存在则返回0,如果指定的键存在但是不是集合类型则会报错。
练习
新建一个集合使用 SISMEMBER 查看元素是否在集合中:
127.0.0.1:6379> GET seta
(nil)
127.0.0.1:6379> SADD seta 101 f4 nb goodjob
(integer) 4
127.0.0.1:6379> SISMEMBER seta goodjob
(integer) 1
127.0.0.1:6379> SISMEMBER seta nb
(integer) 1
127.0.0.1:6379> SISMEMBER seta sb
(integer) 0
127.0.0.1:6379> SISMEMBER setb 1
(integer) 0
127.0.0.1:6379> SET name albert
OK
127.0.0.1:6379> SISMEMBER name 1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379>
当对一个不是集合类型的键使用 SISMEMBER 命令时会给出错误信息。
SMOVE
- 最早出现版本:1.0.0
- 时间复杂度:O(N)
- 命令参数:SMOVE source destination member
- 操作类型:sets
- 官方文档
作用
这个命令的作用的是将一个集合中的指定元素移动到另一个集合中,这个操作是原子操作,很像之前学的 RPOPLPUSH 命令,这个列表的操作命令可以将原列表和目标列表指定为一个,这样就可以将列表尾部的元素移动到列表的头部。
SMOVE 命令也可以把原集合与目标集合指定为同一个,操作上没有什么问题,但是没有任何意义,所以请不要这样操作。
这个移动的命令是原子的,当在原集合中指定的元素不存在或者指定的原集合不存在时,该命令不做任何操作,当原集合中的元素存在而目标集合不存在时,会使用该元素创建一个新集合,当目标集合存在时,元素会从原集合删除而在目标集合中添加该元素,如果目标集合中有这个元素,则只在原集合中删除该元素。
当指定原集合的键或者目标集合的键存储的并不是集合时,会给出报错信息。
成功移动元素返回1,当原集合中不包含指定元素,则不做任何操作返回0。
练习
使用 SADD 命令创建1个多元素的集合,然后使用 SMOVE 移动创建另一个集合,接着继续移动几个元素:
127.0.0.1:6379> DEL seta
(integer) 1
127.0.0.1:6379> SADD seta good nb 100
(integer) 3
127.0.0.1:6379> SADD seta sweet happy
(integer) 2
127.0.0.1:6379> SMEMBERS seta
1) "100"
2) "sweet"
3) "nb"
4) "good"
5) "happy"
127.0.0.1:6379> DEL setb
(integer) 0
127.0.0.1:6379> SMOVE seta setb nb
(integer) 1
127.0.0.1:6379> SMEMBERS setb
1) "nb"
127.0.0.1:6379> SMOVE seta setb good
(integer) 1
127.0.0.1:6379> SMEMBERS setb
1) "good"
2) "nb"
127.0.0.1:6379> SMOVE seta setb wahaha
(integer) 0
127.0.0.1:6379> SMEMBERS seta
1) "sweet"
2) "100"
3) "happy"
127.0.0.1:6379> SMEMBERS setb
1) "good"
2) "nb"
127.0.0.1:6379>
SREM
- 最早出现版本:1.0.0
- 时间复杂度:O(N) (当删除N个元素的时候)
- 命令参数:SREM key member [member …]
- 操作类型:sets
- 官方文档
作用
删除集合中的指定元素,如果删除成功返回1,如果不存在则什么都不做返回0,如果指定的键为空则认为是一个空的集合返回0,如果指定的键不是集合类型则会报错。
当 redis 的版本大于等于2.4时,可以一次性删除多个元素。
练习
对一个空键调用 SREM 命令,查看返回值应该为0:
127.0.0.1:6379> DEL seta
(integer) 1
127.0.0.1:6379> GET seta
(nil)
127.0.0.1:6379> SREM seta good
(integer) 0
127.0.0.1:6379>
删除集合中一个存在的元素和一个不存在的元素,然后查看返回值:
127.0.0.1:6379> SADD seta utf8 ansi unicode
(integer) 3
127.0.0.1:6379> SADD seta GB2312 GBK
(integer) 2
127.0.0.1:6379> SMEMBERS seta
1) "unicode"
2) "ansi"
3) "GB2312"
4) "utf8"
5) "GBK"
127.0.0.1:6379> SREM seta ansi
(integer) 1
127.0.0.1:6379> SREM seta ansi
(integer) 0
127.0.0.1:6379> SMEMBERS seta
1) "unicode"
2) "utf8"
3) "GB2312"
4) "GBK"
127.0.0.1:6379>
总结
- SISMEMBER 命令查询一个元素是否在集合中,存在返回1,不存在返回0。
- SMOVE 命令可以将原集合中的元素移动到目标集合中,成功移动返回1,找不到该元素返回0。
- SREM 命令可以删除集合中的一个元素,成功删除返回1,未找到返回0。
2019-12-31 18:09:24