集合类型的命令及时间复杂度 
区间 命令 功能 时间复杂度
 集合内 sadd key element [element ... ]  添加元素 O(k),k是元素个数
srem key element [element ... ]  删除元素 O(k),k是元素个数
scard key 计算元素个数  O(1)
sismember key element 判断元素是否在集合中  O(1) 
srandmember key [count] 随机返回指定个数个元素  O(count) 
spop key 随机弹出元素  O(1) 
smembers key 获取所有元素  O(n),n是元素总数
 集合间 sinter key [key ... ]  取交集 O(m*k),k是多集合中元素最少的个数,m是键数
sunion key [key ... ]  取并集 O(k),k是多个集合元素个数和 
sdiff key [key ... ] 取差集  O(k),k是多个集合元素个数和 
sinterstore destination key [key ... ] 保存交集  O(m*k),k是多集合中元素最少的个数,m是键数
sunionstore destination key [key ... ] 保存并集  O(k),k是多个集合元素个数和 
sdiffstore destination key [key ... ] 保存差集 O(k),k是多个集合元素个数和 

集合(set)类型也是用来保存多个字符串元素的,但和列表类型不一样的是,

集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。

,如下图所示,集合set:1包含着“a”、“b”、“c“四个元素,一个集合最多可以存储2**32 -1个元素。

Redis除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多问题。

下面按照集合内和集合间两个维度对集合的常用命令进行介绍。

1.集合内操作

(1)添加元素

命令:sadd key element [element ...]

返回结果为添加成功的元素个数:

127.0.0.1:> exists set:  #查看键是否存在
(integer)
127.0.0.1:> sadd set: a b c
(integer) #添加了3个元素
127.0.0.1:> sadd set: a b d
(integer) #集合不允许重复,只添加了一个
127.0.0.1:> smembers set: #查看结果
) "b"
) "a"
) "d"
) "c"

(2)删除元素

命令:srem key element [element ... ]

返回结果为成功删除元素个数

127.0.0.1:> smembers set:
) "b"
) "a"
) "d"
) "c"
127.0.0.1:> srem set: a
(integer)
127.0.0.1:> smembers set:
) "b"
) "d"
) "c"

(3)计算元素个数

命令:scard key

scard的时间复杂度为O(1),它不会遍历集合所有元素,而是直接用Redis内部的变量:

127.0.0.1:> smembers set:
) "b"
) "a"
) "d"
) "c"
127.0.0.1:> scard set:
(integer)

(4)判断元素是否在集合中

命令:sismember key element

如果给定元素element在集合内返回1,反之返回0:

127.0.0.1:> smembers set:
) "b"
) "d"
) "c"
127.0.0.1:> sismember set: b
(integer)
127.0.0.1:> sismember set: e
(integer)

(5)随机从集合返回指定个数元素

命令:srandmember key [count]

[count]是可选参数,如果不写默认为1:

127.0.0.1:> smembers set:
) "b"
) "d"
) "c"
127.0.0.1:> srandmember set:
"d"
127.0.0.1:> srandmember set:
) "c"
) "d"

(6)从集合随机弹出元素

命令:spop key

spop操作可以从集合中随机弹出一个元素:

127.0.0.1:> smembers set:
) "a"
) "c"
) "e"
) "d"
) "b"
127.0.0.1:> spop set:
"a"
127.0.0.1:> spop set:
"b"
127.0.0.1:> smembers set:
) "c"
) "e"
) "d"

需要注意的是Redis从3.2版本开始,spop也支持[count]参数。

srandmember和spop都是随机从集合选出元素,两者不同的是spop命令执行后,元素会从集合中删除,而srandmember不会。

(7)获取所有元素

命令:smembers key

smembers会获取所有元素,但是返回的结果是无序的:

127.0.0.1:> smembers set:
) "c"
) "e"
) "d"

smembers和lrange、hgetall都属于比较重的命令,如果元素过多存在阻塞Redis的可能性,这时候可以使用sscan来完成。

2.集合间操作

现在有两个集合:

127.0.0.1:> smembers set:
) "c"
) "e"
) "d"
127.0.0.1:> smembers set:
) "b"
) "d"
) "c"

(1)求多个集合的交集

命令:sinter key [key ... ]

127.0.0.1:> sinter set: set:  #双方都有的
) "c"
) "d"

(2)求多个集合的并集

命令:sunion key [key ... ]

127.0.0.1:> sunion set: set:
) "d"
) "e"
) "c"
) "b"

(3)求多个集合的差集

命令:sdiff key [key ...]

127.0.0.1:> sdiff set: set:  #set:2相对于set:1的差集
) "e"
127.0.0.1:> sdiff set: set: #set:1相对于set:2的差集,也就是set:2有set:1没有的
) "b"

(4)将交集、并集、差集的结果保存

命令:

sinterstore destination key [key ... ]
sunionstore destination key [key ...]
sdiffstore destination key [key ... ]

集合间的运算在元素较多的情况下会比较耗时,所以Redis提供了上面三个命令(原命令+store)将集合间交集、并集、差集保存在destination key中:

