0%

源码位置:ae.c/ae.h/ae_evport.c/ae_epoll.c/ae_kqueue.c/ae_select.c

1. 简介
Redis 是一个事件驱动的内存数据库,服务器需要处理两种类型的事件:

  • 文本(IO)事件AE_FILE_EVENTS
  • 时间事件AE_TIME_EVENTS
阅读全文 »

源码位置:multi.c/redis.h

1. 简介
Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。
总结说:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。

阅读全文 »

源码位置:pubsub.c/redis.h

1. 前言
Redis发布订阅(pub/sub)是一种消息通信模式,由三部分组成:发布者(pub),频道(channel),订阅者(sub)。具体结构如下:

阅读全文 »

源码位置:aof.c/rio.c/rio.h

1. 前言
除了RDB持久化功能以外,Redis还提供了AOF(Append Only File)持久化功能。与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis所执行的写命令来记录数据库状态的。

阅读全文 »

源码位置:rdb.c/rdb.h/rio.c/rio.h

1. 前言
Redis是内存数据库,所有的数据都是存在内存中,这样就会存在一个问题,就是当服务进程退出,所有数据都将会丢失,所以Redis提供了两种数据持久化的机制,分别是RDB(Redis DataBase)和AOF(Append Only File)。这两种机制的区别将在后面介绍AOF持久化中介绍。

RDB其实就是把数据以快照的形式保存在磁盘上。什么是快照呢,你可以理解成把当前时刻的数据拍成一张照片保存下来。
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb

阅读全文 »

源码位置:notify.c/server.h

1. 事件通知概述
对于Redis服务器,它可以通过订阅发布功能来发送服务器中的键空间事件。所谓的键空间事件,就是数据库中键的增加、修改和删除等操作,用于告知收听该类事件的客户端当前数据库中执行了哪些操作。客户端可以通过 订阅与发布功能(pub/sub)功能,来接收那些以某种方式改动了Redis数据集的事件。
目前Redis的订阅与发布功能采用的是发送即忘(fire and forget)的策略,当订阅事件的客户端断线时,它会丢失所有在断线期间分发给它的事件。
订阅与发布功能(pub/sub)功能实现在pubsub.c中,后续会在博文中讲到。

阅读全文 »

源码位置:db.c/server.h

1. Redis数据库介绍:
在前两个阶段中,我们学习了redis数据结构的实现,而这些数据结构都是为了实现数据库功能做的铺垫,下面,让我们一起来看看redis数据库是如何实现的吧。

Redis服务器在运行的时候会创建大量的redisObject对象,这些对象都是存在redisDb中的,为了快速索引到某个对象,redisDb采用了dict字典结构设计。
启动Redis后,Redis服务器将所有数据库都保存在redisServer结构的db数组中,db数组的每一项都是一个redisDb结构,代表一个数据库。根据配置参数,redis服务器在初始化的时候,默认情况下会创建16个数据库,由dbnum决定(可通过databases配置修改),每个数据库都是独立的。
客户端可以通过select命令来切换数据库,如select 1会切换到数据库号为 1 的数据库,select是通过修改客户端的db指针,指针指向不同的数据库来实现数据库的切换操作的。

阅读全文 »

1. 编译系统

从源码文件到可执行程序是如何实现的呢?下面写个简单的程序来进行说明。
以下是一个 hello.c 程序:

阅读全文 »

源码位置:t_zset.c/server.h

zset对象底层编码方式有两种,ziplistskiplist
使用ziplist编码需要同时满足以下两个条件:

  • 有序集合对象中所有元素的大小都小于64字节。(可通过redis.conf配置:zset_max_ziplist_value)
  • 有序集合对象保存的元素个数不超过128个。(可通过redis.conf配置:zset_max_ziplist_entries)
阅读全文 »

源码位置:t_set.c/server.h

set对象底层编码方式有两种,intsethashtable
使用intset编码的条件:

  • 集合对象中所有元素都是整数值。
  • 集合对象保存的元素个数不超过512个。(可通过redis.conf配置:set_max_intset_entries)
阅读全文 »