在Redis中,Set类型是没有排序的字符集合,和List类型一样,可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间复杂度为O(1),即常量时间内完成次操作。Set可包含的最大元素数量是4294967295。和List类型不同的是,Set集合中不允许出现重复的元素。换句话说,如果多次添加相同元素,Set中将仅保留该元素的一份拷贝。和List类型相比,Set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如unions、intersections和differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。

基本操作

命令

描述

复杂度

返回值

SADD key [member ...]

将一个或多个member元素加入到集合 key 当中,已经存在于集合的member元素将被忽略。假如key不存在,则创建一个只包含 member元素作成员的集合。当key不是集合类型时,返回一个错误。

O(N), N 是被添加的元素的数量。

被添加到集合中的新元素的数量,不包括被忽略的元素。

SCARD key

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

O(1)

集合的基数。key不存在时,返回 0 。

SDIFF key [key ...]

返回一个集合的全部成员,该集合是所有给定集合之间的差集。不存在的key被视为空集。

O(N),N是所有集合的成员数量之和。

一个包含差集成员的列表。

SDIFFSTORE destination key [key ...]

作用和SDIFF类似,但它将结果保存到 destination.而不是简单地返回结果集.如果destination集合已经存在,则将其覆盖。destination可以是key本身。

O(N),N 是所有给定集合的成员数量之和。

结果集中的元素数量。

SINTER key [key ...]

返回一个集合的全部成员,该集合是所有给定集合的交集。不存在的key被视为空集。当给定集合当中有一个空集时,结果也为空集

O(N * M), N 为给定集合当中基数最小的集合, M 为给定集合的个数。

交集成员的列表。

SINTERSTORE destination key [key ...]

类似SINTER命令,但它将结果保存到destination 集合,而不是简单地返回结果集。如果destination 集合已经存在,则将其覆盖。destination可以是 key本身。

O(N * M), N 为给定集合当中基数最小的集合, M 为给定集合的个数。

结果集中的成员数量。

SISMEMBER key member

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

O(1)

是1 ;不是或 key不存在返回0 。

SMEMBERS key

返回集合 key 中的所有成员。不存在的 key 被视为空集合。

O(N), N为集合的基数。

集合中的所有成员。

SMOVE source destination member

将member元素从source移动到destination.SMOVE 是原子性操作。如果source不存在或不包含指定的member元素,则SMOVE命令不执行任何操作,仅返回0 。否则, member元素从 source 集合中被移除,并添加到 destination 集合中去。当 destination 集合已经包含 member 元素时, SMOVE命令只是简单地将 source 集合中的 member 元素删除。当 source或 destination 不是集合类型时,返回一个错误。

O(1)

如果member元素被成功移除,返回 1 。如果 member元素不是source 集合的成员,并且没有任何操作对 destination集合执行,那么返回 0 。

SPOP key

移除并返回集合中的一个随机元素。如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER 命令。

O(1)

被移除的随机元素。当 key不存在或key是空集时,返回nil 。

SREM key member [member ...]

移除集合 key中的一个或多个 member元素,不存在的 member元素会被忽略。当key不是集合类型,返回一个错误。

O(N), N 为给定 member 元素的数量。

被成功移除的元素的数量,不包括被忽略的元素。

SUNION key [key ...]

返回一个集合的全部成员,该集合是所有给定集合的并集。不存在的 key 被视为空集。

O(N), N是所有集合的成员数量之和。

O(N), N 是所有给定集合的成员数量之和。

SUNIONSTORE destination key [key ...]

类似于 SUNION 命令,但它将结果保存到 destination集合,而不是简单地返回结果集。

O(N), N 是所有给定集合的成员数量之和。

结果集中的元素数量。

应用范围

  • 可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。
  • 充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections命令就可以充分发挥它的方便和效率的优势了。

