内核函数poll_wait

  • 作用:把当前进程加入到驱动里自定义的等待队列上
  • 当驱动事件就绪后,就可以在驱动里自定义的等待队列上唤醒调用poll的进程
    Read more »

RDB

  1. 文件结构

    一个完整的RDB文件包含上面各部分。
  • REDIS:5字节,检查是否为RDB文件。

  • db_version:4字节,字符串表示的整数,记录版本号。

  • database:0或n个数据库的键值对数据。

  • EOF:1字节,表示正文结束。

  • check_sum:8字节长无符号整数,保存一个校验和,根据前面四个部分计算得到。

    Read more »

哨兵模式

基本概念和详细流程见《Redis设计与实现》、《Redis5设计与源码分析》,只说下自己的理解。
下图是一个基本的主从复制的哨兵系统:

主要有三种角色:哨兵、主服务器,从服务器。

  • 哨兵:一种特殊的redis服务端,使用哨兵专用命令。用来监控主从状态,执行故障转移等。
  • 主服务器:执行客户端请求,同步自身数据到从服务器。
  • 从服务器:从主服务器同步数据。
    Read more »

3.0版本

redis的动态字符串在3.0中的实现如下:

1
2
3
4
5
struct sdshdr {
unsigned int len;
unsigned int free;
char buf[];
};
Read more »

完全复制

  • 第一步是同步
    1)从服务器向主服务器发送SYNC命令。
    2)收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令。
    3)BGSAVE命令执行完毕后,将生成的RDB文件传输给从服务器,从服务器接收到开始更新。
    4)主服务器将记录在缓冲区的所有写命令发送给从服务器,从服务器状态更新。
    如下图示例所示:
  • 命令传播
    主服务器将更改服务器状态的命令发送给从服务器。
    Read more »

3.0哈希表

下面是哈希表结构:

1
2
3
4
5
6
7
8
/* This is our hash table structure. Every dictionary has two of this as we
* implement incremental rehashing, for the old to the new table. */
typedef struct dictht {
dictEntry **table;
unsigned long size;
unsigned long sizemask;
unsigned long used;
} dictht;
Read more »