0. 前言 Redis在封装事件的处理采用了Reactor模式,添加了定时事件的处理.Redis处理事件是单进程单线程的,而经典Reator模式对事件是串行处理的.即如果有一个事件阻塞过久的话会导致整个Redis被阻塞. 对于Reactor模式,可以查看维基百科.(这里推荐一本书:<面向模式的软件架构:卷2>,里面详细讲了Reactor模式,但是刚开始可能会不太 明白,耐下心来就好).我自己也使用Reactor封装了一个事件处理,其中对于读事件加入了线程池的处理,但是还在测试(该封装主要针对公…
aeEventLoop初始化 在server.c文件的initServer函数中,对aeEventLoop进行了初始化: 调用aeCreateEventLoop函数创建aeEventLoop结构体,对aeEventLoop结构体中的变量进行了初始化,之后调用了aeApiCreate函数创建epoll实例 调用aeCreateFileEvent函数向内核注册监听事件,由参数可知,注册的是对TCP文件描述符的可读事件监听,回调函数是acceptTcpHandler,当内核监听到TCP文件描述符有可读…
aeEventLoop初始化 在server.c文件的initServer函数中,对aeEventLoop进行了初始化: 调用aeCreateEventLoop函数创建aeEventLoop结构体,对aeEventLoop结构体中的变量进行了初始化,之后调用了aeApiCreate函数创建epoll实例 调用aeCreateFileEvent函数向内核注册监听事件,由参数可知,注册的是对TCP文件描述符的可读事件监听,回调函数是acceptTcpHandler,当内核监听到TCP文件描述符有可读…
概述 Redis 的 client-output-buffer-limit 可以用来强制断开无法足够快从 redis 服务器端读取数据的客户端.保护机制规则如下: [hard limit] 大小限制,当某一客户端缓冲区超过设定值后,直接关闭连接. [soft limit] 持续时间限制,当某一客户端缓冲区持续一段时间占用过大空间时关闭连接. 该参数一般用在以下几类客户端中: 普通 client,包括 monitor 主从同步时的 slave client Pub/Sub 模式中的 client…
IO线程初始化 Redis在6.0版本中引入了多线程,提高IO请求处理效率. 在Redis Server启动函数main(server.c文件)中初始化服务之后,又调用了InitServerLast函数: int main(int argc, char **argv) { // ... // 初始化服务 initServer(); // ... // InitServerLast InitServerLast(); // ... // 事件循环 aeMain(server.el); // ...…
一.SDS的简单介绍 SDS:简单动态字符串(simple dynamic string) 1)SDS是Redis默认的字符表示,比如包含字符串值的键值对都是在底层由SDS实现的 2)SDS用来保存数据库中的字符串值 3)SDS被用作缓冲区:比如AOF模块的AOF缓冲区,以及客户端状态中的输入缓冲区 二.SDS的结构 struct sdshdr { // buf 中已占用空间的长度 int len; // buf 中剩余可用空间的长度 int free; // 字节数组 char buf[];…
0. 前言 这里对Redis底层字符串的实现分析,但是看完其实现还没有完整的一个概念,即不太清楚作者为什么要这样子设计,只能窥知一点,需要看完redis如何使用再回头来体会,有不足之处还望告知. 涉及文件:sds.h/sds.c 1.  数据结构: typedef char *sds; struct sdshdr { unsigned int len; //buf中已使用的字节数 unsigned int free; //buf中未使用的字节数 char buf[]; //缓冲区 }; 这里向外…
介绍 简单动态字符串(Simple Dynamic Strings, SDS)是Redis的基本数据结构之一,用于存储字符串和整型数据.它的特点是:方便扩容.二进制安全. 二进制安全 在C语言中,用"\0"表示字符串结束,如果字符串本身有"\0"字符,字符串就会被阶段,即非二进制安全:通过某种手段,避免读写字符串时被截断,则是而二进制安全 结构体设计 SDS的结构体大致为 struct sds { int len; // buf中已占用字节数 int free; /…
字典,又叫映射,是一种用于保存键值对的抽象数据结构 划重点:抽象数据结构 Redisd字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表结点,而每个哈希表结点就保存了字典中的一个键值对 一.哈希表结构 // dictht 哈希表 //每个字典都使用两个哈希表,从而实现渐进式 rehash typedef struct dictht { // 这是字典的头部 // 哈希表数组, 每个元素都是一条链表 dictEntry **table; // 哈希表大小 unsigned long siz…
首先是锁的抽象类,定义了继承的类必须实现加锁.释放锁.返回锁拥有者的方法. namespace Illuminate\Cache; abstract class Lock implements LockContract { use InteractsWithTime; // 锁的名称 protected $name; // 锁的时长 protected $seconds; // 当前操作锁的拥有者 protected $owner; // 获取锁失败时,重新获取锁需要等待的毫秒数 protect…