API的理解和使用——集合
| 区间 | 命令 | 功能 | 时间复杂度 |
| 集合内 | 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的理解和使用——集合的更多相关文章
- 2.API的理解和使用
标题 : 2.API的理解和使用 目录 : Redis 序号 : 2 zset的成员是唯一的,但分数(score)却可以重复. 有序集合的内部编码 1.ziplist(压缩列表):当有序集合的 ...
- JavaScript 应用开发 #1:理解模型与集合
在 < Backbone 应用实例 > 这个课程里面,我们会一起用 JavaScript 做一个小应用,它可以管理任务列表,应用可以创建新任务,编辑还有删除任务等等.这个实例非常好的演示了 ...
- qnx:从API开始理解QNX -- 消息传递
从API开始理解QNX -- 消息传递 http://www.openqnx.com/chinese/viewtopic.php?f=5&t=2161 1. 频道与连接 Chann ...
- 对Java通配符的个人理解(以集合为例)
对Java通配符的个人理解(以集合为例) 前言:最近在学习Java,当学到了泛型的通配符时,不是很理解PECS(Producer Extends Consumer Super)原则,以及<? e ...
- API的理解和使用——有序集合
有序集合常用的命令 命令 功能 zadd key score member [score member ... ] 添加元素 zcard key 计算成员个数 zscore key member 计算 ...
- Spark笔记:复杂RDD的API的理解(下)
本篇接着谈谈那些稍微复杂的API. 1) flatMapValues:针对Pair RDD中的每个值应用一个返回迭代器的函数,然后对返回的每个元素都生成一个对应原键的键值对记录 这个方法我最开始接 ...
- SDK与API的理解
1.SDK SDK (Software Development Kit):软件开发工具包,一般都是软件工程师为特定的软件包.软件框架.硬件平台.操作系统等建立应用软件时的开发工具的集合. SDK (S ...
- Redis 入门到分布式 (二)API的理解和使用
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 内容: 通用命令 单线程架构 数据结构和内部编码 一.常用的通用命令: keys 计算所有的 ...
- Spark笔记:复杂RDD的API的理解(上)
本篇接着讲解RDD的API,讲解那些不是很容易理解的API,同时本篇文章还将展示如何将外部的函数引入到RDD的API里使用,最后通过对RDD的API深入学习,我们还讲讲一些和RDD开发相关的scala ...
随机推荐
- ci框架文件上传
控制器类代码 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class Upload ex ...
- 慕课网python进阶函数式编程学习记录
函数 不等于 函数式 函数: function 函数式: functional,一种编程范式 就好比计算机 不等于 计算 c语言: 函数 python :函数式(计算) 函数式编程特点: 把计算视为函 ...
- TensorFlow笔记三:从Minist数据集出发 两种经典训练方法
Minist数据集:MNIST_data 包含四个数据文件 一.方法一:经典方法 tf.matmul(X,w)+b import tensorflow as tf import numpy as np ...
- Ethernet帧格式
一.Ethernet帧格式的发展 1980 DEC,Intel,Xerox制订了Ethernet I的标准 1982 DEC,Intel,Xerox又制订了Ehternet II的标准 1982 IE ...
- struts2类型转换+校验
1.action中validate()与validateXxx() 用于action执行前的校验,如果校验失败,跳到input视图, 前者校验整个Action: 后者校验该Action中的Xxx方法. ...
- 怎么学习PS快?
PS快速入门笔记 软件界面: 菜单栏, 工具箱 工具属性栏 悬浮面板 画布 ctrl + N 新建画布 如果需要出图:分辨率:300 颜色模式:CMYK 屏幕显示: 分辨率: 72 颜色模式: ...
- vue.js+koa2项目实战(三)登录注册模态框
登录注册模态框 注: [Vue warn]: Do not use built-in or reserved HTML elements as component id: diaLog 原因:diaL ...
- 怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(3)
plist 中的每一页 utteranceSting 我们都创建了一个RWTPage.displayText.因此,每页的文本会一次性地显示出来. 由于 You've constructedeach ...
- 《Head First 设计模式》学习笔记——观察者模式 + 装饰者模式
装饰者模式是JDK中还有一个使用较多的设计模式,上一个是观察者模式(在Swing中大量使用),业内好的API设计无一离不开常见的设计模式,通常我们所说要阅读源代码,也是为了学习大牛们的设计思路.--- ...
- layui.layer独立组件--解释
网站文档-链接:http://www.layui.com/doc/modules/layer.html layer至今仍作为layui的代表作,她的受众广泛并非偶然,而是这五年多的坚持,不断完善和维护 ...