Redis源码剖析
Redis源码剖析
harleylau
这个作者很懒,什么都没留下…
展开
-
Redis源码剖析 有序集合对象t_zset实现
有序集合对象其实跟集合对象类似,只不过它多了一个score的参数,集合中的每个元素都有一个分值,在集合中元素是按照score排序的。有序集合的底层编码也是有两种实现,压缩列表REDIS_ENCODING_ZIPLIST以及跳跃表REDIS_ENCODING_SKIPLIST。和集合的一样,有序集合的编码方式是通过检查第一个被加入的元素来决定的。ZSET结构/* RedisObject结构...原创 2019-03-28 16:02:39 · 607 阅读 · 0 评论 -
Redis源码剖析 集合对象t_set实现
从之前的章节“Redis源码剖析–对象Object” 可以知道,redis中的SET(集合)有两种可能的数据存储方式。分别是整数集合REDIS_ENCODING_INTSET和哈希表REDIS_ENCODING_HT。robj *setTypeCreate(sds value) { if (isSdsRepresentableAsLongLong(value,NULL) == C_O...原创 2019-03-27 16:58:54 · 514 阅读 · 0 评论 -
Redis源码剖析-链表list
Redis另一个基础的数据结构是链表,C并没有内置的链表结构,因此Redis自己实现了一个列表。除了链表键之外, 发布与订阅、慢查询、监视器等功能也用到了链表, Redis 服务器本身还使用链表来保存多个客户端的状态信息, 以及使用链表来构建客户端输出缓冲区。原创 2017-09-08 21:17:05 · 207 阅读 · 0 评论 -
Redis源码剖析-dict字典
改换一下策略,不直接介绍源码,打算先整体介绍一下思路,然后再根据源码解释具体的实现。如图所示,一个dict字典中由两个hashtable组成,分别为ht[0]和ht[1],用到的基本上都是ht[0]。原创 2017-09-08 21:18:27 · 231 阅读 · 0 评论 -
Redis源码剖析-dict遍历算法
先贴一下整体的代码原创 2017-09-08 21:19:59 · 296 阅读 · 0 评论 -
Redis源码剖析--跳跃表
跳跃表(skiplist)是一种有序数据结构, 它通过在每个节点中维持多个指向其他节点的指针, 从而达到快速访问节点的目的。跳跃表支持平均 O(\log N) 最坏 O(N) 复杂度的节点查找, 还可以通过顺序性操作来批量处理节点。在大部分情况下, 跳跃表的效率可以和平衡树相媲美, 并且因为跳跃表的实现比平衡树要来得更为简单, 所以有不少程序都使用跳跃表来代替平衡树。原创 2017-09-08 21:21:12 · 210 阅读 · 0 评论 -
Redis源码剖析--整数集合
整数集合(intset)是集合键的底层实现之一: 当一个集合只包含整数值元素, 并且这个集合的元素数量不多时, Redis 就会使用整数集合作为集合键的底层实现。原创 2017-09-08 21:22:26 · 212 阅读 · 0 评论 -
Redis源码剖析--压缩列表
压缩列表(ziplist)是列表键和哈希键的底层实现之一。 Redis的列表键,哈希键,有序集合的底层实现都用到了ziplist。当列表键中包含比较少的元素,并且元素都是数字或者比较小的字符串的时候, redis会用压缩列表来作为列表键的底层实现。当哈希键的键和值都是比较小的整数或者较短的字符的时候,也是用压缩列表来作为底层实现。 因为压缩列表也能够节省内存。原创 2017-09-09 12:21:38 · 226 阅读 · 0 评论 -
Redis源码剖析--对象Object
之前介绍的都是Redis的基础数据结构,比如简单动态字符串(SDS)、双端链表、字典、压缩列表、整数集合, 等等,不过Redis并没有直接用这些结构来实现键值对的数据库,而是对其进行了封装, 所有的键和值都是用对象Object来表示的。原创 2017-09-09 12:26:11 · 399 阅读 · 0 评论 -
Redis源码剖析--字符串t_string实现
介绍完Redis的底层数据结构之后, 介绍我们平时使用Redis的时候可以直接看到五种数据结构:字符串、哈希、链表、集合和有序集合。首先介绍字符串t_string的实现。原创 2018-05-10 09:50:46 · 1305 阅读 · 0 评论 -
Redis源码剖析--列表t_list实现
Redis中的列表对象比较特殊,在版本3.2之前,列表底层的编码是 ziplist 和 linkedlist 实现的, 但是在版本3.2之后,重新引入了一个 quicklist 的数据结构,列表的底层都由quicklist实现。这边是在看源码和实际验证的时候发现的区别,然后上网查证。由于目前使用的redis基本都在3.2了, 而且老版本肯定会被取代, 所以我们只分析3.2版本之后的实现。对于老...原创 2018-05-29 10:17:14 · 1982 阅读 · 0 评论 -
Redis源码剖析--quicklist
quicklist概述上一节中,我们有说到Redis中的列表对象在版本3.2之前,列表底层的编码是 ziplist 和 linkedlist 实现的, 但是在版本3.2之后,重新引入了一个 quicklist 的数据结构,列表的底层都由quicklist实现。在早期的设计中, 当列表对象中元素的长度比较小或者数量比较少的时候,采用ziplist来存储,当列表对象中元素的长度比较大或者数量比...原创 2018-06-01 10:16:47 · 3961 阅读 · 1 评论 -
Redis源码剖析--哈希对象t_hash实现
hash对象概述哈希对象的实现有点类似于版本3.2之前的列表对象实现,它的底层编码也有两种格式:ziplist 和 hashtable。当哈希对象可以同时满足以下两个条件时, 哈希对象使用 ziplist 编码:哈希对象保存的所有键值对的键和值的字符串长度都小于 64 字节; 哈希对象保存的键值对数量小于 512 个; 不能满足这两个条件的哈希对象需要使用 hashtable 编码...原创 2018-06-07 17:30:08 · 1740 阅读 · 0 评论 -
Redis源码剖析--简单动态字符串sds
Redis 没有直接使用 C 语言传统的字符串表示, 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将 SDS 用作 Redis 的默认字符串表示。Redis中所有的键都是用sds格式来保存的, 包括一部分值的保存,也是用的sds格式。原创 2017-09-08 21:15:56 · 259 阅读 · 0 评论