redis笔记-数据库之持久化策略

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis笔记-数据库之持久化策略相关的知识,希望对你有一定的参考价值。

2018-1-17 by Atlas


  • redis持久化

将redis在内存中的数据库状态保持到磁盘里面,避免数据意外丢失。

  • RDB持久化
  • 既可以手动执行,也可以根据服务器配置选项定期执行。
  • 生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态。
  • RDB文件载入时,服务器一直处于阻塞状态,直到完成。

技术分享图片

  • 命令SAVE、BGSAVE
    SAVE命令会阻塞redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求。
    BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求。

  • AOF文件更新频率通常比RDB文件更新频率高。
    so -->
    如果开启AOF,服务器优先使用AOF文件还原数据库;
    只有AOF关闭,服务器才会使用RDB文件还原数据库。

技术分享图片

  • BGSAVE命令执行时的服务器状态:
    (1)BGSAVE执行期间,客户端发送的SAVE命令会被服务器拒绝。
    (2)BGSAVE执行期间,客户端发送的BGSAVE命令会被服务器拒绝。
    (3)BGSAVE和BGREWRITEAOF不能同时执行:
    如果BGSAVE正在执行,那么客户端发送的BGREWRITEAOF会被延迟到BGSAVE后执行;
    如果BGREWRITEAOF正在执行,那么客户端发送的BGSAVE会被服务器拒绝。

  • SAVE保存条件
save  900  1                          服务器在900秒之内,对数据库进行了至少1次修改
save  300  10                        服务器在300秒之内,对数据库进行了至少10次修改
save  60    10000                  服务器在60秒之内,对数据库进行了至少10000次修改
struct redisServer {
        // ...
        // 记录保存条件的数组
        struct saveparam *saveparams;
        // 修改计数器
        long long dirty;
        // 上次执行保存的时间
        time_t lastsave;
        // ...
}
struct saveparam {
        // 秒数
        time_t seconds;
        // 修改数
        int changes;
}

ServerCron 函数检查保存条件的过程

技术分享图片

RDB文件结构将和JAVA CLASS文件一同讨论。

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

技术分享图片

  • AOF文件内容是纯文本格式。
    e.g.
    redis> SET msg "hello"
    ok
    AOF文件内容(SELECT命令是服务器自动添加的):
    2\r\n$6\r\nSELECT\r\n$1\r\n0\r\n
    3\r\n$3\r\n$3\r\nSET\r\n$3\r\nmsg\r\n$5\r\nhello\r\n

  • AOF持久化实现步骤:
    命令追加 --> 文件写入 --> 文件同步
  • 命令追加是将执行的写命令追加到服务器状态的aof_buf缓存区的末尾:
struct redisServer {
        // ...
        // AOF缓冲区
        sds aof_buf;
        // ...
}
  • 文件的写入与同步
    flushAppendOnlyFile()函数考虑是否要将aof_buf中的内容写入和保存到AOF文件里面,行为由服务器配置的appendfsync选项的值来决定。
  • appendfsync配置:

技术分享图片

always:AOF持久化效率最慢,安全性来说最安全,故障只会丢失一个命令数据。
everysec:AOF持久化效率足够快,安全性来说,故障只会丢失一秒钟的命令数据。
no:AOF持久化效率最快,安全性来说,故障会丢失上次同步AOF文件之后的所有写命令数据。

  • AOF 文件载入过程

技术分享图片

  • AOF文件重写,解决AOF文件体积膨胀问题。
  • AOF文件重写原理:
    AOF文件重写并不需要对现有的AOF文件进行读取、分析或者写入操作,而是通过读服务器当前的数据库状态来实现的。
    AOF文件重写首先从数据库中读取键现在的值,然后用一条命令记录键值对,代替之前记录这个键的多条命令。
    如果元素数量超过redis.h/REDIS_AOF_REWRITE_ITEMS_PER_CMD常量的值,那么重写多条命令记录键的值。
  • AOF文件后台重写过程(BGREWRITEAOF原理)

技术分享图片

技术分享图片

参考文献:《redis设计与实现》

以上是关于redis笔记-数据库之持久化策略的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记——redis持久化之RDBAOF

Redis学习笔记—持久化机制之RDB

redis持久化之RDB

Redis学习笔记—持久化机制之AOF

大数据笔记(二十一)——NoSQL数据库之Redis

NoSQL学习笔记之——Redis基础