
redis源码学习
文章平均质量分 59
bettyF
这个作者很懒,什么都没留下…
展开
-
redis数据结构——SDS
在使用中,redis有五种对象:String、Hash、List、Set、Sorted Set那么他们在底层是怎么实现的呢?最近阅读了《Redis设计与实现》一书,参考此书阅读了Redis源码,现在记录在此。在redis中有以下几种数据结构:SDS、链表、字典、跳跃表、整数集合、压缩列表,它们在不同的条件下实现了redis的五种对象。在这一篇中,记录SDS相关内容。源码来自redis-...原创 2018-08-30 21:39:52 · 237 阅读 · 0 评论 -
redis——事件
redis服务器是一个事件驱动程序,分为两种事件:文件事件和时间事件。时间事件比如AOF写入与同步。在服务器启动时,会触发事件驱动,这里直接来看看实现:int main(int argc, char **argv) { //... aeSetBeforeSleepProc(server.el,beforeSleep); aeSetAfterSleepProc(se...原创 2018-09-06 17:32:36 · 421 阅读 · 0 评论 -
redis数据结构——快速列表
quicklist.c - A doubly linked list of ziplists通过上面这句话可以了解到,快速列表是由双向压缩链表实现的。先来看看quicklist的结构:typedef struct quicklist { quicklistNode *head; /* 指向头结点 */ quicklistNode *tail; ...原创 2018-09-03 13:57:40 · 484 阅读 · 0 评论 -
redis数据结构——对象——string对象
首先来看几个例子例1:保存一个long类型的整数值例2:保存一个长度大于32bit的字符串例3:保存一个长度小于等于32bit的字符串以上3个例子,value对象都是string对象,但是它们所对应的encoding各不相同,分别是 “int” 、“raw ”、“embstr”。它们对应的redisOject存储也不相同。下面分别来看看。(这里是看value的存储)...原创 2018-09-03 11:48:15 · 328 阅读 · 0 评论 -
redis数据结构——对象
redis中的string、hash、list、set、sorted set 都是对象。这五种对象分别由上几篇说到的数据结构实现。与java类似的,在java中有object作为所有对象的基类,指代一切对象;redis中也有redisObject作为以上五种对象的基类。以下是redisObject的结构typedef struct redisObject { unsigned...原创 2018-09-03 10:49:36 · 304 阅读 · 0 评论 -
redis——AOF持久化
redis除了提供RDB持久化之外还提供AOF持久化(append only file),从名字可以看出,这个文件的写入方式是append,即,追加,追加的内容就是每次客户端输入的写命令,例如:来看看在输入这一条命令之后生成的appendonly.aof文件:*2$6SELECT$10*3$3SET$3msg$11hello world这其中除了我们输入的写...原创 2018-09-06 12:11:27 · 687 阅读 · 0 评论 -
redis数据结构——压缩列表
但凡是名称中有“压缩”两个字的,都是为了节约内存。压缩列表也不例外。以下是压缩列表的结构图zlbytes zltail zllen entry1 entry2 ... entryN zlend 说明:属性 类型 长度 用途 zlbytes unit32_t 4bit 记录整个ziplist占用的内存字...原创 2018-09-02 22:42:57 · 615 阅读 · 0 评论 -
redis中整数聚合的add操作
以下是inset的add操作intset *intsetAdd(intset *is, int64_t value, uint8_t *success) { /* value的字节数 */ uint8_t valenc = _intsetValueEncoding(value); uint32_t pos; if (success) *success = 1;...原创 2018-09-02 21:50:18 · 1979 阅读 · 0 评论 -
redis数据结构——整数集合
顾名思义,集合中只存在整数,以下是整数集合的结构typedef struct intset { /* 编码方式 */ uint32_t encoding; /* 长度 */ uint32_t length; /* 内容数组 */ int8_t contents[];} intset;在contents数组中,元素按照从小到大的顺序排列...原创 2018-09-02 21:18:15 · 270 阅读 · 0 评论 -
redis数据结构——跳跃表
跳跃表是一种有序的数据结构,它的平均时间复杂度是O(logN),它通过在一个节点中维护多个指向其他节点的指针,达到快速查找和访问其他节点的目的。在redis中跳跃表只用在实现sorted set和集群节点中。下面来看看跳跃表的结构typedef struct zskiplist { /* 节点指针,分别指向头节点和尾节点 */ struct zskiplistNode *...原创 2018-09-02 21:07:50 · 644 阅读 · 0 评论 -
redis中字典的add操作(hash算法、rehash)
下面先来看看dict中的dictAdd方法:/* * 三个参数:字典指针、键、值 */int dictAdd(dict *d, void *key, void *val){ /* 新建节点,entry=null */ dictEntry *entry = dictAddRaw(d,key,NULL); /* 如果entry不为null,返回1 */ i...原创 2018-09-02 20:31:43 · 1915 阅读 · 0 评论 -
redis——RDF持久化
redis是内存数据库,如果数据没有写入磁盘,一旦服务器挂掉或者进程退出,那么数据也就不见了。redis通过将数据保存到一个RDB文件中来实现持久化。RDB文件是一个经过压缩的二进制文件,保存在硬盘上,这样即便是服务器挂掉或者进程退出,数据也不会丢失。在服务器启动时会载入RDB文件。先来看看创建RDB文件redis提供了两种命令来创建RDB文件:SAVE命令和BGSAVE命令。...原创 2018-09-04 16:54:46 · 1221 阅读 · 0 评论 -
redis数据库(CRUD)
在server.h中定义了redisServer结构,下面截取其中和数据库有关的两个部分struct redisServer { redisDb *db; /* 数据库数组,所有的数据库都存放在这里 */ int dbnum; /* 数据库总数 */ //...};可以看到,数据库是存放在redisDb结构的数组里的,下面是redisDb的结构/* 数据库...原创 2018-09-04 14:18:26 · 946 阅读 · 0 评论 -
redis数据结构——字典
redis的字典底层实现是hash表,用来存储K-V对,其中K是唯一的。了解java中hashmap的话,那么字典就很好理解了,完全可以参照hashmap的结构。下面是hash表的结构:typedef struct dictht { dictEntry **table; /* hash表数组 */ unsigned long size; /* hash表大小 */ ...原创 2018-08-31 21:34:47 · 492 阅读 · 0 评论 -
redis数据结构——链表
以下是链表的结构:typedef struct list { listNode *head; /* 头指针 */ listNode *tail; /* 尾指针 */ void *(*dup)(void *ptr); /* 节点复制函数 */ void (*free)(void *ptr); /* 节点释放函数 */ int (*match)(void ...原创 2018-08-30 22:46:43 · 258 阅读 · 0 评论 -
redis中SDS与C语言中字符串的对比
redis并没有直接重用C语言中的字符串,而是自己定义了一个SDS(SDS结构在另一篇文章中)。在存储时,SDS中的buf数组沿用了C语言以空字符串结尾的惯例,方便重用一部分C语言的函数库。那么为什么redis要自己定义一个SDS结构呢?在C语言中,字符串不会记录自己的长度,如果要获取一个字符串的长度,需要遍历整个字符串,并且计数,直到遇见空字符‘\0’为止,此时时间复杂度为O(n)。而S...原创 2018-08-30 22:29:46 · 718 阅读 · 1 评论 -
redis——客户端
来看看客户端的数据结构:typedef struct client { uint64_t id; /* 客户端id */ int fd; /* socket。fd=-1时表示伪客户端 */ redisDb *db; /* 当前的数据库 */ robj *name; ...原创 2018-09-07 14:32:39 · 318 阅读 · 0 评论