
redis设计与实现
Fly edge
这个作者很懒,什么都没留下…
展开
-
《Redis设计与实现》_第四章_重点回顾
重点回顾1.字典被广泛用于实现Redis的各种功能,其中包括数据库和哈希键。2.Redis中的字典使用哈希表作为底层实现,每个字典带有两个哈希表,另一个仅在rehash时使用。3.当字典被用作数据库的底层实现,或者哈希键的底层实现时,Redis使用Murmur Hash2算法来计算键的哈希值。4.在对哈希表进行扩展或者收缩时,程序将现有哈希表包含的所有键值对rehash到新哈希表里,并且这个rehash不是一次性完成的,而是渐进式地完成的。...原创 2020-11-04 22:32:19 · 169 阅读 · 0 评论 -
《Redis设计与实现》_第四章_渐进式rehash
渐进式rehash前面文章讲到,扩展或收缩哈希表需要将ht[0]里面的所有键值对rehash到ht[1]里面,但是,这个rehash动作并不是一次性、集中式完成的,而是分多次渐进式完成的。为什么要分多次渐进式完成?这就和哈希表里面保存的键值对的数量有关了,如果ht[0]里面只保存了4个键值对,那么,服务器可以瞬间将这些键值对rehash到ht[1]中;但是如果ht[0]中保存了四百万、四千万甚至四亿个键值对,一次性将这些键值对全部rehash到ht[1]中,很可能会导致服务器停止服务。因此为了避免r原创 2020-11-03 23:25:06 · 233 阅读 · 0 评论 -
《Redis设计与实现》_第四章_rehash
rehash哈希表保存的键值对会逐渐增多或减少,我们需要让哈希表的负载因子(load factor)维持在一个合理的范围之内,当哈希表保存的键值对数量太多或太少时,程序需要对哈希表的大小进行相应的扩展或收缩。扩展和收缩通过rehash(重新散列)操作来完成,Redis对字典的哈希表执行rehash步骤:1.为字典的ht[1]哈希表分配空间,这个哈希表的空间大小取决于要执行的操作,以及ht[0]当前包含的键值对数量(即ht[0].used的值)拓展:ht[1]大小为第一个大于等于ht[0].used原创 2020-10-30 23:01:02 · 342 阅读 · 0 评论 -
《Redis设计与实现》_第四章_解决键冲突
解决键冲突冲突原因:两个或以上数量的键被分配到哈希表数组的同一个索引上。解决办法:通过哈希表节点中的next指针使被分配到同一个索引上的节点连接起来。示例:现在在这个哈希表数组的索引2位置上添加一个键值对k2和v2。可以看到新添加的键值对k2和v2添加到了键值对k1和v1前边,这样做是为了使查找最后一个添加的节点的复杂度为O(1),以便下次添加新的键值对。...原创 2020-10-29 23:40:08 · 208 阅读 · 0 评论 -
《Redis设计与实现》_第四章_哈希算法
哈希算法要想把一个新的键值对添加到字典里,程序首先需要根据键值对的键计算出哈希值和索引值。然后根据索引值将包含新键值对的哈希表节点放到哈希表数组的指定索引上面。Redis计算哈希值和索引值的方法#计算哈希值字典设置的哈希函数——hashFunction(key);,它是dictType结构中保存的函数。所以在计算时,调用dict结构中的type指针指向的hashFunction函数。hash = dict->type->hashFunction(key);#计算索引值使用哈希表原创 2020-10-29 22:59:15 · 685 阅读 · 0 评论 -
《Redis设计与实现》_第四章_字典的实现
Redis的字典用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,每个哈希表节点保存了字典中的一个键值对。顺序:哈希表——哈希表节点——字典的实现。哈希表Redis字典使用的哈希表由dict.h/dictht结构定义:typedef struct dictht{ dictEntry **table;//哈希表数组 unsigned long size;//哈希表大小 unsigned long sizemask;//哈希表大小掩码,用于计算索引值,总是等于size-1 unsign原创 2020-10-28 23:29:37 · 185 阅读 · 0 评论 -
《Redis设计与实现》_第四章_字典简介
字典定义字典,又称为符号表(symbol table)、关联数组(associative array)或映射(map),是用于保存键值对的抽象数据结构。字典中的键值对字典中的每个键都是独有的,程序可以在字典中根据键查找与之关联的值(用键查值),通过键来更新值,通过键删除整个键值对等。Redis中的字典实现字典是一种常用数据结构在高级编程语言中一般会内置,Redis使用的C没有内置这种数据结构,故构建了自己的字典实现。字典在Redis中的应用Redis的数据库是使用字典来作为底层实现的,对数据库原创 2020-10-28 22:25:17 · 154 阅读 · 0 评论 -
《Redis设计与实现》_第三章_重点回顾
重点回顾1.链表被广泛应用于实现Redis的各种功能,如列表键、发布与订阅、慢查询、监视器等。(了解链表的用途)2.每个链表节点由一个listNode结构来表示,每个节点都有一个指向前置节点和后置节点的指针,是双端链表。3.每个链表用一个list结构来表示,这个结构有头指针,尾指针,长度计数器等。4.Redis是无环链表,其链表的头指针和尾指针都指向NULL。5.通过为链表设置不同的类型特定函数,Redis的链表可以用于保存各种不同类型的值。第5点实在是没有理解为什么通过设置不同类型的特定函数,原创 2020-10-27 23:29:29 · 149 阅读 · 0 评论 -
《Redis设计与实现》_第三章_遗留问题dup、free、match。
list结构中三个函数的含义在list结构中有三个函数,在阅读时我并没有理解。typedef strcut list{ listNode *head; listNode *tail; unsigned long len; void *(*dup)(void *ptr); void (*free)(void *ptr); int (*match)(void *ptr,void *key);}list;void *(*dup)(void *ptr);这是一个返回值为void ,参数为原创 2020-10-27 23:15:49 · 1116 阅读 · 1 评论 -
《Redis设计与实现》_第三章_链表在Redis中的应用
链表优点1.链表提供高效的节点重排能力2.顺序访问节点方式3.通过增删节点来调整链表长度Redis实现链表Redis构建了自己的链表实现。在Redis中的应用示例:列表键的底层实现之一就是链表。列表键包含数量较多元素时,或者包含的元素都是比较长的字符串时,Redis会用链表来作为列表键的底层实现。如integers列表键包含了1-1024共1024个整数。...原创 2020-10-27 22:31:49 · 198 阅读 · 0 评论 -
《Redis设计与实现》_第二章_回顾与总结
总结SDS API重点*Redis只会用C字符串作为字面量,大多数清空下Redis用SDS(简单动态字符串)作为字符串表示。SDS优点1.常数复杂度获取字符串长度O(1)。2.杜绝缓冲区溢出。3.减少修改字符串长度所需的内存重分配次数。4.二进制安全。5.兼容部分C字符串函数。...原创 2020-10-26 22:43:05 · 164 阅读 · 0 评论 -
《Redis设计与实现》_第二章_二进制安全及兼容
二进制安全C字符串必须符合某种编码(如ASCII),且出末尾外不能包含空字符(’\0’)。由于这些限制,C字符串只能保存文本数据,不能保存二进制数据(二进制数据中不能包含’\0’对应的二进制数据,那么保存时就有可能会出错)。所以这不是二进制安全的。示例:str=“0123456789\00123456789”C字符串会认为str的长度为10,因为\0在C字符串中具有特殊意义,在识别到‘\0’后就会结束。而在Redis中,str的长度为21。因为SDS中的API都是二进制安全的,所有SDS API都原创 2020-10-26 22:33:06 · 168 阅读 · 0 评论 -
《redis设计与实现》_第二章_内存重分配
遗留问题上一小节说到,sdscat函数不仅对SDS进行了拼接而且还为SDS分配了13字节的未使用空间,而拼接后的字符串恰好为13字节。这里涉及到了修改字符串的内存重分配的问题。修改字符串的内存重分配次数前提:C字符串长度为n则需要n+1个字符长的数组。因为此前提,在每次修改C字符串时就需要对这个数组进行一次内存重分配操作。为什么要进行内存重分配?1.如在拼接字符串时,如果数组空间不足,则会导致缓冲区溢出,在执行拼接之前,先进行内存重分配,则可以避免此问题。2.如在截断字符串时,如果直接截断,则原创 2020-10-25 23:50:11 · 220 阅读 · 0 评论 -
《redis设计与实现》_第二章_两种字符串C和SDS、区别、获取字符串长度及缓冲区溢出
《redis设计与实现》-- 第二章知识内容redis中涉及到的两种字符串c语言传统字符串即以空格结尾的字符数组,简称c字符串。SDS(simple dynamic string)——简单动态字符串SDS是redis的默认字符串表示。redis也会用到c字符串,但是只会作为字符串字面量,用在一些不用修改的字符串上面。eg:redisLog(REDIS_WARING,"Redis is now ready to exit, bye bye ...");这里,“ …”中的内容即是字符串字面量原创 2020-10-25 12:16:00 · 339 阅读 · 0 评论