- 从前面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读书笔记] 第一部分 数据结构与对象 对象类型的更多相关文章

  1. [redis读书笔记] 第一部分 数据结构与对象 简单动态字符串

    本读书笔记主要来自于<<redis设计与实现>> -- 黄键宏(huangz) redis主要设计了字符串,链表,字典,跳跃表,整数集合,压缩列表来做为基本的数据结构,实现键值 ...

  2. [redis读书笔记] 第一部分 数据结构与对象 对象特性

    一 类型检查和多态    类型检查,即有的命令是只针对特定类型的,如果类型不对,就会报错,此处的类型,是指的键类型,即robj.type.下面为有类型检查的命令: 对于某一种类型,redis下底层的实 ...

  3. [REDIS 读书笔记]第一部分 数据结构与对象 跳跃表

    下面是跳跃表的基本原理,REDIS的实现大致相同 跳跃表的一个特点是,插入NODE是通过随机的方式来决定level的,比较奇特 下面是skipList的一个介绍,转载来的,源地址:http://ken ...

  4. [redis读书笔记] 第一部分 数据结构与对象 字典

    三 字典 字典是Hash对象的底层实现,比如用HSET创建一个HASH的对象,底层可能就是用一个字典实现的键值对. 字典的实现主要设计下面三个结构: /* * 哈希表节点 */ typedef str ...

  5. [redis读书笔记] 第一部分 数据结构与对象 整数集合

    typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t c ...

  6. [redis读书笔记] 第一部分 数据结构与对象 压缩列表

    压缩列表是为了节省内存而设计的,是列表键和哈希键的底层实现之一. 压缩列表的逻辑如下,

  7. [redis读书笔记] 第一部分 数据结构与对象 链表

    二 链表 1.链表节点使用ListNode结构,是一个双向的链表,同时,还实现了一个控制所有ListNode的结构list: typedef struct listNode { // 前置节点 str ...

  8. 《javascript权威指南》读书笔记——第一篇

    <javascript权威指南>读书笔记——第一篇 金刚 javascript js javascript权威指南 由于最近想系统学习下javascript,所以开始在kindle上看这本 ...

  9. 《Linux内核设计与实现》读书笔记——第一、 二章

    <Linux内核设计与实现>读书笔记--第一. 二章 标签(空格分隔): 20135321余佳源 第一章 Linux内核简介 1.Unix内核特点 十分简洁:仅提供几百个系统调用并且有明确 ...

随机推荐

  1. Java类成员之属性

    属性含义:对应类中的成员变量. 语法格式:修饰符 数据类型 属性名 = 初始化值; 1.修饰符常用的有权限修饰符(private.default.protected.public) 以及其他修饰符(s ...

  2. 第7节class与style绑定

    方法一 效果图:  方法二 效果图:  方法三 效果图: 代码: <!DOCTYPE html> <html lang="en" xmlns:v-bind=&qu ...

  3. RabbitMQ入门(二)工作队列

      在文章RabbitMQ入门(一)之Hello World,我们编写程序通过指定的队列来发送和接受消息.在本文中,我们将会创建工作队列(Work Queue),通过多个workers来分配耗时任务. ...

  4. python 线程信号量

    线程信号量和进程信号量相似 # 线程信号量 import time from threading import Semaphore from threading import Thread def t ...

  5. 01Java语言基础

    [实验任务四]: 1.程序设计思想 根据RandomStr.java,随机生成6位字母,在对话框中输出,用户根据随机生成的验证码对应输入,程序根据用户输入的内容与系统随机生成的验证码字符比较,若相等, ...

  6. 彻底理解Future模式

    先上一个场景:假如你突然想做饭,但是没有厨具,也没有食材.网上购买厨具比较方便,食材去超市买更放心. 实现分析:在快递员送厨具的期间,我们肯定不会闲着,可以去超市买食材.所以,在主线程里面另起一个子线 ...

  7. 机器学习环境配置系列三之Anaconda

    1.下载Anaconda文件 进入anaconda的官网 选择对应的系统 选择希望下载的版本(本人下载的是Anaconda 5.3 For Linux Installer Python 3.7 ver ...

  8. JZOJ4238 纪念碑

    Description 2034年,纪念中学决定修建校庆100周年纪念碑,作为杰出校友的你被找了过来,帮校方确定纪念碑的选址. 纪念中学的土地可以看作是一个长为n,宽为m的矩形.它由n* m个1*1的 ...

  9. Ceph 之RGW Cache

    Overview 缓存是为达到系统快速响应的一项关键技术,Ceph 作为一个复杂的分布式存储系统,有多种.多级缓存存在.缓存按照位置分为: 客户端缓存 服务端缓存 网络中缓存 按照部署方式分为: 单体 ...

  10. Java程序员学习Go指南(终)

    我的博客:https://www.luozhiyun.com/archives/215 context.Context类型 Context类型可以提供一类代表上下文的值.此类值是并发安全的,也就是说它 ...