Redis常见面试题之Redis的持久化

1.redis持久化

redis持久化的两种方式:rdb和aof

rdb方式:

RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照(snapshot)。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件。是全量存储,而且是默认开启的

执行的时机:

  • 执行save命令

  • 执行bgsave命令

  • Redis停机时

  • 触发RDB条件时

触发RDB的条件能在redis.conf文件中找到,大概格式如下

 代表如果一分钟内有10000条数据发生改变就执行rdb,其余两个分别是五分钟10条改变,十五分钟一条数据改变

原理:

edis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件,整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能,如果需要进行大规模的快照,且处于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效.RDB的缺点就是最后一次持久化后的数据可能丢失.

具体流程:

1) redis 客户端执行 bgsave 命令或者自动触发 bgsave 命令;

2) 主进程判断当前是否已经存在正在执行的子进程,如果存在,那么主进程直接返回;

3) 如果不存在正在执行的子进程,那么就 fork 一个新的子进程进行持久化数据,fork 持久化数据时,会采用copy-on-write技术,主进程执行读的操作,访问主进程与子进程的共享内存,如果主进程执行的是写的操作,会拷贝一份数据执行写的操作。

4) 子进程先将数据写入到临时的rdb文件中,待快照数据写入完成后再原子替换旧的 rdb文件;

5) 同时发送信号给主进程,通知主进程 rdb 持久化完成,主进程更新相关的统计信息

 流程图如下:

aof方式:

流程:

1) 客户端的请求写命令会被 append 追加到 AOF 缓冲区内

2) AOF 缓冲区根据 AOF 持久化策略[always,everysec,no]将操作 sync 同步到磁盘的 AOF 文件 中

3) AOF 文件大小超过重写策略或手动重写时,会对 AOF 文件 rewrite 重写,压缩 AOF 文件容量

4) Redis 服务重启时 ,会重新 load 加载 AOF 文件中的写操作达到数据恢复的目的

 与rdb比较:

优势: 安全性相对RDB方式高很多,它记录了每一个操作

劣势:效率相对于RDB方式低很多。

Redis默认是关闭AOF方式的。

打开aof方式:

在redis.conf中找到下图位置

 aof的同步策略:

always 同步持久化,每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好

everysec 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案

no 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘

三种策略的对比:

 aof重写机制:

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。

 例如:

如图,AOF原本有三个命令,但是set num 123 和 set num 666都是对num的操作,第二次会覆盖第一次的值,因此第一个命令记录下来没有意义。

所以重写命令后,AOF文件内容就是:mset name jack num 666

aof重写机制的原理:

     AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。 AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似

重写机制触发条件:

 在 APPEND ONLY MODE模块下有两条默认配置:

这两条配置就是触发重写aof文件的条件,第一个表示文件大小达到前一次保存文件的一倍,第二个表示aof文件大小最少达到64MB,两个条件必须同时满足。

 两种方式比较:

RDB

采用的是快照机制进行的持久化

优点
  • RDB 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集。 这种文件非常适合用于进行备份

  • RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快(因为其文件要比AOF的小)==

  • RDB的性能要比AOF更好==

缺点
  • RDB的持久化不够及时(一定时间间隔),可能会存在数据丢失,不便于数据库的重构(因为是快照的某一时刻最终结果,不清楚数据的变化过程)==

  • RDB持久化时如果文件过大可能会造成服务器的阻塞,停止客户端请求

AOF

采用append模式,不断的记录数据的变化过程

优点
  • zAOF的持久性更加的耐久(可以每秒 或 每次操作保存一次)

  • AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松,数据几乎不会丢失,便于数据库的重构。

  • AOF是增量操作

缺点
  • 对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积,而且AOF文件只会越来越大(即使是删除命令也会被记录)

  • 根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值