搞懂redis系列--redis设计与实现

学习Redis不仅要学习各种命令的使用,如果有时间最好阅读以下redis的源码。
先推荐一本书黄建宏的《redis设计与实现》,里面非常清晰的讲述的Redis3.0的源码实现,本博客也是在阅读此书之后的一些总结和感悟。(本博客基于Redis5.0.3)

一.数据结构与对象

用过Redis的中支持的五大数据类型:字符串String、列表List、集合Set、哈希表Hash、有序集合ZSet。
那么他们底层C语言是如何实现的呢?先来介绍一下底层所用到的数据结构,分别是:简单动态字符串、链表、字典、跳跃表、整数集合、压缩列表。

简单动态字符串

简单动态字符串(simple dynamic string),简称SDS。说白了就是在C字符串上封装一层,类似于Java中的String。
在这里插入图片描述
在这里插入图片描述

链表

list
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

字典

哈希表
在这里插入图片描述
字典有两个哈希表,用来rehash
在这里插入图片描述
在这里插入图片描述

跳跃表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
相比二叉查找树,rebalance成本低,依靠随机

整数集合

在这里插入图片描述

压缩列表

zipList是list和hash的底层实现之一。
即当list包含少量的列表项或者小整数。要么就是长度比较短的字符串,则会使用ziplist
当hash键包含少量的少量的键值对,并且这个键值对和值要么就是小整数值,要么就是长度较短的字符串 则会使用ziplist

zipList是为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构。
在这里插入图片描述
在这里插入图片描述

对象

Redis并没有用以上的数据结构来实现数据库,而是基于这些数据结构创建了一个对象系统,包括:字符串对象、列表对象、哈希对象、集合对象、有序集合对象五中类型。

typedef struct redisObject {
    unsigned type:4; //类型
    unsigned encoding:4; //编码
    void *ptr; //指向底层数据结构的指针
    ...
} robj;

type:记录了对象的类型,可以是一下常量中的一个:
在这里插入图片描述
可以用TYPE命令查看
encoding:记录了指针指向对象的底层实现的数据结构。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值