
Redis源码剖析
文章平均质量分 74
Coding_Reading
待我编码有成 娶你为妻可好
展开
-
Redis源码剖析——数据库
数据库的实现服务器状态rediServer结构体如下:struct redisServer { // 配置文件的绝对路径 char *configfile; // serverCron() 每秒调用的次数 int hz; // 数据库 redisDb *db; // 命令表(受到 renam...原创 2018-05-21 15:06:06 · 695 阅读 · 0 评论 -
Redis源码剖析——有序集合对象
有序集合对象有序集合的对象的编码可以为ziplist或者skiplistziplist实现有序集合当满足下面两个条件时,有序集合的底层数据结构为skiplist 1. 元素数量小于128个 2. 所有元素成员的长度都小于64字节...原创 2018-05-14 19:35:57 · 727 阅读 · 0 评论 -
Redis源码剖析——ziplist的实现
有序集合对象ziplist为Redis中的压缩列表,是列表键和哈希键的底层实现之一,用于存储长度短的字符串和小整数。ziplist采用一段连续的内存来存储节点ziplist的表示因为ziplist的数据结构的长度是变化的所有没有特定的结构体,ziplist在内存中的布局如下 entry也是不定长的,没有特定的结构体,entry在内存中的布局如下 previous_ent...原创 2018-05-14 16:18:12 · 1044 阅读 · 0 评论 -
Redis源码剖析——skiplist的实现
跳跃表skiplist跳跃表是一种有序的数据结构,它通过用空间换时间,在每个节点中维持多个指向其他节点的指针,从而达到快速访问的目的。跳跃表插入、删除的平均复杂度为O(logN),最坏为O(N),可以和红黑树相媲美,但是在实现起来,比红黑树简单很多。Redis使用跳跃表来实现有序集合对象基本结构// 跳跃表节点typedef struct zskiplistNode { ...原创 2018-05-12 16:58:11 · 567 阅读 · 0 评论 -
Redis源码剖析——集合对象
集合对象集合对象的编码可以为intset 或则 hashtableintset编码的的集合对象当满足下面两个条件时,集合对象将使用intset编码 1. 集合对象的所有元素都是整数值 2. 集合对象的元素个数小于等于512当执行命令 SADD numbers 1 2 3 4 时 键numbers的值对象将使用Intset编码,内存布局如下图 hashtable编码的集合...原创 2018-04-30 15:04:53 · 274 阅读 · 0 评论 -
Redis源码剖析——哈希对象
哈希对象哈希对象的编码可以为ziplist或者hashtableziplist编码的哈希对象满足下面两个条件时,哈希对象使用ziplist编码 1. 所有键值对的键和值的字符串长度都小于等于64字节 2. 键值对数量小于512连续执行下面三个命令后 HSET profile name “Jack” HSET profile age 20 HSET profile ca...原创 2018-04-30 14:36:40 · 254 阅读 · 0 评论 -
Redis源码剖析——列表对象
列表对象列表对象的编码为ziplist或linkedlistziplist编码的列表对象当满足下面两个条件时列表对象用ziplist编码 1. 列表对象保存的所有字符串元素的长度都小于等于64字节 2. 元素数量小于等于512 当执行RPUSH numbers 1 “three” 5 命令后numbers键的值对象的布局如下 linkedlist编码的列表对象当不符合z...原创 2018-04-30 13:33:20 · 228 阅读 · 0 评论 -
Redis源码剖析——字符串对象
字符串对象字符串对象有三种编码方式,int、raw、embstrint编码的字符串对象对于int编码的字符串对象,为了节省内存,int将会占用ptr的空间,布局如图 raw编码的字符串对象当字符串值的长度大于39字节时,字符串对象将用SDS来保存字符串值 如使用 SET story “Long,long,long ago there lived a king …”命令后...原创 2018-04-30 13:12:46 · 291 阅读 · 0 评论 -
Redis源码剖析——Redis五种基本对象
Redis五大对象Redis使用对象来表示数据库中的键和值。 Redis有五种基本对象,分别为字符串对象、列表对象、哈希对象、集合、有序集合对象的表示Redis中的对象由RedisObject表示typedef struct redisObject { // 类型 unsigned type:4; // 编码 unsigned encodi...原创 2018-04-30 12:35:51 · 264 阅读 · 0 评论 -
Redis源码剖析——intset的实现
intsetintset为Redis中的整数集合, 当一个集合只包含整数值元素, 并且这个集合的元素数量不多时, Redis 就会使用整数集合作为集合键的底层实现。intset采用一段连续内存空间实现,默认采用16bit的整数,当新加入的整数16bit放不下时会对整个空间进行扩容,因为每加入/删除一个元素就要进行扩容/缩容,频繁的进行内存释放、拷贝,很明显不适用于频繁的增删元素大小端存...原创 2018-04-12 13:18:33 · 586 阅读 · 0 评论 -
Redis源码剖析——dict的实现
dict字典为Redis的基本数据结构之一有着非常广泛的用途,由哈希表实现。Redis的数据库由字典实现基本结构#define DICT_OK 0#define DICT_ERR 1// 指示字典是否启用 rehash 的标识static int dict_can_resize = 1;// 强制 rehash 的比率static unsigned int dict...原创 2018-04-06 14:24:22 · 516 阅读 · 0 评论 -
Redis源码剖析——adlist的实现
adlistadlist为Redis基本数据结构之一,为双向链表,记录了链表长度,adlist的迭代器记录了迭代节点和方向,个人觉得实现优于STL的list几个重要结构adlist实现比较精简,基本上写过链表相关的代码就能很快写出所有实现函数/* * 双端链表节点 */typedef struct listNode { // 前置节点 struct listN...原创 2018-03-31 14:24:14 · 738 阅读 · 0 评论 -
Redis源码剖析——SDS的实现
SDS的实现SDS即简单动态字符串,为Redis的几大基本数据结构之一,有广泛的用途基本函数总览 函数 功能 复杂度 sdsnewlen 由给定字符串创建SDS O(N) sdslen 返回字符串长度 O(1) sdsdup 复制一个SDS O(N) sdsfree 释放字符串空间 O(1)...原创 2018-03-30 17:15:33 · 475 阅读 · 0 评论 -
Redis源码剖析——内存管理
开始阅读Redis3.0版本源码,并以此为剖析对象,因为此版本有注释,并且网上有文章,便于初学者学习参考,了解以前的版本才能更好地学习最新的4.x版本内存管理Redis的内存管理仅仅对malloc,,free做了一层封装,并未实现内存池,远没有STL的内存分配器巧妙内存管理函数内存管理函数如下:void *zmalloc(size_t size); //封装ma...原创 2018-03-28 17:13:47 · 298 阅读 · 0 评论