Redis 的久化锦囊据丢读写都是在内存中进行的,所以它的手再失性能高。而当我们的心数服务器断开或者重启的时候,数据就会消失,久化锦囊据丢那么我们该怎么解决这个问题呢?手再失 其实 Redis 已经为我们提供了一种持久化的机制,分别是心数 RDB 和 AOF 两种方式,接下来跟着我一起看看这两个锦囊都是久化锦囊据丢怎么保证数据的持久化的。 由于 Redis 是手再失基于内存的数据库,所以当服务器出现故障的心数时候,我们的久化锦囊据丢数据就得不到安全保障。 这个时候就需要将内存中的手再失数据存储到磁盘中,当我们服务器重启时,心数便可以通过磁盘来恢复数据,久化锦囊据丢这个过程就叫做 Redis 持久化。手再失 Redis持久化 RDB全称Redis Database Backup file(Redis数据备份文件),心数也可以称为Redis数据快照。 当 Redis 持久化时,程序会将当前内存中的数据库状态保存到磁盘中。 创建 创建 RDB 文件主要有两个 Redis 命令:SAVE 和 BGSAVE。 同步操作,执行命令时,会阻塞 Redis 服务器进程,拒绝客户端发送的命令请求。 代码示例: 图示: Save命令 异步操作,执行命令时,子进程执行保存工作,服务器还可以继续让主线程处理客户端发送的命令请求。 代码示例: 图示: bgSave命令 载入工作在服务器启动时自动执行。 载入 服务器在载入 RDB 文件期间,会一直处于阻塞状态,直到载入工作完成为止。 Redis 允许用户通过设置服务器配置的 save 选项,让服务器每隔一段时间自动执行一次 BGSAVE 命令。 提供配置如下: 在这种情况下,只要满足以下条件中的一个,BGSAVE 命令就会被执行: 服务器程序会根据 save 选项所设置的保存条件,网站模板设置服务器状态 redisServer 结构的 saveparams 属性。 dirty 计数器记录距离上一次成功执行 SAVE 命令或 BGSAVE 命令之后,服务器对数据库状态进行了多少次修改(包括写入、删除、更新等操作)。 是一个 UNINX 时间戳,记录了服务器上一次成功执行 SAVE 命令或者 BGSAVE 命令的时间。 服务器周期性操作函数 serverCron (该函数对正在运行的服务器进行维护)默认每隔 100 毫秒就会执行一次,其中一项工作就是检查 save 选项所设置的保存条件是否已经满足,满足的话就执行 BGSAVE 命令。 代码示例: RDB 文件默认的配置如下: AOF全称为 Append Only File(追加日志文件)。日志是写后日志,Redis 是先执行命令,把数据写入内存,然后才记录日志。 写后日志 AOF 持久化流程实现主要是通过以下流程来实现的: AOF流程 若 AOF 持久化功能处于打开状态,服务器在执行完一个命令后,会以协议格式将被执行的写命令追加到服务器状态的 aof_buf 缓冲区的末尾。 服务器每次结束一个事件循环之前,都会调用 flushAppendOnlyFile 函数,这个函数会考虑是否需要将 aof_buf 缓冲区中的内容写入和保存到 AOF 文件里。 flushAppendOnlyFile 函数执行以下流程: 这个函数是由服务器配置的 appendfsync 的三个值:always、everysec、no来影响的,也被称为三种策略。 每条命令都会 fsync 到硬盘中,这样 redis 的写入数据就不会丢失。 Always 每秒都会刷新缓冲区到硬盘中(默认值)。 everysec 根据当前操作系统的规则决定什么时候刷新到硬盘中,不需要我们来考虑。 no 为何需要文件重写: 文件重写的实现原理: 为不阻塞父进程,Redis 将 AOF 重写程序放到子进程里执行。 在子进程执行 AOF 重写期间,服务器进程需要执行三个流程: 服务器流程 AOF 文件默认的配置如下: 通过以上的简介,想必大家都对 Redis 持久化有了大致的了解,那么这两种方式,我们该如何选择呢? 也可以参照下图进行选择: 主要对比 本文转载自微信公众号「浅羽的IT小屋」,可以通过以下二维码关注。转载本文请联系浅羽的IT小屋公众号。持久化
RDB
简介
创建
SAVE
BGSAVE
载入
主要设置
设置保存条件
saveparams
dirty
lastsave
检查保存条件是否满足
默认配置
AOF
简介
实现
命令追加
文件同步
Always
everysec
no
数据加载
创建一个不带网络连接的伪客户端; 从 AOF 文件中分析并读取出一条写命令; 使用伪客户端执行被读出的写命令; 一直执行步骤 2 和 3,直到 AOF 文件中的所有写命令都被处理完毕为止。 文件重写
实现
后台重写
默认配置
总结