码迷,mamicode.com
首页 > 其他好文 > 详细

[redis读书笔记] 第一部分 数据结构与对象 对象以及总结

时间:2017-02-26 22:40:13      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:释放   计数   ref   结构   变化   数据库   pre   struct   分析   

- 从前面redis的基本数据结构来看,可以看出,redis都是在基本结构(string)的基础上,封装了一层统计的结构(SDS),这样让对基本结构的访问能够更快更准确,提高可控制度。

- redis的键值对中,键必然是用字符串对象实现的,所以我们一般说的列表键,指的是字符串键+列表值。

- 但是redis并没用这些数据结构直接实现redis的键值数据库,而是基于这些数据结构有一个对象系统,这个系统包括:字符串对象,列表对象,哈希对象,集合对象和有序集合对象,每一种对象都可能用到一到多种基本的数据结构。对象的实现如下:

typedef struct redisObject {

    // 类型
    unsigned type:4;

    // 编码
    unsigned encoding:4;

    // 对象最后一次被访问的时间
    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会直接分配一个内存给两个结构用,那么释放的时候也就只要释放一次,同时,由于在同一个内存里,利用缓存来提高访问速率也有优势,

 二 列表对象:

 

[redis读书笔记] 第一部分 数据结构与对象 对象以及总结

标签:释放   计数   ref   结构   变化   数据库   pre   struct   分析   

原文地址:http://www.cnblogs.com/jiangz222/p/6446137.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!