文档章节

第四章 Redis数据类型之Set

白色白色T恤
 白色白色T恤
发布于 2016/03/10 18:25
字数 1438
阅读 19
收藏 0

   在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间复杂度为O(1),即常量时间内完成次操作。Set可包含的最大元素数量是4294967295。

和List类型不同的是,Set集合中不允许出现重复的元素,这一点和C++标准库中的set容器是完全相同的。换句话说,如果多次添加相同元素,Set中将仅保留该元素的一份拷贝。和List类型相比,Set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如unions、intersections和differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。


    1. SADD/SMEMBERS/SCARD/SISMEMBER:

#在Shell命令行下启动Redis的客户端程序。

    /> redis-cli

#插入测试数据,由于该键myset之前并不存在,因此参数中的三个成员都被正常插入。

    redis 127.0.0.1:6379> sadd myset a b c

    (integer) 3

#由于参数中的a在myset中已经存在,因此本次操作仅仅插入了d和e两个新成员。

    redis 127.0.0.1:6379> sadd myset a d e

    (integer) 2

#判断a是否已经存在,返回值为1表示存在。

    redis 127.0.0.1:6379> sismember myset a

    (integer) 1

#判断f是否已经存在,返回值为0表示不存在。

    redis 127.0.0.1:6379> sismember myset f

    (integer) 0

#通过smembers命令查看插入的结果,从结果可以,输出的顺序和插入顺序无关。

    redis 127.0.0.1:6379> smembers myset

    1) "c"

    2) "d"

    3) "a"

    4) "b"

    5) "e"

#获取Set集合中元素的数量。

    redis 127.0.0.1:6379> scard myset

    (integer) 5


    2. SPOP/SREM/SRANDMEMBER/SMOVE:

#删除该键,便于后面的测试。

    redis 127.0.0.1:6379> del myset

    (integer) 1

#为后面的示例准备测试数据。

    redis 127.0.0.1:6379> sadd myset a b c d

    (integer) 4

#查看Set中成员的位置。

    redis 127.0.0.1:6379> smembers myset

    1) "d"

    2) "c"

    3) "a"

    4) "b"

#从结果可以看出,该命令确实是随机的返回了某一成员。

    redis 127.0.0.1:6379> srandmember myset

    "c"

#Set中尾部的成员b被移出并返回,事实上b并不是之前插入的第一个或最后一个成员。

    redis 127.0.0.1:6379> spop myset

    "b"

#查看移出后Set的成员信息。

    redis 127.0.0.1:6379> smembers myset

    1) "c"

    2) "d"

    3) "a"

#从Set中移出a、d和f三个成员,其中f并不存在,因此只有a和d两个成员被移出,返回为2。

    redis 127.0.0.1:6379> srem myset a d f

    (integer) 2

#查看移出后的输出结果。

    redis 127.0.0.1:6379> smembers myset

    1) "c"

#为后面的smove命令准备数据。

    redis 127.0.0.1:6379> sadd myset a b

    (integer) 2

    redis 127.0.0.1:6379> sadd myset2 c d

    (integer) 2

#将a从myset移到myset2,从结果可以看出移动成功。

    redis 127.0.0.1:6379> smove myset myset2 a

    (integer) 1

#再次将a从myset移到myset2,由于此时a已经不是myset的成员了,因此移动失败并返回0。

    redis 127.0.0.1:6379> smove myset myset2 a

    (integer) 0

#分别查看myset和myset2的成员,确认移动是否真的成功。

    redis 127.0.0.1:6379> smembers myset

    1) "b"

    redis 127.0.0.1:6379> smembers myset2

    1) "d"

    2) "c"

    3) "a"


   3. SDIFF/SDIFFSTORE/SINTER/SINTERSTORE:

#为后面的命令准备测试数据。

    redis 127.0.0.1:6379> sadd myset a b c d

    (integer) 4

    redis 127.0.0.1:6379> sadd myset2 c

    (integer) 1

    redis 127.0.0.1:6379> sadd myset3 a c e

    (integer) 3

#myset和myset2相比,a、b和d三个成员是两者之间的差异成员。再用这个结果继续和myset3进行差异比较,b和d是myset3不存在的成员。

    redis 127.0.0.1:6379> sdiff myset myset2 myset3

    1) "d"

    2) "b"

