定义
Redis是一个基于内存的数据库,它的数据是存放在内存中,内存有个问题就是关闭服务或者断电会丢失。为了数据的永久保存,需要把数据同步到硬盘上,这个过程就叫做持久化.
Redis提供了2种不同形式的持久化方式:
- RDB(Redis DataBase) :简而言之,就是在指定的时间间隔内,定时的将 redis 存储的数据生成Snapshot快照并存储到磁盘等介质上;
- AOF(Append Of File) :将 redis 执行过的所有写指令记录下来,在下次 redis 重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
Redis支持两种方式的持久化,一种是RDB方式(默认),一种是AOF方式。可以单独使用其中一种或将二者结合使用。
redis持久化之RDB方式
RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照(snapshot)。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。
执行时机:
RDB持久化在四种情况下会执行:
-
执行save命令
-
执行bgsave命令
-
Redis停机时
-
触发RDB条件时
1)save命令
执行下面的命令,可以立即执行一次RDB:

save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。
2)bgsave命令
下面的命令可以异步执行RDB:

这个命令执行后会开启独立进程完成RDB,主进程可以持续处理用户请求,不受影响。
3)停机时
Redis停机时会执行一次save命令,实现RDB持久化。
4)触发RDB条件
Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:
# 900秒内,如果至少有1个key被修改,则执行bgsave , 如果是save "" 则表示禁用RDB save 900 1 save 300 10 save 60 10000
RDB原理
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件,整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能,如果需要进行大规模的快照,且处于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效.RDB的缺点就是最后一次持久化后的数据可能丢失.

具体执行流程:
1) redis 客户端执行 bgsave 命令或者自动触发 bgsave 命令;
2) 主进程判断当前是否已经存在正在执行的子进程,如果存在,那么主进程直接返回;
3) 如果不存在正在执行的子进程,那么就 fork 一个新的子进程进行持久化数据,fork 过程是阻塞的,fork 操作完成后主进程即可执行其他操作;
4) 子进程先将数据写入到临时的rdb文件中,待快照数据写入完成后再原子替换旧的 rdb文件;
5) 同时发送信号给主进程,通知主进程 rdb 持久化完成,主进程更新相关的统计信息
redis持久化之AOF方式
AOF: 以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来(不会记录读指令),只许追加文件但是不可以改写文件,redis启动之初会读取该文件(appendonly.aof)重新构建数据,换而言之:redis重启的话就是根据日志文件的内容将写指令从头到尾执行一次,以完成数据的恢复工作.

AOF原理:
AOF(Append Only File)是Redis提供的一种数据持久化方式,它通过记录每次写操作命令到一个日志文件来实现数据的持久化。这种方式确保了即使在Redis服务器重启之后,也能通过回放这些命令来恢复数据
具体执行流程:
1) 客户端的请求写命令会被 append 追加到 AOF 缓冲区内
2) AOF 缓冲区根据 AOF 持久化策略[always,everysec,no]将操作 sync 同步到磁盘的 AOF 文件 中
3) AOF 文件大小超过重写策略或手动重写时,会对 AOF 文件 rewrite 重写,压缩 AOF 文件容量
4) Redis 服务重启时 ,会重新 load 加载 AOF 文件中的写操作达到数据恢复的目的
RDB与AOF对比
RDB
采用的是快照机制进行的持久化
优点
-
RDB 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集。 这种文件非常适合用于进行备份
-
==RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快(因为其文件要比AOF的小)==
-
==RDB的性能要比AOF更好==
缺点
-
==RDB的持久化不够及时(一定时间间隔),可能会存在数据丢失,不便于数据库的重构(因为是快照的某一时刻最终结果,不清楚数据的变化过程)==
-
RDB持久化时如果文件过大可能会造成服务器的阻塞,停止客户端请求
AOF
采用append模式,不断的记录数据的变化过程
优点
-
AOF的持久性更加的耐久(可以每秒 或 每次操作保存一次)
-
AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松,数据几乎不会丢失,便于数据库的重构。
-
AOF是增量操作
缺点
-
对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积,而且AOF文件只会越来越大(即使是删除命令也会被记录
-
根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB.
小结
RDB方式是redis默认支持的
1) 整个过程中,主进程是不进行任何 IO 操作的,这就确保了极高的性能
2) 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加的高效
3) RDB 的缺点是最后一次持久化后的数据可能丢失
AOF方式
优势: 安全性相对RDB方式高很多,它记录了每一个操作
劣势:效率相对于RDB方式低很多。
Redis默认是关闭AOF方式的。
2616

被折叠的 条评论
为什么被折叠?



