redis 系列13 集合对象
一. 集合对象概述
这里的集合是string类型的无序集合,在集合对象中集合成员是唯一的,这就意味着集合中不能出现重复的数据。集合是通过哈希表实现的,集合中最大的成员数为 232-1 (4294967295, 每个集合可存储40多亿个成员)。集合对象的编码可以是intset或者hashtable。
1.1 intset编码
intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。例如下面使用整数集合:
127.0.0.1:> sadd numbers
(integer)
127.0.0.1:> object encoding numbers
"intset"
1.2 hashtable编码
另一个编码是hashtable,集合对象使用字典作为底层实现,字典的每个键都是一个字符串对象,每个字符串对象包含了一个集合元素,而字典的值则全部被设置为null。
127.0.0.1:> sadd furits "apple" "banana"
(integer)
127.0.0.1:> object encoding furits
"hashtable"
两个底层结构如下图所示,作为字典结构,键都是一个字符串对象,值都为NULL。

1.3 编码转换
当集合对象可以同时满足以下两个条件时,对象使用intset编码:(1) 集合对象保存的所有元素都是整数值;(2) 集合对象保存的元素数量不超过512个。当不能满足这两个条件的集合对象使用的是hashtable编码。对于第二个条件的上限值可以通过配置文件中的set-max-intset-entries选项来修改。
127.0.0.1:6379> config get set-max-intset-entries
1) "set-max-intset-entries"
2) "512"
二. 集合命令实现
-- Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。
127.0.0.1:> sadd myset "hello" "foo"
(integer) -- Scard 命令返回集合中元素的数量
127.0.0.1:> scard myset
(integer) -- Sdiff 命令返回给定集合之间的差集, 返回包含差集成员的列表。下面是返回myset1对比myset2,返回myset1的差集。
127.0.0.1:> sadd myset1 "hello" "foo" "bar"
(integer)
127.0.0.1:> sadd myset2 "hello" "world"
(integer)
127.0.0.1:> sdiff myset1 myset2
) "foo"
) "bar" -- Sdiffstore 命令将差集存储在指定的集合中,如果指定的集合(destination) key已存在,则会被覆盖, 下面集合key为 destset不存在,创建该新集合并且新集合值为二个集合的差集。
。
127.0.0.1:> sdiffstore destset myset1 myset2
(integer)
127.0.0.1:> smembers destset
) "foo"
) "bar" -- Sinter 命令返回给定所有给定集合的交集,与Sdiff相反。下面返回myset1和myset2二个集合共同有的值。
127.0.0.1:> sinter myset1 myset2
) "hello" -- Sinterstore命令将给定集合之间的交集存储在指定的集合中。如果指定的集合已经存在,则将其覆盖, 与Sdiffstore 相反。下面集合key为 destset2不存在,创建该新集合并且新集合值为二个集合的交集。 127.0.0.1:> sinterstore destest2 myset1 myset2
(integer)
127.0.0.1:> smembers destest2
) "hello" -- Sismember 命令判断成员元素是否是集合的成员。如果成员元素是集合的成员,返回 。
127.0.0.1:> sismember myset1 "hello"
(integer) -- Smembers 命令返回集合中的所有的成员。 不存在的集合 key 被视为空集合。
127.0.0.1:> smembers myset1
) "hello"
) "bar"
) "foo" -- Smove 命令将指定成员 member 元素从 source 集合移动到 destination 集合,SMOVE 是原子性操作。
127.0.0.1:> smembers myset1
) "hello"
) "bar"
) "foo"
127.0.0.1:> smembers myset2
) "hello"
) "world"
127.0.0.1:> smove myset1 myset2 "bar" --将myset1的元素移到myset2中
(integer)
127.0.0.1:> smembers myset1 -- myset1中少了"bar"元素
) "hello"
) "foo"
127.0.0.1:> smembers myset2 --myset2 中多了"bar" 元素
) "hello"
) "world"
) "bar" --Spop 命令用于随机移除指定count元素数量,并返回集合中的移出的元素。
127.0.0.1:> smembers myset1
) "three"
) "one"
) "hello"
) "two"
127.0.0.1:> spop myset1 --随机移除3个
) "hello"
) "two"
) "three"
127.0.0.1:> smembers myset1 --只剩下一个元素
) "one" --Srem 命令用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略。
127.0.0.1:> smembers myset1
) "three"
) "one"
) "two"
127.0.0.1:> srem myset1 "one" --移除指定元素
(integer)
127.0.0.1:> smembers myset1 --只剩下二个元素
) "three"
) "two" --Sunion 命令返回给定集合的并集,相当于sql中的join合并去重。
127.0.0.1:> smembers myset2
) "one"
) "two"
127.0.0.1:> smembers myset1
) "three"
) "two"
127.0.0.1:> sunion myset2 myset1 --返回合并后的元素
) "three"
) "one"
) "two" -- Sunionstore 命令将给定集合的并集,存储在指定的集合 destination 中。
127.0.0.1:> sunionstore myset myset2 myset1
(integer)
127.0.0.1:> smembers myset --并集后,存储到了myset集合中
) "three"
) "one"
) "two -- Sscan 命令用于迭代集合键中的元素
127.0.0.1:> smembers myset
) "three"
) "one"
) "two"
127.0.0.1:> sscan myset match t*
) ""
) ) "three"
) "two"
redis 系列13 集合对象的更多相关文章
- redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换
一. 概述 对于前面的五章中,已清楚了数据对象的类型以及命令实现,其实还有一种数据对象为HyperLogLog,以后需要用到再了解.下面再了解类型检查,内存回收,对象共享,对象的空转时长. 1.1 ...
- redis 系列10 字符串对象
一. 字符串对象编码 Redis中字符串可以存储3种类型,分别是字节串(byte string).整数.浮点数.在上章节中讲到字符串对象的编码可以是int, raw,embstr. 如果一个字符串对象 ...
- redis 系列11 列表对象
一. 列表对象概述 Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素到列表的头部(左边)或者尾部(右边).一个列表最多可以包含 232 - 1 个元素 (4294967295, ...
- 【目录】redis 系列篇
随笔分类 - redis 系列篇 redis 系列27 Cluster高可用 (2) 摘要: 一. ASK错误 集群上篇最后讲到,对于重新分片由redis-trib负责执行,关于该工具以后再介绍.在进 ...
- redis 系列14 有序集合对象
一. 有序集合概述 Redis 有序集合对象和集合对象一样也是string类型元素的集合,且不允许重复的成员.不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合中的成员 ...
- redis 系列9 对象类型(字符串,哈希,列表,集合,有序集合)与数据结构关系
一.概述 在前面章节中,主要了解了 Redis用到的主要数据结构,包括:简单动态字符串.链表(双端链表).字典.跳跃表. 整数集合.压缩列表(后面再了解).Redis没有直接使用这些数据结构来实现键值 ...
- Java 集合系列 13 WeakHashMap
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- 从Redis中删除大集合对象的方法
Redis中的大集合对象,如set.zset等,如果有上千万个元素,一般是不能直接用del命令来删除的,因为del命令可能会耗时几秒钟,而redis本身是单线程的,在高并发的情况下会阻塞大量的请求,严 ...
- redis是如何存储对象和集合的
在项目中,缓存以及mq消息队列可以说是不可或缺的2个重要技术.前者主要是为了减轻数据库压力,大幅度提升性能.后者主要是为了提高用户的体验度,我理解的是再后端做的一个ajax请求(异步),并且像ribb ...
随机推荐
- 获取JSON格式的树形
需求:前端需要一个JSON格式的Tree,例如组织机构维护的时候使用到的,需要一次性返回给前端.所以编写了一个算是半通用的查询方法 1.数据库Dao层: /** * 根据父ID获取子数据 * @par ...
- WinCC OA基本概念
WinCC OA 是一个模块化软件架构的系统.所需的功能由不同任务创建的特定单元处理.在WinCC OA中,这些单元称为管理器 - 管理器是软件自身的一些独立的处理过程. 图:WinCC OA系统由功 ...
- Python3 文件
f=open('C:\\Users\\fengx\\Desktop\\sharing\\test.txt') 如果打开文件的格式不匹配,可能会报如下错: >>> open('C:\U ...
- RSP小组——团队冲刺博客六
RSP小组--团队冲刺博客六 冲刺日期:2018年12月18日 前言 各成员今日(12.18)完成的任务 李闻洲,赵乾宸代码合并 马瑞蕃图形后续支持,编写博客,燃尽图 蒋子行会议记录 各个成员的任务安 ...
- Hashlib加密,内置函数,安装操作数据库
hashlib模块的md5加密: md5同样的内容加密后是一样的 md5加密后是不可逆的.即能加密,没办法解密. 撞库: 只是针对简单的,因为同样的内容加密后是一样的,难一点就不行了. 登录密码:注册 ...
- connector for python实验
MySQL 是最流行的关系型数据库管理系统,如果你不熟悉 MySQL,可以阅读 MySQL 教程. 下面为大家介绍使用 mysql-connector 来连接使用 MySQL, mysql-conne ...
- Linux shell 编程文件比较
文件比较允许你测试Linux 文件系统上文件和目录的状态 比较 描述 -d file 检查file是否存在并是一个目录 -e file 检查file是否存在 -f file 检查file是否存在并是 ...
- TCPDF解决保存中文文件名的方法
PHP使用TCPDF生成PDF文件时,如果文件名是中文会被直接过滤掉,以下是TCPDF不能保存中文文件名的解决方法: 打开tcpdf.php文件,找到output函数,大约在8467行 或(7554) ...
- Spring源码工程导入Eclsipse缺少两个jar文件
按照<Spring源码深度解析>所述,使用gradle cleanidea eclipse将Spring源码转为eclipse工程后,导入eclipse,最后发现还是缺少spring-cg ...
- 用Vue2仿京东省市区三级联动效果
三级联动,随着越来越多的审美,出现了很多种,好多公司都仿着淘宝的三级联动 ,好看时尚,so我们公司也一样……为了贴代码方便,我把写在data里面省市区的json独立了出来,下载贴进去即可用,链接如下 ...