redis提供了RDB和AOF两种持久化存储方案
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb
对于RDB来说,提供了三种机制:save、bgsave、自动化
该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。
执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。
具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。
自动触发是由我们的配置文件来完成的。
命令 | save | bgsave |
---|---|---|
io类型 | 同步 | 异步 |
阻塞 | 阻塞 | 阻塞(fork阶段) |
复杂度 | O(n) | O(n) |
优点 | 不消耗额外内存 | 不阻塞客户端命令 |
缺点 | 阻塞客户端命令 | 需要额外内存fork |
RDB快照是一次全量备份,存储的是内存数据的二进制序列化形式,存储上非常紧凑。当进行快照持久化时,会开启一个子进程专门负责快照持久化,子进程会拥有父进程的内存数据,父进程修改内存子进程不会反应出来,所以在快照持久化期间修改的数据不会被保存,可能丢失数据。
redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录
AOF的方式也同时带来了另一个问题。持久化文件会变的越来越大。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。将内存中的数据以命令的方式保存到临时文件中,同时会fork出一条新进程来将文件重写
重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似
命令 | always | everysec | no |
---|---|---|---|
优点 | 不丢数据 | 每秒一次fsync | 不管数据 |
缺点 | IO开销大,磁盘TPS几百 | 可能丢1秒数据 | 不可控 |
原文:https://www.cnblogs.com/weiweng/p/12590846.html