redis学习笔记-set
1. 集合简介
本文会对redis中的集合对象进行学习。关于对象是什么,之前已经总结过,本文不再赘述,直接开始介绍集合对象。
集合的对象编码可以使intest或者hashtable。具体使用什么编码,也是取决于存储的键值对。
当同时满足以下两个条件时,使用intest编码:
- 集合对象保存的元素全为整数值;
- 集合对象保存的元素不超过512个。
不满足以上两个条件的,均使用hashtable编码。
2. intest&hashtable简介
2.1 整数集合intset
当一个集合只包含整数值元素,并且元素不多时,redis就会用intset作为集合的底层实现。
先看一下intset.h中对intset struct的定义:
typedef struct intset {
//编码方式
uint32_t encoding;
//集合包含的元素数量
uint32_t length;
//保存元素的数组
int8_t contents[];
} intset;
从定义能很清楚的看到数组contents是整数集合的底层实现。在contents中,整数值按从小到大的顺序进行排列,并且无重复数据。length集合的数量,也就是contents的长度。
注:contents虽然是int8_t类型,但是并不保存任何int8_t类型的值,保存值的类型取决于encoding。
如果新加入contents的元素类型比当前contents中元素类型都要长时,那么intset就会进行升级操作。
例如现在contents中都是int16_t类型的数据,现在一个int32_t类型的数据要插入,那么就需要将之前contents中8位的元素扩展为16位。
例:现有3个int16位的元素,要插入一个int32的元素,那么前面3个也都要改成32位,因此空间变成4*32=128位
位 |
0~15 |
16~31 |
32~47 |
48~127 |
---|---|---|---|---|
元素 |
1 |
2 |
3 |
new |
分配好空间后,要开始对之前的3个元素做类型转换:
位 |
0~31 |
32~63 |
64~95 |
96~127 |
---|---|---|---|---|
元素 |
1 |
2 |
3 |
4 |
之前的元素3移到64~95位,再依次移动元素2,元素1,最后插入新的元素。
类型改完之后,将encoding变为32位的,length从3改为4.
- 整数集合不支持降级,一旦升级之后,编码会一直保存为升级后的状态。
hash之前讲过,这里不讲了
set的基本操作命令
跟之前讲hash一样,多用help命令,可以查看set下的所有基本操作,redis界面中输入`
help @set`即可查看。
这里只着重说一下几个命令
- SDIFF
差集命令差集有左差右差,SDIFF k1 k2
,会找出k1中有,但k2中没有的元素,SDIFF k2 k1
会找出k2中有,但k1中没有的元素
- SRANDMEMBER
随机的取出集合中一个或者多个元素。SRANDMEMBER k1 2
,随机取出k1中两个不重复的元素,SRANDMEMBER k1 -2
,随机取出k1中两个有可能重复的元素
- SPOP 随机的弹出一个或者多个元素
set的使用场景
首先清楚集合的特征:1. 无序;2.去重
那么如果你希望存重复的数据,set不适合;
set因为是无序的,所以也不会有下标访问,如果你希望访问指定元素,set也不适合。
- set试用于一些随机场景。例如使用SRANDMEMBER,可以从set中随机的取出1个或者多个元素,例如
SRANDMEMBER key 3
,就能从key这个set中,取出3个不重复的元素,SRANDMEMBER key -3
会取出3个有可能重复的元素。因此跟随机有关的场景,可以考虑一下set,例如抽奖。 - set交集、差集、并集的操作,可以使用于一些推荐。例如集合A(1,2,3,4),集合B(3,4,5,6),把A和B看做两个用户,取个交集我们就能看到A,B两个人的共同好友,取个左差集,就能知道B可能认识的用户,右差集就能知道A可能认识的用户。放到购物场景里,就能为用户推荐他可能喜欢的商品
参考《redis设计与实现》
- RabbitMQ入门-Topic模式
- 单分子数据储存取得一大突破,一枚“硬币”存量相当于100部iPhone 7
- Windows 7 旗舰版 VHD安装体验
- Nodejs学习笔记(二)——Eclipse中运行调试Nodejs
- Nodejs学习笔记(三)——一张图看懂Nodejs建站
- 不规则图形的碰撞检测
- 自学WP7第一个例子:时钟
- 教您最简单粗暴的MATLAB入门级爬虫2
- 前台JS(Jquery)调用后台方法 无刷新级联菜单示例
- 项目中对图片的缩放和水印效果
- 照虎画猫写自己的Spring——自定义注解
- 数据分析进阶课程笔记(六)
- 微信发布重磅更新!上线小游戏,小程序间可快速切换
- 鼠标点击层以外的地方层隐藏
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法