#保存交集
127.0.0.1:> sinterstore set:sinter:1_2 set: set:
(integer)
127.0.0.1:> smembers set:sinter:1_2
) "d"
) "c"
#保存并集
127.0.0.1:> sunionstore set:sunion:1_2 set: set:
(integer)
127.0.0.1:> smembers set:sunion:1_2
) "d"
) "e"
) "c"
) "b"
#保存差集
127.0.0.1:> sdiffstore set:sdiff:1_2 set: set:
(integer)
127.0.0.1:> smembers set:sdiff:1_2
) "e"
127.0.0.1:> sdiffstore set:sdiff:2_1 set: set:
(integer)
127.0.0.1:> smembers set:sdiff:2_1
) "b"

API的理解和使用——集合的更多相关文章

  1. 2.API的理解和使用

    标题 : 2.API的理解和使用 目录 : Redis 序号 : 2 ​ zset的成员是唯一的,但分数(score)却可以重复. ​ 有序集合的内部编码 1.ziplist(压缩列表):当有序集合的 ...

  2. JavaScript 应用开发 #1:理解模型与集合

    在 < Backbone 应用实例 > 这个课程里面,我们会一起用 JavaScript 做一个小应用,它可以管理任务列表,应用可以创建新任务,编辑还有删除任务等等.这个实例非常好的演示了 ...

  3. qnx:从API开始理解QNX -- 消息传递

    从API开始理解QNX -- 消息传递    http://www.openqnx.com/chinese/viewtopic.php?f=5&t=2161 1. 频道与连接    Chann ...

  4. 对Java通配符的个人理解(以集合为例)

    对Java通配符的个人理解(以集合为例) 前言:最近在学习Java,当学到了泛型的通配符时,不是很理解PECS(Producer Extends Consumer Super)原则,以及<? e ...

  5. API的理解和使用——有序集合

    有序集合常用的命令 命令 功能 zadd key score member [score member ... ] 添加元素 zcard key 计算成员个数 zscore key member 计算 ...

  6. Spark笔记:复杂RDD的API的理解(下)

    本篇接着谈谈那些稍微复杂的API. 1)   flatMapValues:针对Pair RDD中的每个值应用一个返回迭代器的函数,然后对返回的每个元素都生成一个对应原键的键值对记录 这个方法我最开始接 ...

  7. SDK与API的理解

    1.SDK SDK (Software Development Kit):软件开发工具包,一般都是软件工程师为特定的软件包.软件框架.硬件平台.操作系统等建立应用软件时的开发工具的集合. SDK (S ...

  8. Redis 入门到分布式 (二)API的理解和使用

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 内容: 通用命令 单线程架构 数据结构和内部编码 一.常用的通用命令: keys       计算所有的 ...

  9. Spark笔记:复杂RDD的API的理解(上)

    本篇接着讲解RDD的API,讲解那些不是很容易理解的API,同时本篇文章还将展示如何将外部的函数引入到RDD的API里使用,最后通过对RDD的API深入学习,我们还讲讲一些和RDD开发相关的scala ...

随机推荐

  1. Linux下DNW源码及安装

    平台: Ubuntu12.04 + 64bit tiny4412ADK 1.首先要安装libusb-dev这个库,执行“sudo apt-get install libusb-dev”,装完之后就编译 ...

  2. eos wasm虚拟机相关接口定义实现

    wasm虚拟机相关接口定义实现 执行流程 controller::push_transaction()  // 事务 -> transaction_context::exec()  // 事务 ...

  3. xml 文件不给提示(以mybatis 的 mapper映射文件为例)

    在xxx.xml 映射文件的头部可以看到 如下: (mybatis generate 自动生成) <!DOCTYPE mapper PUBLIC "-//mybatis.org//DT ...

  4. Ubuntu 14.04 使用VirtualBox 4.3.10 虚拟 Windows 7

    Ubuntu 14.04 尽管不错,可是有些事仅仅能在Windows下才干完毕,所以在 Ubuntu 下利用虚拟机软件Oracle VirtualBox,虚拟安装个Windows系统是个不错的选择. ...

  5. UNP学习笔记(第六章 I/O复用)

    I/O模型 首先我们将查看UNIX下可用的5种I/O模型的基本区别: 1.阻塞式I/O 2.非阻塞式I/O 3.I/O复用(select和poll) 4.信号驱动式I/O(SIGIO) 5.异步I/O ...

  6. C语言数据类型的转换

    C语言的类型转换,一个是强制类型进行转换,而在这里要介绍的是自动的数据类型的转换,自动的数据类型转换很多时候是发生在多种数据类型混合使用的时候就会进行类型的转换,这样就会带来不能控制的结果,所以必须进 ...

  7. C#日期时间类型格式化大全集 C#DateTime 类型格式化大全集

    日期转化一 为了达到不同的显示效果有时,我们须要对时间进行转化,默认格式为:2007-01-03 14:33:34 ,要转化为其它格式,要用到DateTime.ToString的方法(String, ...

  8. 单点登录系统cas资料汇总

    http://jasig.github.io/cas/4.0.x/index.html           主页 https://jasigcas.herokuapp.com              ...

  9. sprint3 【每日scrum】 TD助手站立会议第五天

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 通过网上的介绍懂得了闹钟的添加和工作原理,然后加入了震动效果 在添加日程类型处添加了选择闹钟间隔多长时间相应,并写了闹钟运行的类 广播协议也弄 ...

  10. Allegro Desgin Compare的用法与网表比较

    转:Allegro Desgin Compare的用法与网表比较 Allegro中自带有Design Compare工具,利用它可以比较明了的看到线路的差异.当然也可以通过SKILL进行比较,不过我们 ...