5. Redis
敲木鱼的小和尚
热衷于专研技术的大好青年
展开
-
Redis设计与实现--02--单机数据库-06-服务端
一、命令请求的执行过程步骤客户端向服务器发送命令请求 SET KEY VALUE服务器接受并处理客户端发来的请求,在数据库中进行设置操作服务器将命令回复给客户端客户端接受之后,打印出来1. 发送命令请求客户端中键入一个命令请求时,客户端会将这个命令请求转换成协议根式,然后通过连接到服务器的套接字,将协议格式的命令请求发送给服务器2. 读取命令请求套接字可读时,服...原创 2019-12-13 13:28:30 · 74 阅读 · 0 评论 -
Redis设计与实现--02--单机数据库-05-客户端
Redis使用I/O多路复用技术实现的文件事件处理器,对于每个与服务器进行连接的客户端,服务器都为这些客户端建立了相应的redisClient结构redis服务器状态结构的clients属性是一个链表,保存了所有与服务器连接的客户端的状态结构一、客户端属性比较通用的属性与特定功能相关的属性接下来介绍一个比较重要的属性1. 输入缓冲区客户单状态的输入缓冲区用于保存客户端发送的...原创 2019-12-13 13:27:09 · 98 阅读 · 0 评论 -
Redis设计与实现--02--单机数据库-04-文件事件和时间事件
Redis服务器是一个事件驱动程序,共有两类事件文件事件:Redis服务器通过套接字与客户端进行连接(或其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象。可以理解为对外的操作事件时间:Redis服务器的一些操作(比如serverCron函数)需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。一、文件事件Redis基于Reactor模式开发自...原创 2019-12-06 13:29:49 · 119 阅读 · 0 评论 -
Redis设计与实现--02--单机数据库-03-AOF持久化
Redis除了RDB持久化方案以外,还提供了AOF持久化功能。与RDB通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。被写入的AOF文件的所有命令都是Redis的命令请求协议格式保存的服务器在启动时,可以通过载入和执行AOF文件中保存的命令来还原服务器关闭之前的数据库状态一、AOF持久化的实现AOF持久化功能的实...原创 2019-12-04 13:19:31 · 101 阅读 · 0 评论 -
Redis设计与实现--02--单机数据库-02-RDB持久化
数据库状态:数据库中的非空数据库以及它们的键值对称为数据库状态一、RDB文件的创建和载入以下两个命令用于生产RDB文件SAVEBGSAVESAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器阻塞期间,服务器不能处理任何命令请求BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进行(父进程)继续处理命令请求RDB文件的创建可以...原创 2019-12-03 23:26:53 · 93 阅读 · 0 评论 -
Redis设计与实现--02--单机数据库-01-数据库
1. 服务器中的数据库redis服务器的数据库结构都是redis.h/redisDb结构struct redisServer{ ... //一个数组,保存这服务器中的所有数据库 redisDb *db //服务器的数据库数量 int dbnum; ...}数据库的个数由dbnum属性决定,该值是由服务器配置的database选项决定,该值默认为16。结构图2....原创 2019-11-14 00:05:39 · 92 阅读 · 0 评论 -
Redis设计与实现--03--多机数据库--复制
一、旧版本(Redis2.8以前)的复制功能旧版本的复制分为同步和命令传播同步:作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态命令传播:用于主服务器的数据库状态被修改,导致主从服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致状态1. 同步当客户端从服务器发送SALEOF命令,要求从服务器复制主服务器时,从服务器首先需要执行同步操作,将从服务器的数...原创 2019-12-01 23:32:10 · 127 阅读 · 1 评论 -
Redis设计与实现--01--数据结构04--整数集合
Redis使用整数集合作为集合键的底层实现的条件一个集合只包含整数值元素集合的元素数量不多一、实现整数集合是Redis用于保存整数值的集合抽象数据结构可以保存类型为int16_t,int32_t或者int64_t的整数值,并且保证集合中不会出现重复元素。由intset.h/intset结构实现typedef struct intset{ //编码方式 uint32_t...原创 2019-11-26 13:20:19 · 82 阅读 · 0 评论 -
Redis设计与实现--01--数据结构03--跳跃表
跳跃表跳跃表示一种有序数据结构,通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表支持平均O(logN),最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点。Redis使用跳跃表作为有序集合键的底层实现之一,满足下面条件之一,就会使用跳跃表实现有序集合键有序集合包含的元素数量比较多有序集合的中的元素的成员是比较长的字符串Redis在两个...原创 2019-11-25 23:55:57 · 88 阅读 · 0 评论 -
Redis设计与实现--01--数据结构02--字典
字典又称符号表,关联数组或者映射,用于保存键值对。字典中的每个键都是独一无二,不重复字典实现Redis的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典的一个键值对。哈希表table属性是一个数组,每个元素是一个dictEntry结构的指针,每个dictEntry结构保存着一个键值对typedef struct dictht{ ...原创 2019-11-22 19:49:20 · 112 阅读 · 0 评论 -
Redis设计与实现--01--数据结构01--SDS和链表
一、简单动态字符串Redis没有直接使用C语言传统的字符串表示(以空字符串结尾的字符数组),构建了一种名为简单动态字符串的抽象模型。但是也存在C语言的字符串字符串的使用方式C字符串:用在无须对字符串值进行的字符串字面量SDS:可以被修改的字符串,在Redis的数据库里面,包含字符串值的键值对在底层都是SDS实现的。1 SDS1.1 SDS结构SDS结构代码stru...原创 2019-11-22 17:17:47 · 109 阅读 · 0 评论 -
Redis实现---02--对象
对象redis没有直接使用数据结构来实现键值对数据库,而是基于这些数据结构创建一个对象系统。对于每种数据结构,redis保存的时候都是以封装对象的形式保存1. 对象的类型与编码新创建一个键值对时,redis至少创建两个对象一个对象用作键值对的键(键对象)一个对象用作键值对的值(值对象)Redis中每个对象都由一个redisObject结构表示,该结构有type属性...原创 2019-11-09 17:57:24 · 90 阅读 · 0 评论