Redis学习-Set的更多相关文章

  1. Redis学习手册(目录)

    为什么自己当初要选择Redis作为数据存储解决方案中的一员呢?现在能想到的原因主要有三.其一,Redis不仅性能高效,而且完全免费.其二,是基于C/C++开发的服务器,这里应该有一定的感情因素吧.最后 ...

  2. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  3. Redis——学习之路四(初识主从配置)

    首先我们配置一台master服务器,两台slave服务器.master服务器配置就是默认配置 端口为6379,添加就一个密码CeshiPassword,然后启动master服务器. 两台slave服务 ...

  4. Redis——学习之路三(初识redis config配置)

    我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息.     ...

  5. Redis——学习之路二(初识redis服务器命令)

    上一章我们已经知道了如果启动redis服务器,现在我们来学习一下,以及如何用客户端连接服务器.接下来我们来学习一下查看操作服务器的命令. 服务器命令: 1.info——当前redis服务器信息   s ...

  6. Redis学习笔记~目录

    回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...

  7. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  8. Redis学习笔记1-Redis的介绍和认识

    说明:文章内容来自百度百科和redis官方对redis的介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API ...

  9. Redis学习笔记7--Redis管道(pipeline)

    redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常会阻塞并等待redis ...

  10. 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

随机推荐

  1. 无线接收信号强度(RSSI)那些事儿

    本文由嵌入式企鹅圈原创团队成员黄鑫供稿. 本文所述的原理适用于所有无线传输技术,只是用蓝牙来举例.应该说,嵌入式企鹅圈更加偏重于嵌入式和物联网.安卓技术原理方面的知识分享和传播,其次才是实践,尽管很多 ...

  2. 【VB超简单入门】六、基本数据类型

    接下来要介绍VB的基本数据类型,为接下来学习变量和常量准备. 计算机只能处理二进制的数据,所以无论什么数据,在CPU里面处理都是一样的,类似101010这样的机器代码,但是让我们直接去写机器代码程序, ...

  3. Java实现缓存(LRU,FIFO)

    现在软件或者网页的并发量越来越大了,大量请求直接操作数据库会对数据库造成很大的压力,处理大量连接和请求就会需要很长时间,但是实际中百分之80的数据是很少更改的,这样就可以引入缓存来进行读取,减少数据库 ...

  4. WPF之路二: button添加背景图片点击后图片闪烁问题

    在为button添加背景图片的时候,点击后发现图片闪烁,我们仔细观察,其实Button不仅仅只是在点击后会闪烁,在其通过点击或按Tab键获得焦点后都会闪烁,而通过点击其他按钮或通过按Tab键让Butt ...

  5. 读书笔记 effective c++ Item 43 了解如何访问模板化基类中的名字

    1. 问题的引入——派生类不会发现模板基类中的名字 假设我们需要写一个应用,使用它可以为不同的公司发送消息.消息可以以加密或者明文(未加密)的方式被发送.如果在编译阶段我们有足够的信息来确定哪个信息会 ...

  6. Java面试指导

    Java面试指导   想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些东西呢?本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面试的时候跟面试官聊 ...

  7. 微信小程序评分功能

    很多做过电商项目的朋友会经常用到评分的功能,我这里正好写了一个例子,发出来分享一下: 我写的是5分满分制的,首先,准备3个图片, ,像这样的,分别代表分数为0,0.5,1 时的状态, 效果图:(以3. ...

  8. Java并发编程:如何创建进程?

    转载自:http://www.cnblogs.com/dolphin0520/p/3913517.html 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程 ...

  9. MySQL中文全文搜索

    我们在mysql数据中可以使用match against语句解决中文全文搜索的问题 先看一个例句: SELECT * FROM v9_search WHERE `siteid`= '1' AND `t ...

  10. [转]centos7环境安装rabbitMQ

    使用专业的消息队列产品rabbitmq之centos7环境安装 http://www.cnblogs.com/huangxincheng/p/6006569.html CentOS7上安装Rabbit ...