rdb和aof

  • RDB持久化:原理是将Redis在内存中的数据库记录定时dump到磁盘上的RDB持久化
  • AOF持久化:原理是将Redis的操作日志以追加的方式写入文件

rdb:

开启方式:客户端可以通过向Redis服务器发送save或bgsave命令让服务器生成rdb文件,或者通过服务器配置文件指定触发RDB条件。

使用操作系统的多进程写时复制技术 COW(Copy On Write) 来实现快照的持久化。

  • save(同步操作):客户端向服务器发送save命令请求进行持久化,服务器会阻塞save命令之后的其他客户端的请求,直到数据同步完成。如果数据量太大,同步数据会执行很久,这期间Redis服务器也无法接收其他请求,所以,最好不要在生产环境使用save命令。
  • bgsave(异步操作):客户端发出bgsave命令时,Redis服务器主进程会forks一个子进程来处理数据同步问题,在将数据保存到rdb文件之后,子进程会退出。主进程仍然可以接收其他请求,但forks子进程是同步的,所以forks子进程时,一样不能接收其他请求,如果forks一个子进程花费的时间太久(一般是很快的),bgsave命令仍然有阻塞其他客户的请求的情况发生。

生成rdb文件过程(默认生成的文件名dump.rdb):

  • 生成临时rdb文件,并写入数据。
  • 完成数据写入,用临时文件代替正式rdb文件。
  • 删除原来的db文件。

aof

开启方式:AOF持久化方式会记录客户端对服务器的每一次写操作命令,并将这些写操作以Redis协议追加保存到以后缀为aof文件末尾,在Redis服务器重启时,会加载并运行aof文件的命令,以达到恢复数据的目的。

redis默认不开启AOF持久化方式可以在配置文件中开启并进行更加详细的配置

三种写入策略

  • always:客户端的每一个写操作都保存到aof文件当,很安全,但每个写请求都有IO操作,所以也很慢。
  • everysec:appendfsync的默认写入策略,每秒写入一次aof文件,因此,最多可能会丢失1s的数据。
  • no:Redis服务器不负责写入aof,而是交由操作系统来处理什么时候写入aof文件。更快,但也是最不安全的选择,不推荐使用。

AOP重写机制

提供了 bgrewriteaof 命令用于对 AOF 文件进行瘦身。原理为开辟一个子进程(后台子进程)对内存进行遍历转换成一系列 Redis 的操作指令,序列化到一个新的 AOF 日志文件中,序列化完毕后再将操作期间发生的增量 AOF 日志追加到这个新的 AOF 日志文件中,追加完毕后立即替换旧的 AOF 日志文件。瘦身工作就完成了。

重写机制有"多变一"的功能,将旧日志中的多条指令,在重写后就变成了一条指令。如下所示:三条 lpush 命令,经过 AOF 重写后生成一条,对于多次修改的场景,缩减效果明显。

区别:

  • RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
  • AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。

优缺点:

RDB优势

1). 采用该方式整个Redis数据库将只包含一个文件。比如,每个小时归档一次最近24小时的数据,同时还要每天归档一次最近30天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。

2). 对于灾难恢复而言,RDB是非常不错的选择。可以将一个单独的文件压缩后再转移到其它存储介质上。

3). 性能最大化。对于Redis的服务进程而言,在开始持久化时,唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。

4). 相比于AOF机制,如果数据集很大,RDB的启动效率会更高。

RDB劣势

1). 不能保证数据的高可用性,即最大限度的避免数据丢失。系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。

2). RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。

AOF的优势

1). 更高的数据安全性,即数据持久性。Redis中提供了3种同步策略,即每秒同步、每修改同步和不同步。每秒同步也是异步完成的,效率非常高,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,可将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。这种方式在效率上是最低的。

2). 该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。

然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,在Redis下一次启动之前,可以通过redis-check-aof工具解决数据一致性的问题。

3). 如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。

4). AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,也可以通过该文件完成数据的重建。

AOF的劣势

1). 对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

2). 根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。

系统牺牲性能,换取更高的缓存一致性(aof)

写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。

相关推荐
岁月变迁呀1 小时前
Redis梳理
数据库·redis·缓存
Code apprenticeship3 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站3 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
装不满的克莱因瓶3 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
黄名富7 小时前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
G_whang8 小时前
centos7下docker 容器实现redis主从同步
redis·docker·容器
.生产的驴8 小时前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven
我叫啥都行11 小时前
计算机基础复习12.22
java·jvm·redis·后端·mysql
阿乾之铭12 小时前
Redis四种模式在Spring Boot框架下的配置
redis
on the way 12314 小时前
Redisson锁简单使用
redis