redis持久化
RDB
- 过程:
- redis使用fork函数复制一份当前进程(父进程)的副本(子进程)
- 父进程继续接受并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件
- 当子进程写完所有数据后会用该临时文件替换旧的RDB文件,至此一次快照操作完成
在执行fork的时候操作系统会使用写时复制策略,即fork函数发生的一刻父子进程共享同一内存区域,当父进程要更改其中某片数据时(如执行一个写命令),操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的RDB文件存储的是执行fork一刻的内存数据。
redis在进行快照过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的。RDB文件是经过压缩的二进制文件,所以占用的空间会小于内存中的大小,更加利于传输。
通过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。
AOF
开启AOF持久化后每执行一条会更改Redis中数据的命令,Redis就会将该命令写入硬盘中的AOF文件。
当redis对一个数据进行多次修改,产生了多条执行指令,每次都记录下来,会产生冗余,所以每当达到一定条件时Redis就会自动重写AOF文件,这个条件可以在配置文件中配置:
auto-aof-rewrite-percentage 100
auto-aof-rewarite-min-size 64mb
在启动Redis会逐个执行AOF文件中的命令来将硬盘中的数据载入到内存中,载入的速度相较RDB会慢一些。
虽然每次执行更改数据库内容的操作时,AOF都会将命令记录在AOF文件中,但是事实上,由于操作系统的缓存机制,数据并没有真正地写入硬盘,而是进入了系统的硬盘缓存。在默认情况下系统每30秒会执行一次同步操作,以便将硬盘缓存中的内容真正地写入硬盘,在这30秒的过程中如果系统异常退出则会导致硬盘缓存中的数据丢失。一般来讲启用AOF持久化的应用都无法容忍这样的损失,这就需要Redis在写入AOF文件后主动要求系统将缓存内容同步到硬盘中。在Redis中我们可以通过appendfsync参数设置同步的时机:
appendfsync always
appendfsync everysec
appendfsync no
默认情况下Redis采用everysec规则,即每秒执行一次同步操作。always表示每次执行写入都会执行同步,这是最安全也是最慢的方式。no表示不主动进行同步操作,而是完全由操作系统来做(即每30秒一次),这是最快但最不安全的方式。一般情况下使用默认值everysec就足够了,既兼顾了性能又保证了安全。
标签:AOF,持久,文件,redis,Redis,RDB,硬盘 From: https://www.cnblogs.com/zpf253/p/17621732.html