redis源码之set结构
时间:2022-07-26
本文章向大家介绍redis源码之set结构,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
关于set的命令和常用场景我们暂时先不说了,如果对命令不太熟悉的朋友可以用 help @set命令查看,我们先来看set中的一种现象
127.0.0.1:6379> sadd set-1 a b c d e
(integer) 5
127.0.0.1:6379> SMEMBERS set-1
1) "a"
2) "c"
3) "d"
4) "b"
5) "e"
大家都知道set是一种无序的集合,通过SMEMBERS取出所有元素,元素是无序的展示的,这一切很正常,但是我们接着往下看
127.0.0.1:6379> sadd set-2 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> SMEMBERS set-2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
这一次我们给set-2添加的元素全部都是数字,通过SMEMBERS取出所有元素,结果居然是排序过的(如果给set-2再添加任意一个非数字的元素,结果立即会变为无序),但是我们都知道set是一种无序的集合,这是为什么呢?
其实我们可以分别看一下set-1和set-2的类型
127.0.0.1:6379> object encoding set-1
"hashtable"
127.0.0.1:6379> object encoding set-2
"intset"
我们发现set-1是hashtable类型,而set-2是intset类型的
其实对于redis的set类型来说,set是无序的,自动去重的集合数据类型,set数据结构底层实现为一个value为null的字典(dict),当数据可以用整型表示时,set集合将被编码为intset数据结构。两个条件任意满足时set将用hashtable存储数据。1:元素个数大于set-max-iniset-entries(默认为512) 2:元素无法用整型表示 set-max-iniset-entries
其实intset类型的源码也比较简单
typedef struct intset {
uint32_t encoding; //编码类型
uint32_t length; //元素个数
int8_t contents[]; //元素存储
} intset;
#define INTSET_ENC_INT16 (sizeof(int16_t))
#define INTSET_ENC_INT32 (sizeof(int32_t))
#define INTSET_ENC_INT64 (sizeof(int64_t))
整型集合是一个有序的,存储整型数据的结构,整型集合在redis中可以保存int16_t,int32_t,int64_t类型的整型数据,并且可以保证集合中不会出现重复数据。
intset的优势主要在于查找方便,毕竟已经排过序,另外是否需要扩容也很好判断,直接看最大的值就可以了
- 如何利用深度学习写诗歌(使用Python进行文本生成)
- 注意:字符串substring方法在jkd6,7,8中的差异。
- JavaWeb项目架构之NFS文件服务器
- 轻松几步搞定SSH连接Git配置
- 免费使用谷歌GPU资源训练自己的深度模型
- Git安装及配置5分钟快速教程
- 风格迁移原理及tensorflow实现-附代码
- 手把手教你搭建目标检测器-附代码
- JavaWeb项目架构之FastDFS分布式文件系统
- JavaWeb项目架构之Redis分布式日志队列
- 超快速!10分钟入门Keras指南
- Git操作常用的命令都在这里了。
- 网站性能测试指标(QPS,TPS,吞吐量,响应时间)详解
- day03.集群部署zookeeper【大数据教程】
- 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 数组属性和方法
- 【技术创作101训练营】腾讯云主机上部署 FRP+Teamviewer 穿透内网进行远程运维
- 图像处理笔记(7)---- OpenCV 绘制无填充矩形
- 图像处理笔记(8)---- OpenCV 获取追踪对象的HSV值
- (数据科学学习手札95)elyra——jupyter lab平台最强插件集
- Python 序列化/反序列化自定义类型
- Windows10下使用VS2017编译和使用yaml-cpp库
- CentOS7下编译yaml-cpp库
- SAP Spartacus CurrentProductService返回的null对象
- SAP Spartacus产品明细页面用Observable显示产品名称
- 关于rxjs里operators filter和map的详细讨论
- 用代码查看SAP Spartacus购物车内的行项目
- rxjs的map和switchMap在SAP Spartacus中的应用
- 用代码查看SAP Spartacus购物车内的行项目
- rxjs fromEvent的用法
- Python2和Python3的区别简单总结