RDB
将当前内存数据生成快照文件。
AOF
实时将写命令存入AOF文件。
如何用
RDB如何用?
默认情况下Redis是采用了RDB的方式来持久化数据,持久化文件存储路径通过配置属性dir。RDB分为手动触发和自动触发。
- 手动触发
通过执行save和bgsave命令执行。save命令执行过程会造成客户端阻塞,而bgsave会fork出一个子进程进行RDB的操作,不会造成客户端阻塞。如果执行shutdown命令默认也会执行bgsave命令。
- 自动触发:
通过配置 save m n, 它表示在 m 秒内数据集存在n修改会自动触发bgsave
AOF 如何用?
默认情况下Redis对AOF是关闭的,需要通过配置 appendonly yes 进行开启。AOF的方式通过缓冲区同步文件的策略来持久化数据,需要通过配置appendfsync 属性控制,不同值的含义如下:
- always
命令写入缓冲区后,调用系统fsync操作同步到AOF文件中。
- everysec
命令写入缓冲区后,调用系统write操作,write操作完成后 ,fsync同步文件操作,由专门线程每秒操作一次
- no
命令写入缓冲区后,调用系统write操作,write操作完成后。同步操作由操作系统负责,通常同步周期最长30秒
注意:如果两种持久化的方式都开启,那么会优先采用AOF。
RDB和AOF原理窥探
RDB
由于save命令会造成客户端阻塞问题,一般主流都会采用bgsave命令。bgsave命令执行的工作流程如图1-1:
(1). 接收到bgsave命令后,Redis父进程判断是否存在fork子进程。如果存在直接返回。
(2). 不存在,fork出子进程持久化当前内存的数据至RDB文件。父进程fork子进程的这一时间段,对其他客户端传入的命令是阻塞的。
(3). 执行完毕,通知父进程,记录相应的统计信息。
AOF
AOF的工作流程如图1-2
(1). 父进程接受写命令将命令放入缓冲区。
(2). 根据appendfsync配置的策略,将缓冲区的命令写入AOF文件。
(3). 根据重写的配置策略,判断是否触发重写。
AOF通过缓冲区aof_buf来提高了日志记录的性能,如果不通过缓冲区,那么性能瓶颈将会限制于写入磁盘时的速率。
随着写命令的不断写入,AOF文件会逐渐膨胀,文件中可能会存在一些废弃无用的命令(如:set k1 v1 ,del k1 v1, set k2 v2 , del k2 v2。内存中并没有k1和k2的值,但AOF文件中存入这些命令是没有意义的),导致后面恢复数据时执行无效命令浪费时间,所以AOF提供了重写的机制,根据内存中现有数据生成新的AOF文件。重写机制分为手动触发和自动触发
- 手动触发
直接调用bgrewriteaof命令
- 自动触发
通过配置auto-aof-rewrite-min-size 和 auto-aof-rewirte-percentage参数确定触发时机。
两者比较
RDB不能实时保证数据的准确性,在Redis不同版本上的迁移存在不可预期的问题,但恢复数据速度快。AOF能保证实时的数据准确性,恢复数据相对较慢。所以现在主流的持久化方式都是采用AOF。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.