[redis读书笔记] 第一部分 数据结构与对象 对象类型
- 从前面redis的基本数据结构来看,可以看出,redis都是在基本结构(string)的基础上,封装了一层统计的结构(SDS),这样让对基本结构的访问能够更快更准确,提高可控制度。
- redis的键值对中,键必然是用字符串对象实现的,所以我们一般说的列表键,指的是字符串键+列表值。
- 但是redis并没用这些数据结构直接实现redis的键值数据库,而是基于这些数据结构有一个对象系统,这个系统包括:字符串对象,列表对象,哈希对象,集合对象和有序集合对象,每一种对象都可能用到一到多种基本的数据结构。对象的实现如下:
typedef struct redisObject { // 类型
unsigned type:; // 编码
unsigned encoding:; // 对象最后一次被访问的时间
unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */ // 引用计数
int refcount; // 指向实际值的指针
void *ptr; } robj;
其中,type指的是对象类型,encoding指的是下面实现的具体数据结构的类型,*ptr指向实现的数据结构,refcount用来做内存回收。
对于某一种对象,它的type是固定的,但是encoding是可以变化的,比如type为REDIS_STRING,encoding可以是RAW(SDS)或者INT,具体组合如下图所示:
这样做的好处是,针对一种固定的type,redis可以根据需要切换底层数据结构实现,从而达到效率最大化:
接下来分析一下各个对象
- 字符串对象:
实现较为简单,对于RAW的编码实现,如下图:
embstr也是使用redisobject和sdshdr,但是和raw编码相比,有一个优势,raw的编码会为redisobject和SDS分配两次内存,而embstr会直接分配一个内存给两个结构用,那么释放的时候也就只要释放一次,同时,由于在同一个内存里,利用缓存来提高访问速率也有优势,
二 列表对象:
总的来说,如果列表对像的存储内容较小,使用ziplist的实现,如果较大,使用双向列表(即前面章节里的链表结构)的实现,双向列表实现较复杂,适合大量数据,方便管理。而ziplist的实现节省空间,但是查找的复杂度是o(N),所以大据量打了并不适合用ziplist。(adlist其实查找也是o(N))
三 哈希对象
哈希对象的编码可以使ziplist或者hashtable,比如下面的输入:
分别ziplist和hash table的实现是:
ziplist依然是用于键值对数量小的情况,或者字符串长度较小的情况,因为节省内存,线性分布易于缓存。hashtable查找快,所以利于大数据量
四 集合对象
集合对象可以用hashtable和intset实现:
数据量小或者素有元素都是整数值时,使用intset,否则使用hashtable,使用hashtable主要还是查找快。
五 有序集合:
如下图所示,有序结合对象,会同时使用字典和ziplist/skiplist两种实现,但是实际的成员和分值都是共享的,所以不会有内存浪费,使用字典为了查找更快,使用ziplist/skiplist,为了更快的进行list的范围型操作更快速(比如获取长度等)
[redis读书笔记] 第一部分 数据结构与对象 对象类型的更多相关文章
- [redis读书笔记] 第一部分 数据结构与对象 简单动态字符串
本读书笔记主要来自于<<redis设计与实现>> -- 黄键宏(huangz) redis主要设计了字符串,链表,字典,跳跃表,整数集合,压缩列表来做为基本的数据结构,实现键值 ...
- [redis读书笔记] 第一部分 数据结构与对象 对象特性
一 类型检查和多态 类型检查,即有的命令是只针对特定类型的,如果类型不对,就会报错,此处的类型,是指的键类型,即robj.type.下面为有类型检查的命令: 对于某一种类型,redis下底层的实 ...
- [REDIS 读书笔记]第一部分 数据结构与对象 跳跃表
下面是跳跃表的基本原理,REDIS的实现大致相同 跳跃表的一个特点是,插入NODE是通过随机的方式来决定level的,比较奇特 下面是skipList的一个介绍,转载来的,源地址:http://ken ...
- [redis读书笔记] 第一部分 数据结构与对象 字典
三 字典 字典是Hash对象的底层实现,比如用HSET创建一个HASH的对象,底层可能就是用一个字典实现的键值对. 字典的实现主要设计下面三个结构: /* * 哈希表节点 */ typedef str ...
- [redis读书笔记] 第一部分 数据结构与对象 整数集合
typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t c ...
- [redis读书笔记] 第一部分 数据结构与对象 压缩列表
压缩列表是为了节省内存而设计的,是列表键和哈希键的底层实现之一. 压缩列表的逻辑如下,
- [redis读书笔记] 第一部分 数据结构与对象 链表
二 链表 1.链表节点使用ListNode结构,是一个双向的链表,同时,还实现了一个控制所有ListNode的结构list: typedef struct listNode { // 前置节点 str ...
- 《javascript权威指南》读书笔记——第一篇
<javascript权威指南>读书笔记——第一篇 金刚 javascript js javascript权威指南 由于最近想系统学习下javascript,所以开始在kindle上看这本 ...
- 《Linux内核设计与实现》读书笔记——第一、 二章
<Linux内核设计与实现>读书笔记--第一. 二章 标签(空格分隔): 20135321余佳源 第一章 Linux内核简介 1.Unix内核特点 十分简洁:仅提供几百个系统调用并且有明确 ...
随机推荐
- mongo windows 安装
下载安装包 一路next 打开cmd 或者 power shell 准备本地目录. D: #进入d盘 md data #创建目录 data cd data #进入目录 data md config # ...
- 三、Nginx原理解析
Nginx原理解析 一.反向代理 工作流程 用户通过域名发出访问Web服务器的请求,该域名被DNS服务器解析为反向代理服务器的IP地址: 反向代理服务器接受用户的请求: 反向代理服务器在本地缓存中查找 ...
- 那些不懂hystrix的秘密
一 前言 springcloud系列文章已经出到hystrix,中间知识追寻者跑去学了其它知识,回来感觉spingcloud系列出的也不少了:需要完全理解这篇文章对于初学者需要有一定的基础知识,如果看 ...
- cogs 3. 服务点设置 dijkstra
3. 服务点设置 ★ 输入文件:djsa.in 输出文件:djsa.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 为了进一步普及九年义务教育,政府要在某乡镇建 ...
- 牛客暑期ACM多校 第七场
链接:https://www.nowcoder.com/acm/contest/145/C来源:牛客网 C .题目描述 A binary string s of length N = 2n is gi ...
- 《C# 爬虫 破境之道》:第二境 爬虫应用 — 第一节:HTTP协议数据采集
首先欢迎您来到本书的第二境,本境,我们将全力打造一个实际生产环境可用的爬虫应用了.虽然只是刚开始,虽然路漫漫其修远,不过还是有点小鸡冻:P 本境打算针对几大派生类做进一步深耕,包括与应用的结合.对比它 ...
- 7.JavaSE之类型转换
类型转换: 由于Java是强类型语言,所以要进行运算的时候,需要用到类型转换. 图中优先级从低到高,小数优先级大于整数. 运算中,不同类型的数据需要转换为同一类型,然后进行运算. 强制类型转换:(类型 ...
- Java入门 - 高级教程 - 05.网络编程
原文地址:http://www.work100.net/training/java-networking.html 更多教程:光束云 - 免费课程 网络编程 序号 文内章节 视频 1 概述 2 Soc ...
- 智能指针shared_ptr使用学习
当需要shared_ptr实现向上向下转换时,可以使用 dynamic_pointer_cast 来进行转换 下面是例子: #include <memory> using namespac ...
- Ubuntu固定多个静态ip
步骤: 1.sudo vim /etc/network/interfaces 加入下列内容 auto eth0#此处查看自己的ip信息是eth0还是eth1等等 iface eth0 inet sta ...