Redis

关注公众号 jb51net

关闭
首页 > 数据库 > Redis > Redis持久化RDB和AOF

Redis 7持久化RDB和AOF的原理机制讲解(图文教程)

作者:九转苍翎

Redis是一个基于内存的数据库,由于内存的易失性(断电后数据会丢失),Redis提供了持久化机制:将内存中的数据保存到磁盘中,确保数据在Redis服务重启或崩溃后能够恢复,通过持久化,可以避免数据丢失,提高数据的可靠性,Redis提供两种持久化方式:RDB和AOF

1.概述

Redis是一个基于内存的数据库,这意味着其主要数据存储和操作均在内存中进行。这种设计使得Redis能够提供极快的读写速度(通常达到微秒级别),适用于高性能场景,如缓存

2.RDB

RDB指的是Redis的一种持久化机制,其核心是生成Redis数据在某个时间点的快照

2.1 快照原理

由于Redis是单线程应用程序,在线上环境时,不仅要处理来自客户端的请求,还要执行内存快照操作(进行文件IO)。单线程同时处理客户端请求和文件IO时会严重降低服务器性能,甚至阻塞客户端请求。因此,Redis使用 fork写实拷贝(Copy On Write) 机制来实现快照持久化

fork

        Redis在进行RDB持久化时会调用fork函数来创建一个子进程负责完成,父进程则继续处理客户端请求。子进程在创建之初和父进程共享同一数据段

        Linux操作系统的内存空间被分为很多种片段,每个片段又被分为很多个页面,每个页面4KB

写实拷贝

        当父进程对数据段中的某一数据页面进行修改操作时,Linux操作系统会将该数据页面复制一份分离出来,然后对该页面进行修改,最后父进程指向指向修改后的页面。随着被修改的页面越来越多,内存空间不断膨胀,最多达到原来的两倍
        从子进程被创建出来的那一刻起,直至拷贝结束,子进程始终指向原始的数据段且所有原数据段不会被修改。所以,在整个拷贝过程中 RDB快照 = 子进程看到的所有数据页面的瞬间状态集合

        拷贝完成后,子进程会被销毁,同时没有指针指向的数据页面也会被销毁

2.2 触发机制

Redis RDB的触发机制分为自动触发和手动触发两种方式

2.3 文件处理

        RDB文件保存在dir配置指定的目录下(默认/var/lib/redis),文件名通过dbfilename配置指定(默认dump.sql)
        在RDB备份过程中,fork出的子进程会将内存数据写入临时文件,临时文件默认命名规则为temp-< pid >.rdb,其中< pid >是子进程的进程ID。当子进程完成RDB文件写入后,Redis会用原子性的rename操作将临时文件重命名为正式RDB文件并删除原文件

2.4 优缺点

优点

缺点

3.AOF

AOF持久化通过将Redis服务器接收到的每个写命令追加到文件末尾来实现

# 开启AOF
appendonly yes

3.1 工作流程

3.2 重写机制

作用:解决AOF文件不断增长导致的存储空间占用和恢复效率问题。通过重写,可以生成一个更紧凑的AOF文件,仅包含重建当前数据集所需的最小命令集合(例如,对同一个键多次修改会记录多条命令,而重写机制会合并这些操作,仅保留最终状态的命令)

        父进程通过fork创建一个子进程来完成AOF文件的重写,确保主进程继续处理客户端请求。子进程会读取当前数据库的快照数据,并将其转换为一系列Redis命令写入新的临时AOF文件

        在重写过程中,主进程会将新接收到的写命令同时写入现有的AOF 缓冲区aof_buf(保证原有 AOF 文件正常更新)和AOF重写缓冲区aof_rewrite_buf(保证新命令不会丢失)

        当子进程完成重写后,会通知主进程。主进程会将 AOF 重写缓冲区中的命令追加到新生成的临时 AOF 文件中,最后原子性地替换旧文件

        在Redis7.0.15版本,AOF文件保存在dir + appenddirname配置指定的目录下(默认/var/lib/redis/appendonlydir)。文件前缀名通过appendfilename配置指定(默认appendonly)

4.混合持久化

        Redis 混合持久化结合了 RDB(快照)和 AOF(日志)两种持久化方式的优势,在保证数据安全性的同时兼顾性能

# 开启混合持久化
aof-use-rdb-preamble yes

到此这篇关于Redis 7持久化RDB和AOF的原理机制讲解(图文教程)的文章就介绍到这了,更多相关Redis持久化RDB和AOF内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文