1 个解决方案
持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。 Redis 提供了两种持久化方式:RDB(默认) 和 AOF。
第一种:RDB(默认)
rdb 是 Redis DataBase 缩写,RDB 功能核心函数 rdbSave(生成 RDB 文件) 和 rdbLoad(从文件加载到内存)两个函数。
rdbSave 函数:
将内存中的数据库数据以 RDB 格式保存到磁盘(文件)中,文件存在, 那么新的 RDB 文件将替换已有的 RDB 文件。在保存 RDB 文件期间, 主进程会被阻塞, 直到保存完成为止。
SAVE 和 BGSAVE 两个命令是操作 rdbSave 函数的区别:
-
SAVE 直接调用 rdbSave ,阻塞 Redis 主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。
-
BGSAVE 则 fork 出一个子进程,子进程负责调用 rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成。因为 rdbSave 在子进程被调用,所以 Redis 服务器在 BGSAVE 执行期间仍然可以继续处理客户端的请求。
总结:实际上就是同步和异步的两种方式。
rdbLoad 函数:
它是 redis 服务重启或者启动的时候回加载保存到磁盘的 RDB 文件并加载到内存中,期间会被阻塞。
一个 RDB 文件可以分为以下几个部分:
+-------+-------------+-----------+-----------------+-----+-----------+
| REDIS | RDB-VERSION | SELECT-DB | KEY-VALUE-PAIRS | EOF | CHECK-SUM |
+-------+-------------+-----------+-----------------+-----+-----------+
|<-------- DB-DATA ---------->|
具体参见文档:http://redisbook.readthedocs.io/en/latest/internal/rdb.html#id4
rdb 保存策略, 可在 redis.conf 中配置:
save 900 1
save 300 10 # 300 秒内容如超过 10 个 key 被修改,则发起快照保存
save 60 10000
第二种:AOF
Aof 是 Append-only file 缩写:
每当执行服务器 (定时) 任务或者函数时 flushAppendOnlyFile 函数都会被调用, 这个函数执行以下两个工作:
1.aof 写入
WRITE:根据条件,将 aof_buf 中的缓存写入到 AOF 文件.
2.aof 保存
SAVE:根据条件,调用 fsync 或 fdatasync 函数,将 AOF 文件保存到磁盘中。
两个步骤都需要根据一定的条件来执行,Redis 提供了三种条件.
保存策略:
模式 | WRITE 是否阻塞 | SAVE 是否阻塞 | 停机时丢失的数据量 |
---|---|---|---|
AOF_FSYNC_NO 不保存 | 阻塞 | 阻塞 | 操作系统最后一次对 AOF 文件触发 SAVE 操作之后的数据 |
AOF_FSYNC_EVERYSEC 每一秒钟保存一次 | 阻塞 | 不阻塞 | 一般情况下不超过 2 秒钟的数据 |
AOF_FSYNC_ALWAYS 每执行一个命令保存一次 | 阻塞 | 阻塞 | 最多只丢失一个命令的数据 |
存储结构:通过内容是 redis 通讯协议 (RESP ) 格式的命令文本来存储。
总结:
-
1.RDB 存储数据 ,而 AOF 存储数据和命令;
-
2.AOF 更新频率较 RDB 高,当 rdb 和 aof 同时存在时,优先加载 aof。
-
3.aof 加载的时候没有 RDB(数据文件要小) 快.