zoukankan      html  css  js  c++  java
  • Redis持久化

     Redis 已经为我们提供了一种持久化的机制,分别是 RDB 和 AOF 两种方式。

    由于 Redis 是基于内存的数据库,所以当服务器出现故障的时候,我们的数据就得不到安全保障。

    这个时候就需要将内存中的数据存储到磁盘中,当我们服务器重启时,便可以通过磁盘来恢复数据,这个过程就叫做 Redis 持久化。

    RDB

    RDB全称Redis Database Backup file(Redis数据备份文件),也可以称为Redis数据快照

    • RDB 文件是一个经过压缩的二进制文件(默认:dump.rdb);

    • RDB 文件保存在硬盘里;

    • 通过保存数据库中的键值对来记录数据库状态。

    当 Redis 持久化时,程序会将当前内存中的数据库状态保存到磁盘中。

    创建 RDB 文件主要有两个 Redis 命令:SAVE 和 BGSAVE。

    SAVE

    同步操作,执行命令时,会阻塞 Redis 服务器进程,拒绝客户端发送的命令请求。

    def SAVE():
        # 创建 RDB 文件
        rdbSave()

    BGSAVE

    异步操作,执行命令时,子进程执行保存工作,服务器还可以继续让主线程处理客户端发送的命令请求。

    def BGSAVE():
        # 创建子进程
        pid = fork()

        if pid == 0:
            # 子进程负责创建 RDB 文件
            rdbSave()
            # 完成之后向父进程发送信号
            signal_parent()
        elif pid > 0:
            # 父进程继续处理命令请求,并通过轮训等待子进程的信号
            handle_request_and_wait_signal()
        else:
            handle_fork_error()

    载入

    载入工作在服务器启动时自动执行。

    AOF

    AOF全称为 Append Only File(追加日志文件)。日志是写后日志,Redis 是先执行命令,把数据写入内存,然后才记录日志。

    • 通过保存 Redis 服务器所执行的写命令来记录数据库状态;

    • 写入 AOF 文件的所有命令都是以 Redis 的命令请求协议格式保存的。

    命令追加

    若 AOF 持久化功能处于打开状态,服务器在执行完一个命令后,会以协议格式将被执行的写命令追加到服务器状态的 aof_buf 缓冲区的末尾。

    文件同步

    服务器每次结束一个事件循环之前,都会调用 flushAppendOnlyFile 函数,这个函数会考虑是否需要将 aof_buf 缓冲区中的内容写入和保存到 AOF 文件里。

    flushAppendOnlyFile 函数执行以下流程:

    • WRITE:根据条件,将 aof_buf 中的缓存写入到 AOF 文件;

    • SAVE:根据条件,调用 fsync 或 fdatasync 函数,将 AOF 文件保存到磁盘中。

    这个函数是由服务器配置的 appendfsync 的三个值:always、everysec、no 来影响的,也被称为三种策略。

  • 相关阅读:
    Java实现批量下载《神秘的程序员》漫画
    mysql远程连接:ERROR 1130 (HY000): Host '*.*.*.*' is not allowed to connect to this MySQL server解决办法
    opencv学习_15 (利用cmake查看opencv的源码)
    jobs 命令
    中断子系统6_中断嵌套处理
    JPA一对多映射
    JPA Map映射
    JPA集合映射
    JPA删除实体
    JPA查找实体
  • 原文地址:https://www.cnblogs.com/KL2016/p/14869954.html
Copyright © 2011-2022 走看看