#将3个集合的差异成员存在在diffkey关联的Set中,并返回插入的成员数量。

    redis 127.0.0.1:6379> sdiffstore diffkey myset myset2 myset3

    (integer) 2

#查看一下sdiffstore的操作结果。

    redis 127.0.0.1:6379> smembers diffkey

    1) "d"

    2) "b"

#从之前准备的数据就可以看出,这三个Set的成员交集只有c。

    redis 127.0.0.1:6379> sinter myset myset2 myset3

    1) "c"

#将3个集合中的交集成员存储到与interkey关联的Set中,并返回交集成员的数量。

    redis 127.0.0.1:6379> sinterstore interkey myset myset2 myset3

    (integer) 1

#查看一下sinterstore的操作结果。

    redis 127.0.0.1:6379> smembers interkey

    1) "c"

#获取3个集合中的成员的并集。    

    redis 127.0.0.1:6379> sunion myset myset2 myset3

    1) "b"

    2) "c"

    3) "d"

    4) "e"

    5) "a"

#将3个集合中成员的并集存储到unionkey关联的set中,并返回并集成员的数量。

    redis 127.0.0.1:6379> sunionstore unionkey myset myset2 myset3

    (integer) 5

#查看一下suiionstore的操作结果。

    redis 127.0.0.1:6379> smembers unionkey

    1) "b"

    2) "c"

    3) "d"

    4) "e"

    5) "a"



 【应用范围】:

      1). 可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。

      2). 充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections命令就可以充分发挥它的方便和效率的优势了。


© 著作权归作者所有

白色白色T恤
粉丝 2
博文 42
码字总数 53857
作品 0
朝阳
高级程序员
私信 提问
恒宇少年/spring-boot-chapter

简书整套文档以及源码解析 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 003 Quer...

恒宇少年
2018/04/19
0
0
Redis进阶不得不了解的内存优化细节

声明:本文内容来自《Redis开发与运维》一书第八章。 Redis所有的数据都在内存中,而内存又是非常宝贵的资源。对于如何优化内存使用一直是Redis用户非常关注的问题。本文让我们深入到Redis细...

全部原谅
2018/07/17
0
0
Redis(一)、安装与配置文件详解

Redis数据库安装与配置文件详解 第1章 redis简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(...

呀哈喽
2018/04/06
0
0
SpringBoot集成Redis实现缓存处理(Spring AOP实现)

第一章 需求分析 计划在Team的开源项目里加入Redis实现缓存处理,因为业务功能已经实现了一部分,通过写Redis工具类,然后引用,改动量较大,而且不可以实现解耦合,所以想到了Spring框架的A...

Javahih
2017/12/14
0
2
快速掌握Redis——第四招:数据类型大爆炸

1.redis 数据类型 string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hashs(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作。 ...

vasks
2015/03/27
181
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7 新手阿里云服务器安装mongodb

简介 MongoDB 是一个基于分布式 文件存储的NoSQL数据库 由C++语言编写,运行稳定,性能高 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案 MongoDB特点 模式自由 :可以把不同结构的文档存...

醉雨
27分钟前
3
0
sql注入漏洞,应屏蔽SQL注入攻击

注:SQL注入好比是前端URL传参数请求时参数以SQL 做为参数传入,如 select 1 from dual where 1=1 or 1=1 and 1=2;(类似这样的SQL语句) 防御方法 如果自己编写防注代码,一般是先定义一个函...

颜丽
27分钟前
3
0
装饰者模式

 代理模式与装饰者模式看起来很像,都实现基础对象实现的接口,在其自身对象中都保存着对被代理/被装饰者的对象引用。   先来看看装饰者模式的定义:动态的将责任附加到被装饰者对象上,用...

铁骨铮铮
31分钟前
2
0
我为什么飞行 10000 公里去西班牙参加 KubeCon?

2019 年 5 月 20 日至 23 日, 由 Cloud Native Computing Foundation (CNCF) 主办的云原生技术大会 KubeCon + CloudNativeCon EU(欧洲场)即将在热情洋溢的巴塞罗那盛装启幕。 作为云计算领...

zhaowei121
49分钟前
2
0
Node.getTextContent() not found 解决办法【不需要调整builder path下面包顺序】

新导入的工程,w3c的getTextContent找不到,response的setCharacterEncoding找不到,网上很多教程都是“调整工程builder path的lib包顺序把jre、tomcat调到上面即可”,但是进入项目的build...

嘿嘿嘿IT
56分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部