Redis
yanchong
love coding, crazy about opensource
展开
-
Redis源码学习之【前言】
前言之前言本来上年的时候要参与到一个关于Redis中的项目中的,但是由于临时的决定参与到了其他的项目。心中一直对Redis可以说是念念不忘,印象最深的是当初一开始听到Redis的时候,说它是数据库中的AK-47。而作者SalvatoreSanfilippo在实现Redis的时候完全按照标准C进行编写,一切需要的数据结构和算法都是自己实现。编码风格是将编出来的代码像诗歌一样优美。Redi原创 2013-03-16 10:03:07 · 1689 阅读 · 0 评论 -
Redis源码学习之【命令协议格式】
介绍本来这篇要介绍Redis的命令解析的,但是要想对Redis的命令解析有更直观的了解,必须先了解Redis的命令协议格式。源码暂无(或者是是在network.c中吧)分析Requests* CR LF$ CR LF CR LF...$ CR LF CR LFRedis最新支持的二进制安全的请求通用格式如上所示。具体的实例有:*3$3原创 2013-03-18 14:09:17 · 4290 阅读 · 0 评论 -
Redis源码学习之【网络通信框架】
介绍前面两篇文章主要介绍了Redis对epoll和socket 的封装,这篇就开始详细介绍Redis网络通信的具体实现。简单说来Redis的网络通信主要实现了服务器监听客户端连接并处理的主要流程和实现。源码networking.c分析网络通信流程说明Redis网络通信主要原理和一般的异步网络编程框架类似,都是使用服务器端的socket进行监听到来的连接然原创 2013-03-18 10:29:34 · 3830 阅读 · 0 评论 -
Redis源码学习之【Tcp Socket封装】
介绍Redis对linux socket的封装,虽然在该封装中也含有对unix socket的封装,但是普遍来说使用的tcp socket。和上一篇的epoll的封装类似,都是通过调用底层的socket的函数完成一些列的方便的函数调用封装。源码anet.h anet.c分析主要包含以下几个封装函数(这里仅介绍关于Tcp socket的封装函数)anetTcpconnect:原创 2013-03-18 08:48:36 · 4707 阅读 · 0 评论 -
Redis源码学习之【epoll封装】
介绍在上一篇博文中说到了在Redis 的事件处理中使用到了底层的linux epoll,根据Redis的实现可以使用其他的多路通信层,但是在一般的linux服务器中使用的最多的还是epoll所以这里主要介绍一下epoll。Redis并没有直接的使用linux的epoll而是对其进行了一个简单的封装。源码ae_epoll.c分析在原有的linux epoll的基础上进行封装,主要原创 2013-03-17 15:20:51 · 3150 阅读 · 0 评论 -
Redis源码学习之【事件机制】
介绍Redis实现了自己的一套和libevent类似的事件驱动机制,主要用于处理时间事件和文件事件。文件事件底层主要是指网络IO事件的处理,底层使用的可能是select,epoll,或者是kqueue。Redis使用自己实现的AE而不是像memcache使用的libevent使得其性能更好,因为libevent为了其通用性增加了很多扩展功能显然会降低使用它的性能。源码ae.h ae.c原创 2013-03-17 14:00:13 · 5173 阅读 · 0 评论 -
Redis源码学习之【链表】
介绍Redis自己实现了一个含有迭代器的双向链表。基本功能就是通用的双向链表,源码实现还是值得阅读以下的。源文件adlist.h adlist.c分析这里主要介绍其主要的数据结构其他的链表相关的操作有兴趣的话可以自己去看源码,其中的细节tricky还是挺多的。/* Node, List, and Iterator are the only data structures原创 2013-03-16 10:11:10 · 1179 阅读 · 0 评论 -
Redis源码学习之【哈希字典】
介绍Redis的哈希字典通过key值来找对应的value。需要注意的是Redis的字典是如何进行rehash的。源码dict.h dict.c数据结构如上图所示,哈希字典用dict结构体表示,其中含有两个哈希表,主要用于进行rehash操作。同时哈希表使用量表的方式解决冲突。具体的数据结构如下:/* * 哈希表节点 */typedef struct dic原创 2013-03-16 16:34:39 · 2793 阅读 · 0 评论 -
Redis源码学习之【内存分配】
介绍Redis现在的版本可以支持使用tcmalloc或者是jemalloc或是apple的malloc,或者是Redis自己的zmalloc。zmalloc对内存的分配管理是线程安全的,而且分配的内存必须要求是以sizeof(long)对其的。源码zmalloc.h zmalloc.c分析宏变量说明:PREFIX_SIZE:在实际分配的内存之前用于记录分配的内存的大原创 2013-03-16 15:25:42 · 1566 阅读 · 0 评论 -
Redis源码学习之【动态字符串】
介绍由于在标准C中没有字符串这一类型,因而Redis实现了一个自己的字符串sds。源文件sds.h sds.c分析数据结构// sds 类型typedef char *sds;// sdshdr 结构struct sdshdr { // buf 已占用长度 int len; // buf 剩余可用长度 int free;原创 2013-03-16 14:39:29 · 1191 阅读 · 0 评论 -
Redis源码学习之【暂停说明】
由于要去实习,暂时中断Redis源码学习系列博客的撰写工作,后续会在尽快抽时间完成整个系列文章的撰写。原创 2013-03-20 12:21:19 · 1226 阅读 · 0 评论