• java
  • go
  • 数据库
  • linux
  • 中间件
  • 书
  • 源码
  • 夕拾

  • java
  • go
  • 数据库
  • linux
  • 中间件
  • 书
  • 源码
  • 夕拾

数据库的实现

目录

  • 目录
  • 数据库
    • 过期键
      • 过期键的删除策略
      • rdb对过期键的处理
      • aof文件写入
      • aof重写
      • 复制
    • 数据库通知
  • 备份与恢复
    • rdb
    • aof
      • aof持久化的实现
      • aof重写
    • 混合持久化(4.0)

数据库

redis服务器所有数据库保存在redisserver.db数组中,数据库数量由redisServer.dbnum属性保存.

数据库主要由dict和expires两个字典保存,dict保存键值对,expires字典负责保存键的过期时间.过期时间是一个以毫秒为单位的unix时间戳.

1
2
3
typedef struct redisDb {
dict *dict;
} redisDb;

过期键

过期键的删除策略

  1. 定时删除:设置键过期时间的同时,创建一个定时器(timer),定时器在键过期时间来临时,立即执行删除操作.对cpu不友好.
  2. 惰性删除:放任过期键不管,每次从键空间获取键,都检查是否过期,如果过期则删除,未过期则返回.对内存不友好
  3. 定期删除:每隔一段时间,程序对数据库进行一次检查,删除里面的过期键.
  • redis服务器使用的是惰性删除+定期删除两种策略.

rdb对过期键的处理

  1. 主服务器模式下,程序对键检查,未过期的载入,过期的忽略
  2. 从服务器模式下,无论是否过期都载入,不过主从服务器在进行数据同步的时候,从数据库会被情况,所以过期键对载入rdb文件的从服务器也不会造成影响

aof文件写入

aof模式持久化数据,如果某个键没有被惰性删除或者定期删除,aof不会因为这个键产生任何影响,当过期或被惰性删除后,会向aof追加一个del命令.

aof重写

过期的不会被保存到重写后的aof文件.

复制

从服务器过期键动作由主服务器控制.

  1. 主服务器删除一个key,会显示向从服务器发送del命令
  2. 从服务器在执行碰到过期key也不会删除.
  3. 从服务器只有在加收到主服务器发送来的del后才会删除过期key.

数据库通知

键空间通知(key-space notification):某个键执行了什么命令的通知.
键事件通知(key-event notification):某个命令被什么键执行了.

配置:notify-keyspace-eventes(参数看配置文件说明即可)

备份与恢复

rdb

  • 文件创建
    1. save:会阻塞redis服务进程.
    2. bgsave:fork出一个子进程去执行save.客户端发送的save,bgsave会被拒绝,bgrewriteaof和bgsave不能同时执行
  • 文件载入:启动的时候自动加载.reload函数

aof

aof持久化的实现

  1. 命令追加
  2. 文件写入
  3. 文件同步

aof的载入(redis读取aof文件还原的流程):
首先服务器启动载入程序

  1. 创建一个不带网络链接的伪客户端,因为redis命令只能在客户端上下文执行.
  2. 从aof文件分析并读取一条写命令
  3. 为哭护短执行被读出的写命令
  4. 一直执行,直到aof文件结束.

aof重写

命令:bgrewriteaof,fork子进程进行aof文件重写,会同时向新老两个aof文件的缓冲区追加.

混合持久化(4.0)

一、概述
基础数据结构
  1. 1. 目录
  2. 2. 数据库
    1. 2.1. 过期键
      1. 2.1.1. 过期键的删除策略
      2. 2.1.2. rdb对过期键的处理
      3. 2.1.3. aof文件写入
      4. 2.1.4. aof重写
      5. 2.1.5. 复制
    2. 2.2. 数据库通知
  3. 3. 备份与恢复
    1. 3.1. rdb
    2. 3.2. aof
      1. 3.2.1. aof持久化的实现
      2. 3.2.2. aof重写
    3. 3.3. 混合持久化(4.0)
© 2023 haoxp
Hexo theme