Redis持久化

1、RDB持久化

RDB持久化功能所生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态
有两个redis命令可用于生成RDB文件
(1)SAVE:SAVE命令会阻塞redis服务器进程,知道RDB文件创建完成为止,在服务器进程阻塞期间,redis不能处理任何命令请求
(2)BGSAVE:和SAVE命令直接阻塞服务器进程的做法不同,BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件
可以通过save选项设置多个保存条件,但只要其中任意一个条件被满足,服务器就会执行BGSAVE命令

save 900 1
save 300 10
save 60 10000

那么只要满足以下三个条件中的任意一个,BGSAVE命令就会被执行:❑服务器在900秒之内,对数据库进行了至少1次修改。
❑服务器在300秒之内,对数据库进行了至少10次修改。
❑服务器在60秒之内,对数据库进行了至少10000次修改。

struct redisServer {
    // ...
    //修改计数器
    long long dirty;
    //上一次执行保存的时间
    time_t lastsave;
    // ...
};

redisServer结构还保存了一个dirty参数和一个lastsave参数,dirty代表从上次执行BGSAVE命令算,执行了多少次数据变更操作,lastsave表示上一次执行BGSAVE参数的时间,redis每隔100ms执行一次检查操作,检查是否应该执行BGSAVE命令
RDB文件结构
在这里插入图片描述

2、AOF持久化

AOF持久化通过保存redis服务器索执行的写命令来记录数据库状态

*2\r\n$6\r\nSELECT\r\n$1\r\n0\r\n
*3\r\n$3\r\nSET\r\n$3\r\nmsg\r\n$5\r\nhello\r\n
*5\r\n$4\r\nSADD\r\n$6\r\nfruits\r\n$5\r\napple\r\n$6\r\nbanana\r\n$6\r\ncherry\r\n
*5\r\n$5\r\nRPUSH\r\n$7\r\nnumbers\r\n$3\r\n128\r\n$3\r\n256\r\n$3\r\n512\r\n

write命令 -> aof buf缓冲 -> 磁盘
(1)AOF文件的载入:redis读取AOF文件并还原数据库状态时,会创建一个不带网络连接的伪客户端,因为Redis的命令只能在客户端上下文中执行,而载入AOF文件时所使用的命令直接来源于AOF文件而不是网络连接,所以服务器使用了一个没有网络连接的伪客户端来执行AOF文件保存的写命令,伪客户端执行命令的效果和带网络连接的客户端执行命令的效果完全一样
(2)AOF重写:
随着服务器运行时间的流逝,AOF文件中的内容会越来越多,文件的体积也会越来越大,如果不加以控制的话,体积过大的AOF文件很可能对Redis服务器、甚至整个宿主计算机造成影响
AOF文件体积膨胀的问题,Redis提供了AOF文件重写(rewrite)功能,AOF重写不是去读旧的AOF文件,而是去读取数据库,按数据库的最终数据状态生成命令
Redis持久化_第1张图片

你可能感兴趣的:(redis)