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 来影响的,也被称为三种策略。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战