因为Redis的读写操作都是在内存中进行的,一旦服务重启数据就会丢失,为了不让数据丢失,将内存中的数据保存到磁盘中,在服务器重启时从磁盘中恢复数据,就是Redis的持久化。
Redis的持久化分三种方式:
- 快照方式(RDB):将某一时刻的内存快照以二进制方式写入RDB文件中
- 文件追加方式(AOF):记录数据库的操作命令,以文本形式追加到AOF文件中
- 混合方式:先以RDB方式将数据写入文件头,后续操作则以AOF的形式追加在文件中
- RDB方式:
RDB有手动触发和自动触发两种方式
- 手动触发:
save命令:该命令会使Redis处于阻塞状态,此时无法响应其他客户端的命令直至持久化完成
bgsave命令:该命令会创建一个子进程在后台进行RDB持久化,不会阻塞其他客户端的命名- 自动触发:
1.在配置文件中配置save m n,表示m秒内n个键发生变化则自动触发持久化,配置了多条save那么满足任意一条都会自动触发持久化
当配置了主从赋值时,如果从数据库执行全量复制会触发主数据库执行bgsave生成RDB文件,然后主数据库将该文件发送给从数据库RDB的优点:
- 占用内存小
- 因其是一个紧凑的文件,便于快速传输到远程服务器进行Redis数据恢复,适合灾难恢复
- 启动加载速度快
RDB的缺点:
因为RDB是以时间间隔保存数据,因此可能造成某个时间段数据丢失
- AOF方式:
默认情况下AOF是关闭的,如需开启,在配置文件中将appendonly no改为yes
触发方式:
- 自动触发:
当满足策略条件时就会自动触发AOF持久化,策略有三种,appendfsync always表示将每条操作都写入AOF文件;appendfsync everysec表示每秒写入一次;appendfsync no表示不设置策略,由操作系统决定写入磁盘;
如果满足AOF重写触发条,也会自动触发持久化;由于AOF是追加Redis命令,随着时间越长,文件就会越来越大,这会造成Redis启动速度慢,占用过多存储空间,因此Redis提供了AOF重写功能,即读取当前Redis状态重新写入AOF文件;触发AOF重写需要满足两个条件:达到AOF 重写的最小文件容量(auto-aof-rewrite-min-size),达到AOF 文件重写的大小比例(auto-aof-rewrite-percentage)- 手动触发:
执行bgrewriteaof命令如果只开启了RDB,Redis启动时只加载RDB文件;如果开启了AOF,无论是否开启RDB,都只加载AOF文件,即使没有AOF文件也不会加载RDB文件
如果正在写入AOF文件时服务器出错,导致最后一条命令被截断,这就是异常的AOF,该情况需要在配置文件中设置aof-load-truncated为 yes,服务器重启加载AOF文件会忽略最后一条命令;
如果AOF的中间命令也被破坏,在客户端输入redis-check-aof命令,会显示出错的那行,可以尝试手动修复;也可以用redis-check-aof --fix命令自动修复,但有丢书从被破坏出到文件尾部全部数据的风险;AOF优点:
- 保存数据更加完整,只丢失一条命令或一秒的数据
- 不会出现文件损坏,即便以为退出导致文件中的命令被破坏也能通过修复工具修复
- 即便使用了flushall删除所有数据,也可以通过删除AOF文件中的最后一条flushall命令将数据恢复
AOF缺点:
- AOF文件占用空间大
- 性能低于RDB