开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情
本文主要将redis中的两种持久化方式。
RDB和AOF持久化
Redis是内存数据库,持久化的意思是将内存中的数据保存到磁盘,这样就避免了服务器进程退出,服务器中的数据库状态消失的情况。那在Redis中就有两种持久化的方式:RDB和AOF。
RDB持久化
RDB指的是在指定的时间间隔将内存中的数据集快照写入磁盘(Snapshot快照),恢复时将快照文件直接读到内存。这种持久化所保存的文件后缀是rdb。
- Redis会fork一个子进程来进行持久化,先将数据写到一个临时文件,待持久化过程都结束,再用这个临时文件来替换上次持久化好的文件。整个过程中不进行任何IO操作,这就确保了极高的性能。
FORK:相当于时复制一个与当前进程一样的进程,类似于git操作。
针对RDB持久化配置主要需要了解的是触发条件的配置与修改。
- 这段表示在900s内1个key值发生改变就会触发RDB持久化。
save 900 1
禁用RDB持久化策略的方法:不设置任何save命令,或给save传入空字符串参数。
- save命令触发RDB持久化,只管保存,会阻塞。
- bgsave命令:redis会在后台异步进行持久化操作。
- 退出(shutdown或执行flushall命令)都会产生rdb文件。
AOF持久化
下面这部分讲的是AOF持久化操作。
AOF以日志的形式来记录每个写操作,将Redis执行过的所有指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。保存的文件是aof后缀的文件。
Redis默认是RDB持久化方式,要开启AOF方式需要关闭RDB方式,直接将appendonly设置为yes即可,可以通过appendfilename+文件名.aof来配置。具体aof持久化如何配置在前面说redis.conf配置文件的时候说过了。
AOF文件修复操作:reds-check-aof --fix append only.aof。
另外,aof新增了重写机制。当aof文件大小过大,超过了设定阈值就会启动aof文件内容压缩(只保留可恢复数据的最小指令集)。
重写原理与触发机制:
AOF 文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,这点和快照有点类似!
Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的已被且文件大于64M的触发。