一、简介
1、默认情况下redis的所有数据都在内存中进行存取,而将数据异步更新保存到硬盘上的操作就是持久化存储
2、快照:将某时某刻的数据做成一个完整的备份,如mysql的Dump,redis的RDB等
3、日志:任何数据操作都记录日志,要恢复数据,只要按照日志重新执行一遍即可,如mysql的Binlog,redis的AOF等
二、RDB
1、备份:save
①客户端执行save指令,服务端同步创建RDB二进制文件,有可能造成阻塞
②如果已有RDB文件,会替换,即同时最多只有一份RDB文件
2、异步备份:bgsave
①客户端执行bgsave指令,服务端异步创建RDB二进制文件,不会阻塞
②如果已有RDB文件,会替换,即同时最多只有一份RDB文件
3、RDB相关配置
①save 300 10:自动备份配置,若30秒内有至少10条数据更新,自动生成RDB,可以配置多条
②dbfilename "dump.rdb":RDB文件名,默认为dump.rdb
③dir "/opt/soft/redis/data":RDB文件存储目录(跟数据在同一个目录)
④stop-writes-on-bgsave-error yes:如果bgsave出现错误,是否停止写入,默认为yes
⑤rdbcompression yes:RDB文件是否采用压缩格式
⑥rdbchecksum yes:是否对RDB文件进行校验和检验
4、触发生成RDB文件的情景:
①执行save或bgsave
②满足自动备份配置条件
③开启主从复制会自动生成
④关闭redis并备份:shutdown save
⑤debug级别的重启,不会将内存中的数据清空:debug reload
5、RDB的缺点:比较耗时耗性能,不可控,因为备份间隙,可能会丢失数据
三、AOF
1、AOF相关配置
①appendonly yes:是否打开AOF日志记录模式
②appendfilename "bin.aof":AOF文件名
③appendfsync everysec:AOF策略,默认就是everysec
④dir "/opt/soft/redis/data":AOF文件存储目录(跟数据在同一个目录)
⑤no-appendfsync-on-rewrite yes:在AOF重写的时候,是否要做AOF的append操作,因为AOF重写消耗性能与硬盘,此时正常的AOF与重写AOF可能会有硬盘冲突,这段期间的数据,允许丢失
2、AOF策略:日志不是直接写到硬盘上的,而是先放在缓冲区,缓冲区根据一些策略,再写到硬盘上
①always:缓冲区每增加一条日志就刷到硬盘上,不会丢失数据,IO开销大,
②everysec:每秒把缓冲区的日志刷到硬盘上,可能会丢失1秒内的数据
③no:redis:不参照redis的配置,由操作系统决定缓冲区的刷新频率,不可控
3、AOF重写:随着数据操作越来越多,AOF文件会越来越大,可以通过AOF重写来优化
①原理:通过日志的筛除,合并等来实现文件压缩
②执行AOF重写:bgrewriteaof => 服务端会起一个fork进程,完成AOF重写
③auto-aof-rewrite-min-size:触发AOF文件自动重写需要的最小尺寸
④auto-aof-rewrite-percentage:触发AOF文件自动重写需要的文件增长率
⑤查询AOF文件当前尺寸:aof_current_size
⑥查询AOF文件上一次启动或重写的尺寸:aof_base_size
⑦自动触发的条件:aof_current_size > auto-aof-rewrite-min-size 并且 aof_current_size-aof_base_size/aof_base_size > auto-aof-rewrite-percentage => 当前尺寸大于重写需要尺寸,并且增长率大于重写需要增长率
四、RDB与AOF的选择
1、优缺点比较
①启动优先级:AOF先于RDB,redis重启会优先加载AOF
②文件体积:RDB小于AOF
③加载速度:RDB快于AOF
④数据可靠性:RDB可能会丢失备份间隙的数据,AOF受刷新策略影响