美文网首页
redis 数据持久化

redis 数据持久化

作者: 好好学习天天输出 | 来源:发表于2020-12-04 18:37 被阅读0次

    1. RDB

    全量

    fork

    redis.conf

    //default configuration
    save 900 1
    save 300 10
    save 60 10000
    

    command

    > SAVE
    > BGSAVE 
    
    1. BGSAVE 命令
    2. rdbSaveBackground()
    3. redisFork()创建子进程
    4. fork()生成父子进程

    fork()返回
    返回0,当前是子进程。
    返回-1,当前是父进程,子进程失败。
    返回其他,当前是父进程。

    fork()特性
    子进程获得和父进程相同的内存空间(代码段、数据段)。
    父子进程都会执行fork()后的代码。
    创建子进程不会立刻大量内存拷贝。内存被修改时以页为单位拷贝,再次避免大量内存拷贝。(写时拷贝,copy on write)

    copy on write

    • 解释

    fork后,子进程地址空间指向父进程,父进程使用原来的物理内存空间。
    子进程对内存空间有写入操作时,给子进程分配物理空间。

    • 原理
    1. fork()后,kernel设置父进程所有内存页权限设置为read-only,子进程地址空间指向父进程。
    2. 父子进程都读内存时,没有影响。
    3. 其中一个进程写内存时,CPU硬件检测到内存页是read-only,触发页异常中断(page-fault),陷入kernel中断例程。
    4. 中断例程中,kernel 把触发异常的页复制一份。

    2. AOF:增量

    增量

    redis.conf

    // default
    appendonly no 
    appendfilename "appendonly.aof"
    
    # appendfsync always
    appendfsync everysec
    # appendfsync no
    

    AOF重写

    记录修改指令。
    校验 > 存储 > 执行

    • AOF重写(瘦身)

    BGREWRITEAOF指令
    根据原来的AOF文件结果序列化新的AOF文件
    对过程中新的指令追加到新AOF文件
    替换旧AOF文件

    fsync

    强制把page-cache强制sync到磁盘。
    进一步降低数据丢失情况。
    阻塞,主进程负责。

    3. 其他

    redis-4.0开始启用混合持久化和重放

    相关文章

      网友评论

          本文标题:redis 数据持久化

          本文链接:https://www.haomeiwen.com/subject/uamiwktx.html