Redis数据库学习第三篇

此篇讲Redis单机数据库的实现

一,Redis数据库

Redis数据库结构

Redis服务器将所有数据库都保存在服务器状态结构的db数组中,db数组的每个项都是一个redisDb结构,每个redisDb结构代表一个数据库。


每个客户端都有自己的目标数据库,每当客户端执行数据库命令时,目标数据库就会成为这些命令的操作对象,客户端可以通过执行SELECT命令来切换目标数据库。

键空间
Redis是一个键值对数据库服务器,服务器中每个数据库都由一个redisDb结构表示,其中,redisDb结构的dict字典保存了数据库中的所有键值对,我们称这个字典为键空间。
键空间和用户所见的数据库是直接对应的:
键空间的每个键都是一个字符串对象,每个值可以是五大对象的任意一种Redis对象。
数据库主要由dict和expires两个字典构成,其中dict字典负责保存键值对,而expires字典则负责保存键的过期时间。
expires字典的键指向数据库中的某个键,而值则记录了数据库键的过期时间,过期时间是一个以毫秒为单位的UNIX时间戳。
因为数据库由字典构成,所以对数据库的操作都是建立在字典操作之上的。

过期键应对策略

Redis使用惰性删除和定性删除两种策略来删除过期的键:惰性删除策略只在碰到过期键时才进行删除操作,定期删除策略则每隔一段时间主动查找并删除过期键
执行SAVE命令或者BGSAVE命令所产生的新RDB文件不会包含已经过期的键
执行BGREWRITEAOF命令所产生的重写AOF文件不会包含已经过期的键。

二,RDB持久化

详细介绍:https://www.jianshu.com/p/2eb1fcc088a5

RDB持久化介绍
因为Redis是内存数据库,它将自己的数据库状态存储在内存,那么一旦服务器进程退出,服务器中的数据库状态就会消失不见,因此Redis提供了RDB持久化功能,这个功能可以将Redis在内存中的数据库状态保存到磁盘里面,避免数据意外丢失。
RDB持久化可以将某个时间店上的数据库状态保存到一个RDB文件中,RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态。

生成RDB文件命令
有两个Redis命令可以用于生成RDB文件,一个是SAVE,另一个是BGSAVE
SAVE会阻塞Redis服务器进程,直到RDB文件创建完毕为止。
BGSAVE会派生出一个子进程,然后由子进程负责创建RDB文件。
另外,如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据库状态,只有在AOF持久化功能关闭时,服务器才会使用RDB文件来还原。


RDB文件结构

三,AOF持久化

详细介绍:https://www.jianshu.com/p/762ffd602382

AOF持久化介绍

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

AOF持久化功能的实现可以分为命令追加,文件写入, 文件同步三个步骤。

为了解决AOF文件体积膨胀的问题,Redis提供了AOF文件重写功能,通过该功能,Redis服务器可以创建一个新的AOF文件来替代现有的AOF文件,新的AOF文件不会包含任何浪费空间的冗余命令,所以新AOF文件体积也会小很多。

四,事件

Redis服务器是一个事件驱动程序,服务器需要处理两类事件:

文件事件
文件事件:Redis服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象:每次套接字变更为许可状态时,相应的文件事件就会产生。服务器与客户端的通信会产生相应的文件事件,而服务器通过监听处理这些事件来完成一系列网络通信操作。
文件事件处理器是基于Reactor模式实现的网络通信程序。

这里补充两个概念:

Reactor模式

Reactor模式首先是事件驱动的,有一个或多个并发输入源,有一个Service Handler,有多个Request Handlers;这个Service Handler会同步的将输入的请求(Event)多路复用的分发给相应的Request Handler。

从结构上,这有点类似生产者消费者模式,即有一个或多个生产者将事件放入一个Queue中,而一个或多个消费者主动的从这个Queue中Poll事件来处理;而Reactor模式则并没有Queue来做缓冲,每当一个Event输入到Service Handler之后,该Service Handler会主动的根据不同的Event类型将其分发给对应的Request Handler来处理。

套接字

Socket是一种进程间通信机制,提供一种供应用程序访问通信协议的操作系统调用,并且通过将socket与Unix系统文件描述符相整合,使得网络读写数据(或者服务调用)和读写本地文件一样容易。

时间事件

时间事件:Redis服务器中的一些操作需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。

时间事件分为定时事件和周期性事件:定时事件只在指定的时间到达一次,而周期性事件则每隔一段时间到达一次。

服务器将所有时间事件都放在一个无序链表中,每当时间事件执行器运行时,它就遍历整个链表,查找所有已到达的时间事件,并调用相应的事件处理器;

而持续运行的Redis服务器需要定期对自身的状态进行检查和调整,从而确保服务器可以长期而稳定的运行,这些定期操作就由serverCron函数负责执行。服务器一般情况下只执行serverCron函数一个时间事件,并且这个事件是周期性事件。

五,客户端与服务器

Redis服务器是典型的一对多服务器程序:一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求。通过使用IO多路复用技术实现的文件事件处理器,Redis服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信。
一个命令请求从发送到完成的主要步骤:1. 客户端将命令请求发送给服务器;2. 服务器读取命令请求,并分析出命令参数 3. 命令执行器根据参数查找命令的实现函数,然后执行实现函数并得出命令回复 4. 服务器将命令回复返回客户端
服务器从启动到能处理客户端命令请求需要执行以下步骤:1. 初始化服务器状态 2. 载入服务器配置 3. 初始化服务器数据结构 4.还原数据库状态 5.执行事件循环

 

参考文献:redis设计与实现第二版 黄建宏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值