
redis源码解析
Ch_ty
这个作者很懒,什么都没留下…
展开
-
redis源码解析(一)动态字符串sds结构体
1. 简介 Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。 由于该库代码优美,实现巧妙,值得学习,因...原创 2018-09-26 23:04:35 · 730 阅读 · 0 评论 -
redis源码解析(十四)快速链表基本功能函数解析
1. 简介 本文分析快速链表创建、删除、合并等基本功能操作。快速链表由一系列的节点构成,而每个节点又可以携带一个压缩链表,因此快速链表的创建、节点上压缩链表的创建删除、节点的删除、合并、查找等功能都较为复杂,需要先考虑最简单的基本功能函数再由此完成复杂功能。2. 源码分析/* 优化等级 * Optimization levels for size-based filling */s...原创 2019-09-07 12:06:14 · 357 阅读 · 0 评论 -
redis源码解析(十四)快速链表结构分析
一. 简介 在redis源码中可以看到当前主要使用的并不是压缩链表而是快速链表,快速链表由节点、快速链表,迭代器组成。为什么这样设计呢?总结起来,大概又是一个空间和时间的折中: 双向链表便于在表的两端进行push和pop操作,但是它的内存开销比较大。首先,它在每个节点上除了要保存数据之外,还要额外保存两个指针;其次,双向链表的各个节点是单独的内存块,地址不连续,节点多了容易产生内存碎...原创 2019-08-24 12:54:52 · 641 阅读 · 0 评论 -
redis中宏定义函数的使用
在阅读redis源码时,发现redis大量使用了以“__”开头的内部函数和以宏定义形式出现的API函数。如下所示:#define quicklistCompress(_ql, _node) \ do { ...原创 2019-08-10 15:44:59 · 580 阅读 · 0 评论 -
redis源码解析(十二)压缩链表ziplist内部功能函数分析
1. 前言 压缩链表内部定义了很多功能函数用于实现数据控制和逻辑的分离,同时简化API代码的流程使其更为一目了然,因此本文主要研究内部功能函数以便于更好的分析API函数。2. 源码分析/* 初始化压缩链表节点zlentry */#define ZIPLIST_ENTRY_ZERO(zle) { \ (zle)->prevrawlensize = (zle)->prev...原创 2019-07-27 16:16:16 · 254 阅读 · 0 评论 -
redis源码解析(十三)压缩链表ziplistAPI函数分析
API的函数实现源码如下:/* 创建新的压缩列表 * Create a new empty ziplist. */unsigned char *ziplistNew(void) { unsigned int bytes = ZIPLIST_HEADER_SIZE + 1; unsigned char *zl = zmalloc(bytes); ZIPLIST_...原创 2019-08-03 12:35:47 · 262 阅读 · 0 评论 -
redis源码解析(十一)hyperloglog算法源码分析
一. 简介 HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的并且很小。详细关于hyperloglog算法实现原理可以参考此文,讲解的很细致。二. 源码分析/* 将稀疏存储改变为密集存储 * Convert the HLL with sparse representation given a...原创 2019-06-29 15:12:29 · 740 阅读 · 0 评论 -
redis源码解析(十一)压缩链表ziplist结构分析
一. 前言 压缩链表ziplist是一个经过特殊编码的双向链表,它的设计目标就是为了提高存储效率。ziplist可以用于存储字符串或整数, 其中整数是按真正的二进制表示进行编码的, 而不是编码成字符串序列。 它能以O(1)的时间复杂度在表的两端提供push和pop操作。本文主要分析压缩链表结构体及相关功能函数的源码部分。二. 结构体分析 压缩链表主要结构为:<zlbytes>...原创 2019-07-13 10:13:32 · 1023 阅读 · 0 评论 -
redis源码解析(十)hyperloglog之稀疏存储和密集存储
1. 前言 本文主要介绍hyperloglog的稀疏存储和密集存储结构及其实现。2. 基本介绍 3. 源码解析 4. 总结原创 2019-06-23 12:39:57 · 1207 阅读 · 0 评论 -
redis源码解析(九)字典结构体函数介绍之四
1. 简介 本文完成字典结构体剩余函数源码解析。2. 源码解析 具体源码解析如下:/* 反转比特位 * Function to reverse bits. Algorithm from: * http://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel */static unsigned long re...原创 2018-11-27 22:10:57 · 257 阅读 · 0 评论 -
redis源码解析(八)字典结构体函数介绍之三
1. 简介 本文继上文的基础上,分析剩余的字典相关函数源码。2. 源码分析/* 查找并删除 * Search and remove an element. This is an helper function for * dictDelete() and dictUnlink(), please check the top comment * of those functions. ...原创 2018-11-25 17:39:31 · 291 阅读 · 0 评论 -
redis源码解析(七)字典结构体函数介绍之二
1. 简介 字典结构是redis中的核心结构之一,本文继前文基础上介绍更多字典结构体的相关函数。2.代码解析 /* N步增量重哈希 * Performs N steps of incremental rehashing. Returns 1 if there are still * keys to move from the old to the new hash table, o...原创 2018-11-23 19:51:26 · 272 阅读 · 0 评论 -
redis源码解析(六)字典结构体基本函数介绍
一. 简介 字典结构是redis中的核心结构之一,本文介绍字典结构的基本函数二. 源码解析 首先是一些有用的宏定义的介绍/*调用析构函数释放VAL*/#define dictFreeVal(d, entry) \ if ((d)-&gt;type-&gt;valDestructor) \ (d)-&gt;type-&gt;valDestructor((d)-&...原创 2018-11-18 22:18:16 · 251 阅读 · 0 评论 -
redis源码解析(五)字典结构体
1. 前言 字典结构是redis中的核心结构之一,主要由dictEntry, dictType, dictht和dict组成,详细源码和介绍如下。2. 源码分析 1. dictEntry dictEntry是典型的哈希表项结构:由键值对组成,并且有链表指针next,用于同键下的遍历搜寻等操作。/*字典(哈希表)的键值对,由key,v,和指针next组成,是拉链式哈希表的实际存储位...原创 2018-10-31 22:20:24 · 300 阅读 · 0 评论 -
redis源码解析(四)双向链表
本文分析redis里的双向链表的基础结构以及基础函数1. 基本结构 redis的双向链表主要实现了以下三个结构体:(1)链表节点,包括两个指针指向前后节点,一个指针指向节点的值(2)迭代器,用于遍历(3)链表结构体,包括头、尾、复制释放遍历函数、链表长度。/* Node, List, and Iterator are the only data structures used c...原创 2018-10-29 22:40:47 · 251 阅读 · 0 评论 -
redis源码解析(二)动态字符串sds基本功能函数
1. 简介 本文继上文基础上,分析动态字符串的功能函数。2. 源码分析原创 2018-09-28 21:49:50 · 484 阅读 · 0 评论 -
redis源码解析(三)动态字符串sds高级功能函数
/* Like sdscatprintf() but gets va_list instead of being variadic. */sds sdscatvprintf(sds s, const char *fmt, va_list ap) { va_list cpy; char staticbuf[1024], *buf = staticbuf, *t; size_...原创 2018-10-14 00:12:14 · 686 阅读 · 0 评论 -
redis源码解析(十五)快速链表API功能函数解析
一. 前言 本文继前文基础上继续分析剩余的快速链表函数源码。二. 源码分析/* Replace quicklist entry at offset 'index' by 'data' with length 'sz'. * * Returns 1 if replace happened. * Returns 0 if replace failed and no changes hap...原创 2019-09-14 11:27:13 · 244 阅读 · 0 评论