redis 持久化
1、为什么要持久化?
因为redis是内存数据库,它将自己的数据存储到内存中,一旦redis服务器退出运行,服务器中的数据就会消失。
为了避免数据丢失,redis提供了持久化机制,将存储在内存中的数据保存到磁盘中,用于在redis服务器退出或者宕机时,快速恢复之前redis存储在内存中的数据。
redis提供了两种持久化的方式:RDB和AOF
2、RDB
RDB可以理解为快照,它是将某个时间点上redis中的数据保存到一个RDB文件中,该文件是一个经过压缩的二进制文件,通过该文件可以还原生产RDB时redis中的数据。
2.1、创建rbd文件
redis提供了两个命令,来创建rbd文件,一个是save,另一个是bgsave。
save命令会阻塞redis服务器进程,知道rbd创建完成。在服务器阻塞期间,redis不能处理任何请求。
bgsave命令会派生出一个子进程,然后由子进程负责创建rbd文件,服务器进程继续处理请求。
2.2、修改配置保存rbd文件
我们可以通过修改redis服务器配置文件,对保存rbd文件的策略进行设置

默认的配置条件表示,只要满足以下3个条件中的任意1个,BGSAVE命令就会被执行:
- 服务器在900s(即15分钟)之内,对数据库进行了至少1次修改
- 服务器在300s(即5分钟)之内,对数据库进行了至少10次修改
- 服务器在60s(即1分钟)之内,对数据库进行了至少10000次修改
2.3、RBD文件的载入
RBD文件是在redis服务器启动时载入的,而且redis服务器是否会载入RBD文件是根据服务器是否启用了AOF持久化功能:
- 只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据。
- 如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据
3、AOF
AOF是通过保存redis服务器所执行的写命令来记录数据库的,默认情况下AOF是关闭的。
3.1、开启AOF
同样是在redis服务器的配置文件中

3.2、AOF持久化的实现
当AOF持久化功能处于开启时,redis服务器执行完成一个写命令后,会将被执行的写命令追加到AOF缓冲区的末尾,然后redis服务器会根据配置中的appendfsync选项的值来决定何时将AOF缓冲区写到AOF文件中。
关于appendfsync选项:
1)always:是最安全的,数据丢失的最少。但是效率最慢,服务器处理每个事件都会去写文件,影响性能
2)everysec:每秒同步一次,即使出现宕机,也最多损失1s的数据
3)no:从安全性来说,no模式下,如果出现故障停机,数据库会丢失上次同步AOF文件之后的所有写命令数据,具有不确定性,因为服务器在每个事件循环都要将AOF缓冲区中的所有内容写入到AOF文件,至于何时对AOF文件进行同步,则由操作系统控制。从效率来说,no模式和everysec模式的效率差不多。
appendfsync默认的是everysec。
3.3、AOF重写
因为AOF文件记录的是服务器写命令,所以随着redis服务器运行时间的增加,AOF文件中的内容会越来越多,文件体积也会越来越大,如果不做控制,会过多的占用磁盘空间,而且通过AOF文件进行数据还原的时间也越来越长。
为了解决AO文件体积越来越大的问题,Redis提供了AOF文件重写功能。redis服务器会创建一个新的AOF文件来替换现有的AOF文件,新旧AOF文件所保存的数据相同,但新AOF文件不会包含任何浪费空间的冗余命令,所以新AOF文件的体积通常会比旧AOF文件的体积要小很多。
redis可以执行bgrewrite进行AOF重写

浙公网安备 33010602011771号