说一说 redis 持久化?

说一说 redis 持久化?

1 个解决方案

AllenJiang
中间件研发,关注微信公众号 : 小哈学Java, 回复"666", 即可免费领取10G学习&面试资料

持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。 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(数据文件要小) 快.