当前位置: 首页 > news >正文

Redis常用命令入门4:集合类型

集合类型

之前我们已经介绍过了最基本的字符串类型、散列类型、列表类型,下面我们一起学习一下集合类型。

集合类型也是体现redis一个比较高价值的一个类型了。因为Redis的集合类型,所以我们可以很容易的在Redis中执行差集运算、交集运算、并集运算。

首先我们先介绍一下集合类型和列表类型的区别,其实学过面向对象的语言的同学应该都能猜到这些类型有什么不同。

①集合类型和列表类型还是都能存储2^32-1个字符串

集合类型是无序的,列表类型是有序的

集合类型是唯一的,列表类型的值是不唯一的

下面我们一起来看一下语法。

1、增加删除元素命令

sadd命令是用来向集合中增加元素的,当然根据前面的学习经验,如果集合不存在,肯定是会自动创建的。但是这里有点需要注意的是,如果元素已存在,那么他会忽略而不会覆盖。返回值是成功加入元素的数量(忽略的元素不算)。

srem命令也是一样,删除元素,如果元素存在才会删除成功,返回值是成功删除的元素的个数。

2、获得集合中的所有元素

3、判断元素是否在集合中

这个判断操作的时间复杂度是O(1),无论集合中的元素有多少,这个命令始终都很很快的返回结果。存在返回1,不存在或没有这个键的时候都返回0 。

4、集合间运算

这三个命令才能使Redis大显身手!

我们先准备点测试数据。

(1)下面我们来介绍sdiff命令,这个命令实际上是差集运算。

集合A与集合B的差值运算表示为A-B,代表所有属于A且不属于B的元素构成的集合。这个命令同时支持传入多个键,意思是A与B先做差集运算,然后结果再与C做差集运算。

(2)接下来我们介绍sinter命令,这个命令用来对多个集合执行交集运算。集合A与集合B的交集表示为A∩B,即所有属于A且属于B的元素构成的集合。这个命令也同时支持传入多个键,也是一样,一步一步的做交集运算。

(3)最后我们介绍并集运算命令sunion。集合A与集合B的并集意思是既属于A也属于B的集合。同样支持多个键传入。

5、获得集合中元素的个数

条命令用来获取集合中元素的个数。同样集合不存在返回0 。

6、进行集合运算并将结果存储

这里在所有的集合命令之后加了个store,很清楚就是存储的意思了。destination就是目的地,也就是我们要存储的键名

例:

127.0.0.1:6379> sunionstore setAll setA setB setC
(integer) 5
127.0.0.1:6379> smembers setAll
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

 

7、随机获得集合中的元素

这个命令用来随机从集合中获取一个元素,count参数用来一词获取多个元素,根据count的正负有不同的意义。

(1)当count为正数时,获取count个不重复的元素,如果count大于所有值的个数,则返回全部元素。

(2)负值时,获得|count|个元素,但有可能相同。

其实这个随机并不是非常随机,因为实际上redis的集合用的是散列的存储结构,有兴趣的读者可以自己深入研究一下。

127.0.0.1:6379> srandmember setA 1
1) "1"
127.0.0.1:6379> srandmember setA 2
1) "3"
2) "2"
127.0.0.1:6379> SRANDMEMBER setA 5
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> SRANDMEMBER setA -2
1) "3"
2) "3"

8、从集合中弹出一个元素

之前我们也看过lpop与rpop,那是从列表中弹出,但是集合是无序的,所以spop是随机弹出。 (弹出的元素被删除,不在原来的集合中

127.0.0.1:6379> spop setA 1
1) "2"
127.0.0.1:6379> smembers setA
1) "1"
2) "3"

下面我们来举例一个集合的具体应用。

在我们文章存储的时候有个标签tag,这个我们在关系数据库的时候都需要使用中间表关联。但是在Redis中,我们可以很方便的处理。

对每篇文章,我们使用一个post:文章ID:tags的键,类型为集合,存储一篇文章所属的tags,这样本身关系型数据库我们需要关联文章表、标签表、中间关系表三个表的复杂操作,在Redis中就很好处理了。

有时候我们还需要获取指定标签的所有文章,我们还需要增加一类的键,即tag:标签名称:posts的集合类型键,存储每个标签的文章ID集合,这样我们每次想要获取所有属于某个标签的文章列表的时候也不用像关系数据库那样关联那么多表,而是直接通过键就可以直接获得了。

而在我们想要获取比如同时属于java和redis标签的文章时,我们只需要对tag:java:posts和tag:redis:posts做交集运算就OK了,是不是很方便呢?

到此我们集合就介绍完了。

转载于:https://www.cnblogs.com/Joans/p/5806742.html

相关文章:

  • 工作反思
  • 特殊数列的求和
  • wireshark 导出所有filter出来的包
  • TWRP基于omnirom 6.0.1编译教程
  • Django知识(二)
  • C高级 框架开发中红黑树结构
  • FOJ 2181 快来买肉松饼
  • Android 加载大图片到内存
  • ACM/OI 出题用
  • linux压缩排除
  • 0.python class
  • 今日成长笔记2016-09-05
  • 手机网站的几点注意
  • HTML5 文件域+FileReader 分段读取文件并上传到服务器(六)
  • css 兼容
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【笔记】你不知道的JS读书笔记——Promise
  • 07.Android之多媒体问题
  • EOS是什么
  • Mocha测试初探
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • vue脚手架vue-cli
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 实习面试笔记
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 阿里云ACE认证学习知识点梳理
  • 函数计算新功能-----支持C#函数
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • ​你们这样子,耽误我的工作进度怎么办?
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #AngularJS#$sce.trustAsResourceUrl
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (C语言)球球大作战
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (编译到47%失败)to be deleted
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (转)visual stdio 书签功能介绍
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET Core中Emit的使用
  • .NET Framework与.NET Framework SDK有什么不同?
  • .Net IOC框架入门之一 Unity
  • .net refrector
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • .so文件(linux系统)
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @Not - Empty-Null-Blank
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [bzoj1038][ZJOI2008]瞭望塔
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [C++随笔录] 红黑树