1、简单描述

  redis的set类型是string类型数值的无序集合。set元素最大可以包含2的32次方减1个元素。由于set类型是通过hash table实现(旧版本是这样,新版本不确定是不是改用了skip list来实现),所以添加/删除/查找的时间复杂度都是O(1)。hash table有个问题,就是添加或删除的时候,伴随着长度的变化的是需要同步(获取写锁)会阻塞其他读写操作。如果当前版本不是skip list(跳跃表)来实现,那么以后可能也会调整,因为sorted set中已经是使用skip list来实现的。

2、相关命令(基于4.0.1版本)

1)sadd命令:往集合里添加元素,支持同时添加多个元素。

2)scard命令:获取集合中元素的数量。集合不存在则返回0,就是集合里元素个数为0。

3) sismember命令:查看元素是否在集合中,在则返回1,不在集合中或者集合不存在则返回0:

4)smembers命令:获取集合的所有元素,结果是无序的:

5)srem命令:删除元素

srem命令支持删除多个操作,返回成功操作的元素的个数:

6)srandmember命令:随机从集合中获取一个元素,不删除元素。

7)spop命令:从集合中移除并返回随机数量的元素。

8)smove命令:把元素从一个集合移动到另一个集合。原子操作。

9)sinter命令:返回给定集合之间的交集,就是共有的元素。

10)sinterstore命令:把sinter的结果存储到一个集合。

11)sunion命令:获取指定集合的元素的并集。

12)sunionstore命令:把sunion操作的结果存储到一个集合。

【注意】sunionstore命令,把合并的元素存储到一个目标集合中。因为集合的特性,就是集合中不会有重复的元素,那么多次重复sunionstore到同个目标集合也不碍事。

13)sdiff命令:返回给定的集合的差集,支持多个集合计算差集,返回的结果是存在于第一个集合而不在其他集合上的元素;

14)sdiffstore命令:类似sdiff命令,只是会把sdiff命令的结果存储到一个集合。

3、小结

1)注意sadd的操作结果,如果元素是存在的,那么sadd再次添加会返回0。

2)注意spop命令和srandmember命令的区别:前者会把元素从集合中移除,后者仅仅是获取随机的元素,不会移除元素。两者的共同点都是能随机获取1个或多个随机的元素。

3)集合元素数量大的时候,smembers命令会返回很多数据,性能不佳的。如果想判断元素是不是在集合里面用sismember命令,不要用smembers命令获取所有元素然后再去判断。

redis的set类型的更多相关文章

  1. 深入浅出Redis04使用Redis数据库(lists类型)

    一  lists类型及操作 List是一个链表结构,主要功能是push,pop,获取一个范围的所有值等等,操作中key理解为链表的名字. Redis的list类型其实就是一个每个子元素都是sring类 ...

  2. 【redis】03list类型

    list类型 redis的list类型是一个链表结构,他的主要功能是push.pop.获取一个范围的所有值等等一些操作, 咱们push什么意思,push是不是相当于咱们php里面的array_push ...

  3. redis的lists类型

    List是一个链表结构 , 主要功能是push . pop .获取一个范围的所有值等等 , 操作中key理解为链表的名字 . redis 的 list类型其实就是一个每个子元素都是string类型的双 ...

  4. redis的list类型

    1.简单介绍 redis的list类型其实就是一个每个元素都是string类型的双向链表.所以lpush.rpush.lpop和rpop命令的时间复杂度是O(1),list会记录链表的长度,所以lle ...

  5. redis数据类型-字符串类型

    Redis数据类型 字符串类型 字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据.你可以用其存储用户的邮箱.JSON化的对象甚至是一张图片.一个字符串类型键允许存储的 ...

  6. 使用Redis数据库(String类型)

    一 String类型 首先使用启动服务器进程 : redis-server.exe 1. Set 设置Key对应的值为String 类型的value. 例子:向 Redis数据库中插入一条数据类型为S ...

  7. 第二百九十七节,python操作redis缓存-List类型,可以理解为列表

    python操作redis缓存-List类型,可以理解为列表,是可以有重复元素的列表 List操作,redis中的List在在内存中按照一个name对应一个List来存储.如图: lpush(name ...

  8. 第二百九十五节,python操作redis缓存-字符串类型

    python操作redis缓存-字符串类型 首先要安装redis-py模块 python连接redis方式,有两种连接方式,一种是直接连接,一张是通过连接池连接 注意:以后我们都用的连接池方式连接,直 ...

  9. [redis] redis 对string类型数据操作

    package com.xwolf.java.redis; import org.junit.Before; import org.junit.Test; import redis.clients.j ...

随机推荐

  1. ubuntu小技巧(不定期更新)

    1.gedit打开windows保存的txt出现乱码 默认情况下,用ubuntu打开windows保存含有中文的txt文件时会出现乱码. 只需在终端运行以下两条命令则可解决. gsettings se ...

  2. struts2 内容记录

    多xml文件配置 在开发过程中我们经常会将每一张表(如:user表)的struts.xml文件分开,便于管理,故需要建立struts_user.xml文件管理请求等.那么需要用到inculde标签. ...

  3. [转载] 网络IO模型

    转载自http://blog.csdn.net/zhoudaxia/article/details/8974779 同步(synchronous) IO和异步(asynchronous) IO,阻塞( ...

  4. 用StringBuilder和StringBuffer实现的Unicode解码方法的比较(Java)

    初衷是用正则来写一个Unicode字符串转码的方法,一开始是打算结合StringBuilder写的,但是看到jdk7的Matcher.appendReplacement文档中一段示例代码用了Match ...

  5. [转]结合HierarchyViewer和APK文件反编译获得APP元素id值

    背景: 最近在使用Robotium进行Android自动化测试.遇到了一个问题:我需要获得一个View的id(int型数值).此前我在http://maider.blog.sohu.com/25544 ...

  6. python 保存命令执行结果

    保存命令执行的结果需哟使用os.popen("系统命令").read(),然后使用变量赋值输出即可 >>> result = os.popen("df ...

  7. 泛型里的super和extend

    <? extends T>和<? super T>应该怎么用? 网上看到一些比较难懂的回答,但是在EffectiveJava(2th Edition)遇到简单明了的解释: If ...

  8. 2746:约瑟夫问题poj

    2746:约瑟夫问题 总时间限制:  1000ms 内存限制:  65536kB 描述 约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退 ...

  9. css为超过一定宽度的文本内容自动加上省略号

    当在html中某个地方添加文本内容的时候如果内容过长我们会希望他超过一定宽度之后,其余的可以被截断,后面补充为省略号: 实现方式: 1.设置css样式为文本不换行: 2.位包裹文本的标签指定宽度: 3 ...

  10. Java关键字(一) 修饰符private、protected、public和default的作用域

    我们经常用着四种修饰符去修饰变量.方法和类,但是这四种的作用域都一样吗? 其中private和public可能是最多人知道的,但是protected和default可能就不知道其具体的作用域是哪些范围 ...