精品 Redis的持久化机制

1.概述

Redis 的高性能是因为其将所有数据都存储在了内存中,IO操作基于内存进行需要读取数据直接从内存调取,为了使 Redis 在重启之后仍然保证数据不会丢失,那么我们就需要把数据从内存同步到磁盘中,备份一下,这一过程就是持久化,Redis 支持两种持久化方式,一种是 RDB方式,另一种是 AOF方式,我们可以单独使用其中一种,或着将这两种结合使用。

(1)RDB方式(默认)

在指定的时间间隔内,将内存数据快照备份至磁盘中。

(2)AOF方式(默认)

以日志的形式处理每一个写操作,Redis服务器启动时会读取日志构建初始化数据,保证启动后数据是完整的。

2. RDB方式

RDB 技术实现步骤如下

1.Redis 执行 fork 命令创建子进程

2.父进程继续处理 client 请求,子进程负责将内存内容写入到临时文件。OS 的写时复制机制父子进程会共享相同的物理页面,当父进程处理写请求时 OS 会为父进程要修改的页面创建副本,进程的地址空间内的数据是 fork 时刻整个数据库的一个快照。

3.子进程将快照写入临时文件完毕后,临时文件替换原来的快照文件,然后子进程退出。每次 RDB 都是将内存数据完整写入到磁盘一次,并不是增量同步。如果数据量大的话,会引起大量的磁盘 IO 严重影响性能。

PS:如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么 RDB 将不是一个很好的选择。 因为系统一旦在定时持久化之前发生宕机, 你就可能会丢失这之间的数据。

在 redis.conf 中可以配置和RDF

图片.png

图片.png

(1)当至少有1条key修改,没900秒保存1次

(2)当至少有10条key修改,没300秒保存1次

(3)当至少有10000条key修改,没60秒保存1次

3.AOF机制

采用 AOF 方式,Redis 会将每一个收到的写命令都通过 write 函数写入到 AOF 文件中。当 Redis 重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。

  1. Redis调用 fork 命令创建子进程。

2.子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令。

3.父进程继续处理client请求,除了把写命令写入到原来的 AOF 文件中,同时缓存新收到的写命令。

4.子进程把快照内容写入写到临时文件后,子进程发信号通知父进程,然后父进程把缓存的写命令也写入到临时文件。

5.父进程使用临时文件替换老的 AOF 文件,并重命名,后面收到的写命令也开始往新的 AOF 文件中追加。

PS: AOF 提供的三种同步策略,使得数据安全性更高,因为 AOF 对日志文件的写入操作采用的是 append 模式,因此在写入过程中即使出现宕机现象,

也不会破坏日志文件已经存在的内容。如果 AOF 日志文件过大,Redis 可以自动启用 rewrite 机制,使 Redis 以 append 模式不断的将修改数据写入到老的磁盘文件中,

同时 Redis 还会创建一个新的文件用于记录此期间有那些命令被执行。

缺点:

1.对于相同数量的数据集而言,AOF 文件通常要大于RDB文件。
2.根据同步策略的不同,AOF 在运行效率上往往会慢于REB。

设置AOF

图片.png

AOF 具有三种同步策略,在配置文件 redis.conf 中进行配置

图片.png

暂无数据
关注 私信
文章 专栏 文档 话题

相关推荐

  • Redis 哨兵模式详解
  • Redis常见的几大问题
  • Redis从入门到精通(一)介绍安装
  • Redis的特性
  • Redis的数据类型
联系客服