Redis 3.2.8 源码剖析注释
文章平均质量分 94
本专栏主要剖析 Redis 3.2.8 版本的源码,包含部分3.0.7版本的源码,并且结合图片,更具体的理解Redis的底层实现。
men_wen
这个作者很懒,什么都没留下…
展开
-
Redis 3.2.8源码剖析和注释系列文章地址归总
Redis 3.2.8源码剖析和注释redis 3.2.8 源码详细注释地址 文章地址 文件名称 Redis源码剖析和注释(一)— 链表结构 adlist.c 和 adlist.h Redis源码剖析和注释(二)— 简单动态字符串 sds.c 和 sds.h Redis源码剖析和注释(三)— Redis 字典结构 dict.c 和 dict.h Redis源码剖析原创 2017-07-21 17:15:59 · 16390 阅读 · 8 评论 -
Redis源码剖析和注释(二十八)--- Redis 事务实现和乐观锁
Redis 事务实现和乐观锁1. 事务的介绍Redis事务(transaction)提供了以下五个命令,用于用户操作事务功能,其分别是: 命令 功能 MULTI 标记一个事务块的开始 DISCARD 放弃执行事务 EXEC 执行事务中的所有命令 WATCH 监视一个或多个key,如果至少有一个key在EXEC之前被修改,则放弃执行事务 UNWATCH 取原创 2017-06-16 21:37:54 · 2814 阅读 · 1 评论 -
Redis源码剖析和注释(二十七)--- Redis 故障转移流程和原理剖析
Redis 故障转移流程和原理1. 故障转移介绍Redis集群自身实现了高可用。高可用首先要解决集群部分失败的场景:当集群内少量节点出现故障时通过自动故障转移保证集群可以正常对外提供服务。接下来就介绍故障转移的细节,分析故障检测和故障转移。故障检测故障转移Redis Cluster文件详细注释2. 故障检测2.1 主观故障的检测当一个节点出现问题,需要使用一种健壮的方法保证识别出节点是否发生了原创 2017-06-12 22:08:15 · 3613 阅读 · 0 评论 -
Redis源码剖析和注释(二十六)--- Redis 集群伸缩原理源码剖析
Redis Cluster 集群伸缩原理源码剖析1. Redis 集群伸缩教程Redis提供了灵活的节点扩容和收缩方案。在不影响集群对外服务的情况下,可以为集群添加节点进行扩容也可以对下线节点进行缩容。如何进行Redis Cluster的伸缩,请参考 Redis Cluster 集群扩容与收缩 本篇教程。本文详细分别使用手动命令和redis-trib.rb工具来执行Redis集群的扩容和收缩操作。本原创 2017-06-09 16:08:38 · 3805 阅读 · 0 评论 -
Redis源码剖析和注释(二十五)--- Redis Cluster 的通信流程深入剖析(载入配置文件、节点握手、分配槽)
Redis Cluster 通信流程深入剖析1. Redis Cluster 介绍和搭建请查看这篇博客:Redis Cluster 介绍与搭建这篇博客会介绍Redis Cluster的数据分区理论和一个三主三从集群的搭建。Redis Cluster文件详细注释 本文会详细剖析搭建 Redis Cluster 的通信流程Redis Cluster 通信流程深入剖析Redis Cluster 介绍和原创 2017-06-05 21:30:30 · 8103 阅读 · 1 评论 -
Redis源码剖析和注释(二十四)--- Redis Sentinel实现(哨兵操作的深入剖析)
Redis Sentinel实现(下)本文是Redis Sentinel实现(上)篇文章的下半部分剖析。主要剖析以下内容:4. 哨兵的使命Redis Sentinel实现下哨兵的使命1 周期性的操作11 建立连接12 发送监控命令13 判断节点的主观下线状态14 判断主节点的客观下线状态15 对主节点执行故障转移151 故障转移开始152 选择一个要晋升的从节点153 使从节点变原创 2017-05-29 23:47:49 · 4547 阅读 · 0 评论 -
Redis源码剖析和注释(二十三)--- Redis Sentinel实现(哨兵的执行过程和执行的内容)
Redis Sentinel实现(上)1. Redis Sentinel 介绍和部署请参考Redis Sentinel 介绍与部署sentinel.c文件详细注释:Redis Sentinel详细注释本文会分为两篇分别接受Redis Sentinel的实现,本篇主要将Redis哨兵的执行过程和执行的内容。Redis Sentinel实现上Redis Sentinel 介绍和部署Redis Sen原创 2017-05-29 23:37:56 · 5726 阅读 · 0 评论 -
Redis源码剖析和注释(二十二)--- Redis 复制(replicate)源码详细解析
Redis 复制(replicate)实现1. 复制的介绍Redis为了解决单点数据库问题,会把数据复制多个副本部署到其他节点上,通过复制,实现Redis的高可用性,实现对数据的冗余备份,保证数据和服务的高度可靠性。关于复制的详细配置和如何建立复制,请参考:Redis 复制功能详解 。Redis 复制replicate实现复制的介绍复制的实现1 主从关系的建立2 主从网络连接建立3 发送P原创 2017-05-22 17:43:22 · 6560 阅读 · 6 评论 -
Redis源码剖析和注释(二十一)--- 单机服务器实现
Redis 单机服务器实现1. Redis 服务器Redis服务器负责与客户端建立网络连接,处理发送的命令请求,在数据库中保存客户端执行命令所产生的数据,并且通过一系列资源管理措施来维持服务器自身的正常运转。本次主要剖析server.c文件,本文主要介绍Redis服务器的一下几个实现:命令的执行过程Redis服务器的周期性任务maxmemory的策略Redis服务器的main函数其他的注释原创 2017-05-18 00:15:40 · 4040 阅读 · 0 评论 -
Redis源码剖析和注释(二十)--- 网络连接库剖析(client的创建/释放、命令接收/回复、Redis通信协议分析等)
Redis 网络连接库剖析1. Redis网络连接库介绍Redis网络连接库对应的文件是networking.c。这个文件主要负责客户端的创建与释放命令接收与命令回复Redis通信协议分析CLIENT 命令的实现我们接下来就这几块内容分别列出源码,进行剖析。2. 客户端的创建与释放redis 网络链接库的源码详细注释2.1客户端的创建Redis 服务器是一个同时与多个客户端建立连接的程序。原创 2017-05-14 23:25:18 · 6529 阅读 · 2 评论 -
Redis源码剖析和注释(十九)--- Redis 事件处理实现
Redis 事件处理实现1. Redis事件介绍Redis服务器是一个事件驱动程序。下面先来简单介绍什么是事件驱动。所谓事件驱动,就是当你输入一条命令并且按下回车,然后消息被组装成Redis协议的格式发送给Redis服务器,这就会产生一个事件,Redis服务器会接收该命令,处理该命令和发送回复,而当你没有与服务器进行交互时,那么服务器就会处于阻塞等待状态,会让出CPU从而进入睡眠状态,当事件触发时,原创 2017-05-10 09:47:22 · 21269 阅读 · 0 评论 -
Redis源码剖析和注释(十八)--- Redis AOF持久化机制
Redis AOF持久化机制1. AOF持久化介绍Redis中支持RDB和AOF这两种持久化机制,目的都是避免因进程退出,造成的数据丢失问题。RDB持久化:把当前进程数据生成时间点快照(point-in-time snapshot)保存到硬盘的过程,避免数据意外丢失。AOF持久化:以独立日志的方式记录每次写命令,重启时在重新执行AOF文件中的命令达到恢复数据的目的。 Redis RDB持久化机原创 2017-05-07 23:08:59 · 6231 阅读 · 0 评论 -
Redis源码剖析和注释(十七)--- RDB持久化机制
Redis RDB持久化机制1. RDB的介绍因为Redis是内存数据库,因此将数据存储在内存中,如果一旦服务器进程退出,服务器中的数据库状态就会消失不见,为了解决这个问题,Redis提供了两种持久化的机制:RDB和AOF。本篇主要剖析RDB持久化的过程。RDB持久化是把当前进程数据生成时间点快照(point-in-time snapshot)保存到硬盘的过程,避免数据意外丢失。1.1 RDB触发机原创 2017-05-06 07:28:04 · 7059 阅读 · 3 评论 -
Redis源码剖析和注释(一)---链表结构
Redis源码剖析—链表结构1. redis中的链表在redis中链表的应用非常广泛,例如列表键的底层实现之一就是链表。而且,在redis中的链表结构被实现成为双向链表,因此,在头部和尾部进行的操作就会非常快。通过列表键的命令感受一下双向链表:列表键命令详解127.0.0.1:6379> LPUSH list a b c //依次在链表头部插入a、b、c(integer) 3127.0.0原创 2017-04-04 22:08:19 · 11552 阅读 · 4 评论 -
Redis源码剖析和注释(二)--- 简单动态字符串
Redis 简单动态字符串1.介绍Redis兼容传统的C语言字符串类型,但没有直接使用C语言的传统的字符串(以’\0’结尾的字符数组)表示,而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的对象。简单动态字符串在Redis数据库中应用很广泛,例如:键值对在底层就是由SDS实现的。在redis种,有一种数据类型叫string类型,而string类型简单的说就是原创 2017-04-06 16:39:29 · 6493 阅读 · 3 评论 -
Redis源码剖析和注释(三)--- Redis 字典结构
Redis 字典结构1. 介绍字典又称为符号表(symbol table)、关联数组(associative array)或映射(map),是一种用于保存键值对(key-value pair)的抽象数据结构。例如:redis中的所有key到value的映射,就是通过字典结构维护,还有hash类型的键值。通过redis中的命令感受一下哈希键。127.0.0.1:6379> HSET user name原创 2017-04-08 21:18:06 · 5654 阅读 · 2 评论 -
Redis源码剖析和注释(四)--- 跳跃表(skiplist)
Redis 跳跃表(skiplist)1. 跳跃表(skiplist)介绍定义:跳跃表是一个有序链表,其中每个节点包含不定数量的链接,节点中的第i个链接构成的单向链表跳过含有少于i个链接的节点。跳跃表支持平均O(logN),最坏O(N)复杂度的节点查找,大部分情况下,跳跃表的效率可以和平衡树相媲美。跳跃表在redis中当数据较多时作为有序集合键的实现方式之一。接下来,还是举个有序集合键的例子原创 2017-04-10 23:27:20 · 9506 阅读 · 8 评论 -
Redis源码剖析和注释(五)--- 整数集合(intset)
Redis 整数集合(intset)1. 介绍整数集合(intset)是集合键底层实现之一。集合键另一实现是值为空的散列表(hash table),虽然使用散列表对集合的加入删除元素,判断元素是否存在等等操作时间复杂度为O(1),但是当存储的元素是整型且元素数目较少时,如果使用散列表存储,就会比较浪费内存,因此整数集合(intset)类型因为节约内存就存在。散列表的实现在redis集合键命令:red原创 2017-04-12 17:58:04 · 3351 阅读 · 0 评论 -
Redis源码剖析和注释(六)--- 压缩列表(ziplist)
Redis 压缩列表(ziplist)1. 介绍压缩列表(ziplist)是哈希键的底层实现之一。它是经过特殊编码的双向链表,和整数集合(intset)一样,是为了提高内存的存储效率而设计的。当保存的对象是小整数值,或者是长度较短的字符串,那么redis就会使用压缩列表来作为哈希键的实现。127.0.0.1:6379> HMSET hash name mike age 28 sex maleOK原创 2017-04-14 23:08:21 · 7923 阅读 · 3 评论 -
Redis源码剖析和注释(七)--- 快速列表(quicklist)
Redis 快速列表(quicklist)1. 介绍quicklist结构是在redis 3.2版本中新加的数据结构,用在列表的底层实现。通过列表键查看一下:redis 列表键命令详解127.0.0.1:6379> RPUSH list 1 2 5 1000"redis" "quicklist"(integer) 127.0.0.1:6379> OBJECT ENCODING list"qui原创 2017-04-18 16:02:04 · 12084 阅读 · 4 评论 -
Redis源码剖析和注释(八)--- 对象系统(redisObject)
Redis 对象系统1. 介绍redis中基于双端链表、简单动态字符串(sds)、字典、跳跃表、整数集合、压缩列表、快速列表等等数据结构实现了一个对象系统,并且实现了5种不同的对象,每种对象都使用了至少一种前面的数据结构,优化对象在不同场合下的使用效率。双端链表源码剖析和注释简单动态字符串(SDS)源码剖析和注释字典结构源码剖析和注释跳跃表源码剖析和注释整数集合源码剖析和注释压缩列表源码原创 2017-04-20 12:58:40 · 7060 阅读 · 1 评论 -
Redis源码剖析和注释(九)--- 字符串命令的实现(t_string)
Redis 字符串键的实现(t_string)1. 字符串命令介绍redis中的所有字符串命令如下:字符串类型命令详解 序号 命令及描述 1 SET key value:设置指定 key 的值 2 GET key: 获取指定 key 的值。 3 GETRANGE key start end: 返回 key 中字符串值的子字符 4 GETSET key value原创 2017-04-21 16:02:57 · 3720 阅读 · 0 评论 -
Redis源码剖析和注释(十)--- 列表键命令实现(t_list)
Redis 列表类型命令实现(t_list)1.列表类型命令介绍redis中所有列表类型的命令如下:列表类型命令详解 序号 命令及描述 1 BLPOP key1 [key2 ] timeout:移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 2 BRPOP key1 [key2 ] timeout:移出并获取列表的最后一个元素, 如果原创 2017-04-23 22:05:20 · 3254 阅读 · 0 评论 -
Redis源码剖析和注释(十一)--- 哈希键命令的实现(t_hash)
Redis 哈希键命令实现(t_hash)1. 哈希命令介绍Redis 所有哈希命令如下表所示:Redis 哈希命令详解 序号 命令及描述 1 HDEL key field2 [field2]:删除一个或多个哈希表字段 2 HEXISTS key field:查看哈希表 key 中,指定的字段是否存在。 3 HGET key field:获取存储在哈希表中指定字段的值。原创 2017-04-27 13:31:52 · 3692 阅读 · 0 评论 -
Redis源码剖析和注释(十二)--- 集合类型键实现(t_set)
Redis 集合类型键实现(t_set)1. 集合命令介绍redis中所有的集合命令如下:Redis集合命令详解 序号 命令 说明 1 SADD key member1 [member2] 将一个或多个成员添加到集合 2 SCARD key 获取集合中的成员数 3 SDIFF key1 [key2] 减去多个集合 4 SDIFFSTORE des原创 2017-04-28 21:41:47 · 3551 阅读 · 0 评论 -
Redis源码剖析和注释(十三)--- 有序集合类型键实现(t_zset)
有序集合类型键实现1. 有序集合命令Redis有序集合命令如下表所示:Redis 有序集合命令详解 序号 命令及描述 1 ZADD key score1 member1 [score2 member2]: 向有序集合添加一个或多个成员,或者更新已存在成员的分数 2 ZCARD key: 获取有序集合的成员数 3 ZCOUNT key min max:计算在有序集合中指定原创 2017-05-01 10:08:49 · 3213 阅读 · 1 评论 -
Redis源码剖析和注释(十四)---- Redis 数据库及相关命令实现(db)
Redis 数据库及相关命令实现1. 数据库管理命令数据库管理的命令如下表格所示:redis keys命令详解 命令 描述 FLUSHDB 清空当前数据库的所有key FLUSHALL 清空整个Redis服务器的所有key DBSIZE 返回当前数据库的key的个数 DEL key [key …] 删除一个或多个键 EXISTS key 检查给定key是原创 2017-05-02 18:16:08 · 3652 阅读 · 0 评论 -
Redis源码剖析和注释(十五)---- 通知功能实现与实战 (notify)
Redis 通知功能实现与实战1. 通知功能介绍客户端可以通过 订阅与发布功能(pub/sub)功能,来接收那些以某种方式改动了Redis数据集的事件。目前Redis的订阅与发布功能采用的是发送即忘(fire and forget)的策略,当订阅事件的客户端断线时,它会丢失所有在断线期间分发给它的事件。2. 通知的类型通知功能的类型分别为:键空间通知(key-space notification)原创 2017-05-02 21:41:14 · 2827 阅读 · 2 评论 -
Redis源码剖析和注释(十六)---- Redis输入输出的抽象(rio)
Redis 输入输出的抽象(rio)1. 概述rio是Redis对IO操作的一个抽象,可以面向不同的输入输出设备,例如一个缓冲区IO、文件IO和socket IO。一个rio对象提供一下四个方法:read:读操作write:写操作tell:读写的偏移量flush:冲洗缓冲区操作使用C语言,实现面向对象的思想。2. rio对象的抽象rio结构体如下:rio.c 和 rio.h 文件详细注释s原创 2017-05-03 17:52:37 · 2583 阅读 · 0 评论