暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis每日一练(29):SISMEMBER、SMOVE和SREM命令

原创 AlbertS 2019-12-31
2852

版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议

前言

继续学习操作集合 sets 类型的命令,今天这3个命令非常的简单,基本上看名字就能知道命令的作用,SISMEMBERS 命令查看元素是否在集合中,可以参考下 LINDEX 这个列表命令,这个命令可以返回元素在列表中的索引,如果结果为nil就说明不再列表中了,SMOVE 是一个移动命令,很像 RPOPLPUSH 的作用,SREM命令就是从集合中删除指定元素,接下来看下具体使用方法。

这篇笔记中的3个命令分别是 SISMEMBER 、 SMOVE 、 SREM ,可以参考:

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>

总结

  1. SISMEMBER 命令查询一个元素是否在集合中,存在返回1,不存在返回0。
  2. SMOVE 命令可以将原集合中的元素移动到目标集合中,成功移动返回1,找不到该元素返回0。
  3. SREM 命令可以删除集合中的一个元素,成功删除返回1,未找到返回0。

2019-12-31 18:09:24

最后修改时间:2020-01-12 22:49:54
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论