集合类型

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

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

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

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

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

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

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

1、增加删除元素命令

sadd key member [member ...]
srem key member [member ...]

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

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

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

smembers key

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

sismember key member

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

4、集合间运算

sdiff key [key ...]
sinter key [key ...]
sunion key [key ...]

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

我们先准备点测试数据。

127.0.0.1:> sadd setA
(integer)
127.0.0.1:> sadd setB
(integer)
127.0.0.1:> sadd setC
(integer)
127.0.0.1:> smembers setA
) ""
) ""
) ""
127.0.0.1:>

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

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

127.0.0.1:> sdiff setA setB
) ""
127.0.0.1:> sdiff setB setC
) ""
127.0.0.1:> sdiff setA setB setC
) ""

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

127.0.0.1:> sinter setA setB
) ""
) ""
127.0.0.1:> sinter setA setB setC
) ""

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

127.0.0.1:> sunion setA setB
) ""
) ""
) ""
) ""
127.0.0.1:> sunion setA setB setC
) ""
) ""
) ""
) ""
) ""

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

scard key
127.0.0.1:> scard setA
(integer)
127.0.0.1:> scard setB
(integer)

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

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

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

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

例:

127.0.0.1:> sunionstore setAll setA setB setC
(integer)
127.0.0.1:> smembers setAll
) ""
) ""
) ""
) ""
) ""

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

srandmember key [count]

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

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

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

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

127.0.0.1:> srandmember setA
) ""
127.0.0.1:> srandmember setA
) ""
) ""
127.0.0.1:> SRANDMEMBER setA
) ""
) ""
) ""
127.0.0.1:> SRANDMEMBER setA -
) ""
) ""

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

spop key

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

127.0.0.1:> spop setA
) ""
127.0.0.1:> smembers setA
) ""
) ""

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

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

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

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

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

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

Redis常用命令入门4:集合类型的更多相关文章

  1. Redis常用命令入门5:有序集合类型

    有序集合类型 上节我们一起学习了集合类型,感受到了redis的强大.现在我们接着学Redis的最后一个类型——有序集合类型. 有序集合类型,大家从名字上应该就可以知道,实际上就是在集合类型上加了个有序 ...

  2. Redis常用命令入门1:字符串类型命令

    Redis总共有五种数据类型,在学习的时候,一定要开一个redis-cli程序,边看边练,提高效率. 一.最简单的命令 1.获得符合规则的键名列表 keys * 这里的*号,是指列出所有的键,同时*号 ...

  3. Redis常用命令代码实例集合

    //连接本地的 Redis 服务 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->auth('12345 ...

  4. Redis常用命令之操作String类型

    场景 Centos中Redis的下载编译与安装(超详细): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103967334 Re ...

  5. Redis常用命令入门3:列表类型

    列表类型 列表类型也是一个我们很长要用到的一个类型.比如我们发博客,要用到博客列表.如果没有列表我们就只能遍历键来获取所有文章或一部分文章了,这个语法是keys,但是这个命令需要遍历数据库中的所有键, ...

  6. Redis常用命令入门2:散列类型

    散列命令 散列类型的键值其实也是一种字典解耦,其存储了字段和字段值的映射,但字段值只能是字符串,不支持其他数据类型,所以说散列类型不能嵌套其他的数据类型.一个散列类型的键可以包含最多2的32次方-1个 ...

  7. Redis常用命令入门——列表类型(一级二级缓存技术)

    获取列表片段 redis > LRANGE KEY_NAME START END lrange命令比较常用,返回从start到stop的所有元素的列表,start和stop都是从0开始. (1) ...

  8. 第2讲 Redis常用命令与高级应用

    目录 一.redis数据类型 5. sorted sets类型和操作 二.Redis常用命令 1.键值相关命令 2.服务器相关命令 三. redis高级应用 1. 给redis服务器设置密码 2.持久 ...

  9. Redis常用命令与高级应用

    附: 127.0.0.1:6379> set xiaofei 小飞 OK 127.0.0.1:6379> get xiaofei "\xe5\xb0\x8f\xe9\xa3\x9 ...

随机推荐

  1. windows平台整合Apache与tomcat

    Apache与Tomcat整合的好处 Apache主要用来解析静态文本,如html.Tomcat虽然也有此功能,但Apache效率大大高于Tomcat,尤其是对于并发数较大的企业级应用,能更好的显示A ...

  2. EXCLE使用中常用函数和公式

    1.查找重复项 IF(COUNTIF(A:A,A1)>1"重复""") 或者 IF(COUNTIF($A$1:$A$100,A1)=1,"&qu ...

  3. NPOI导入xls,xlsx格式实例

    NPOI DLL下载地:http://npoi.codeplex.com/releases using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; us ...

  4. 学习git与github的二三事 (一)

    前一段时间看到了一个参加机器人比赛的同学写的经验之谈,他提到了在比赛时,希望同学们学习一下git来管理代码,于是我就某度了一下,发现了廖雪峰老师的网站,受益匪浅,持续学习中,拜谢大神,顺便记录一下自己 ...

  5. 解决file_get_contents遇到中文文件名无法打开问题

    利用file_get_contents打开文件或采集远程服务器文件如果文名或url中碰到汉字中文那么会出现failed to open stream:Lnvalid argument in错误.   ...

  6. NuGet安装及使用教程

    Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展.在使用Visual Studio开发基于.NET Framework的应用时,Nuget能把在项目中添加.移除和更新引 ...

  7. heart beat/心跳包

    为什么需要heart beat/心跳包?因为tcp keep-alive不能满足人们的实时性的要求,就是这么简单. socket的长时间连接的话,是需要心跳包.心跳包就是维持双方的连接,每隔一段时间发 ...

  8. JS对象深刻理解 - 1

    JavaScript创建对象   JavaScript 有Date.Array.String等这样的内置对象,功能强大使用简单,人见人爱,但在处理一些复杂的逻辑的时候,内置对象就很无力了,往往需要开发 ...

  9. iOS资源整理

    开发类库 http://www.code4app.com/thread-7831-1-1.html Github-iOS备忘 http://github.ibireme.com/github/list ...

  10. .Net架构必备工具列表

    ★微软MSDN:每个开发人员现在应该下载的十种必备工具 点此进入 ★网友总结.Net架构必备工具列表 Visual Studio 这个似乎是不言而喻的,只是从严谨的角度,也列在这.实际上,现在也有一个 ...