1、redis持久化之RDB
①、RDB是什么?
在指定的时间间隔内将redis内存中的数据写入磁盘中,它恢复时是将存在磁盘上的快照文件直接读到内存里的;
②、备份是如何进行的?
redis在进行备份的时候会单独创建(Fork)一个子进程来进行持久化,首先会将内存中的数据写入到一个临时文件夹里,待本次持久化过程结束了,会用这个临时文件替换上一次持久化好的文件。在整个持久化过程中,主进程是不进行任何IO的,这就保证 了redis在持久化时不会影响性能;
③、RDB持久化流程:
fork:fork的作用是在当前进程的基础上复制一个一样的进程。当前进程的所有数据数值和原进程一致,但是是一个全新的进程,并作为原进程的子进程;
④、备份文件名称及路径:
1、默认是dump.rdb文件,可以在redis.config配置文件中421行更改:
421 dbfilename dump.rdb
2、dump.rdb文件保存路径默认是在redis启动时的命令所在的目录下,也可修改:
443 # Note that you must specify a directory here, not a file name.
444 dir ./
⑤、触发快照机制的策略,即触发持久化
1、配置文件配置
371 # save 3600 1
372 # save 300 100
373 # save 60 10000
解释:3600 1 是表示在3600秒内有1个key发生变化,就进行持久化;
2、在redis客户端使用save命令或者bgsave命令,这种方式是手动保存;
- 但是这种方式最好使用bgsave命令,因为save命令是只管保存,其他的命令会全部阻塞
- bgsave命令会在redis后台异步操作,不会阻塞;
- 可以通过lastsave 命令获取最后一次成功执行快照的时间
3、flushall命令也会生成rdb文件,但是是空的,没有意义;
⑥、取消或禁用RDB持久化策略:
1、把redis.config配置文件的save命令全部注释,或者将后面全部设空字符串""即可;如下:
371 # save 3600 1
372 # save 300 100
373 save ""
⑦、优劣:
1、rdb持久化策略优势:
- 当进行大规模数据恢复时,且对数据的完整性不是做很高要求时,RDB策略是由于AOF策略的;
- 适合对数据完整性和一致性没有很高要求的场景;
- 节省磁盘空间;
- 恢复速度快;
2、rdb持久化策略劣势:
- fork的时候,内存的数据被copy了一份,大约2陪膨胀性需要考虑;
- 虽然redis在fork时使用了写时复制技术,但是如果数据量过于庞大,还是比较消耗性能;
- 备份周期是隔断时间备份一次,所以在本次备份后,还没到下次备份的时间点时,如果在这个时间段内,redis服务器宕机了,数据是无法备份的;
2、redis持久化策略之AOF
①、aof是什么?
aof是以记录日志的形式的来备份数据,将redis执行过的所有写操作的命令记录下来,且记录的文件只需追加不需更改;待redis重启时,会将该文件的命令全部读取出来,执行一次,达到恢复数据的目的;
②、AOF持久化流程:
- 客户端的写命令,会被append追加到AOF的缓冲区内;
- AOF缓冲区根据AOF的三种持久化策略:always(服务器每写一个命令都会调用fdatasync将缓冲区命令追加到磁盘中)、everysec(每秒钟调用一次fdatasync将缓冲区的命令追加到磁盘中)、no(根据操作系统的调度来调用fdatasync将缓冲区的命令追加到磁盘中),来同步命令到磁盘中;
- 当AOF文件大小超过重写策略或者手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量;
- Redis服务器重启时,会重写加载AOF文件中的写操作来达到恢复数据的目的;
③、如何触发AOF持久化策略及文件名称,在redis配置文件中:**
1230 appendonly yes
1231
1232 # The name of the append only file (default: "appendonly.aof")
1233
1234 appendfilename "appendonly.aof"
④、设置AOF同步策略,在redis配置文件中:
1257 # If unsure, use "everysec".
1258
1259 # appendfsync always
1260 appendfsync everysec
1261 # appendfsync no
⑤、AOF持久化优劣:
1、AOF持久化优势:
- 备份机制更稳健,数据完整性更好;
- 可读的日志文本,通过操作AOF文件,可以处理误操作;
2、AOF持久化劣势:
- 比起RDB占用磁盘空间更多;
- 恢复速度要慢;
- 每次读写都同步的话,性能压力较大;
- 极端情况下,会造成数据恢复失败;
3、两个持久化策略如何选择:
- 官方推荐两个都启用;
- 如果对数据不敏感,可以单独启用RDB;
- 不建议单独使用AOF,因为存在不确定的BUG;
- 如果只做纯内存缓存,可以两个都不用;
- 两个都开启的情况下,redis默认会加载AOF配置文件,因为数据更完整;