好文章:
https://juejin.im/post/5d24a1b4f265da1baf7d126e
https://juejin.im/post/5d776dcef265da03b574744d
一:有哪两种方式
持久化就是redis把数据落到磁盘。持久化方式有RDB、AOF。
二:RDB
1. RDB是通过快照持久化的
2. 数据完整性
注意噢,redis是把数据全部都放在了内存里。所以生成快照就不存在数据不完整一说了。
3. 触发快照的时间
- 执行save、bgsave命令。
- 配置文件设置save <seconds> <changes>规则,自动间隔性执行bgsave命令
- 主从复制时,从库全量复制同步主库数据,主库会执行bgsave
- 执行flushall命令清空服务器数据
- 执行shutdown命令关闭Redis时,会执行save命令
4.save和bgsave的区别
- 使用save命令会阻塞Redis服务器进程,服务器进程在RDB文件创建完成之前是不能处理任何的命令请求
- 而使用bgsave命令不同的是,basave命令会fork一个子进程,然后该子进程会负责创建RDB文件,而服务器进程会继续处理命令请求
5. 怎样设置bgsave自动执行
- 打开配置文件
- 添加save 900 1,就表示在900s内,如果有1个key发生变化,就会自动触发bgsave命令创建快照
三:AOF持久化
AOF持久化会把被执行的写命令写到AOF文件的末尾,记录数据的变化。默认情况下,Redis是没有开启AOF持久化的,开启后,每执行一条更改Redis数据的命令,都会把该命令追加到AOF文件中,这是会降低Redis的性能,但大部分情况下这个影响是能够接受的,另外使用较快的硬盘可以提高AOF的性能。
通过配置redis.conf文件开启AOF持久化,自己搜一搜。
四:对比(下面的是别的文章的总结)
1. RDB
优点:
RDB快照是一个压缩过的非常紧凑的文件,保存着某个时间点的数据集,适合做数据的备份,灾难恢复
可以最大化Redis的性能,在保存RDB文件,服务器进程只需fork一个子进程来完成RDB文件的创建,父进程不需要做IO操作
与AOF相比,恢复大数据集的时候会更快
缺点:
RDB的数据安全性是不如AOF的,保存整个数据集的过程是比繁重的,根据配置可能要几分钟才快照一次,如果服务器宕机,那么就可能丢失几分钟的数据
Redis数据集较大时,fork的子进程要完成快照会比较耗CPU、耗时
2. AOF
优点:
数据更完整,安全性更高,秒级数据丢失(取决fsync策略,如果是everysec,最多丢失1秒的数据)
AOF文件是一个只进行追加的日志文件,且写入操作是以Redis协议的格式保存的,内容是可读的,适合误删紧急恢复
缺点:
对于相同的数据集,AOF文件的体积要大于RDB文件,数据恢复也会比较慢
根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB。 不过在一般情况下, 每秒 fsync 的性能依然非常高
3. 如何选择RDB和AOF
- 如果是数据不那么敏感,且可以从其他地方重新生成补回的,那么可以关闭持久化
- 如果是数据比较重要,不想再从其他地方获取,且可以承受数分钟的数据丢失,比如缓存等,那么可以只使用RDB
- 如果是用做内存数据库,要使用Redis的持久化,建议是RDB和AOF都开启,或者定期执行bgsave做快照备份,RDB方式更适合做数据的备份,AOF可以保证数据的不丢失