Redis 笔记(14) 您所在的位置:网站首页 redis数据持久化有哪几种方式呢 Redis 笔记(14)

Redis 笔记(14)

2024-07-04 07:04| 来源: 网络整理| 查看: 265

1. 持久化

所谓持久化是指将数据从内存中以某种形式同步到硬盘中,在 Redis 重启后能够根据硬盘中的记录恢复数据。Redis 持久化有两种方式,分别为 RDB(redis data base) 【快照】方式 和 AOF(append only file ) 【日志】方式。

Redis 的持久化机制有两种,分别为:

快照 RDB,快照是一次全量备份,是内存数据的二进制序列化形式,在存储上非常紧凑;日志 AOF,日志是连续的增量备份,日志记录的是内存数据修改的指令记录文本;

AOF 日志在长期的运行过程中会变的无比庞大,数据库重启时需要加载 AOF 日志进行指令重放,这个时间就会无比漫长。所以需要定期进行 AOF 重写,给 AOF 日志进行瘦身。

两者区别:

RDB 持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是 fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。

AOF 持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。

2. RDB 2.1 RDB 【快照】方式

RDB 持久化是 Redis 的默认支持,无需进行配置。RDB 是指在指定的时间间隔内将内存中的数据集快照写入磁盘。当符合一定规则时,Redis 自动将内存中的所有数据生成一份副本并存储到硬盘上。分为以下四种情况:

根据配置规则自动进行快照

SAVE 900 1 SAVE 300 10 SAVE 60 1000

SAVE 900 1 表示 900s 内有一个或一个以上的键被更改则进行快照配置文件中。

用户执行 SAVE 或 BGSAVE 命令

(1) SAVE 命令

Redis 会同步的进行快照操作,在快照执行过程中会阻塞所有来自客户端请求。

(2) BGSAVE 命令

Redis 会在后台异步地进行快照操作,在快照执行过程服务端可以继续响应来自客户端的请求。具体操作是 Redis 进程执行 fork 操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结束。阻塞只发生在 fork 阶段,一般时间很短。建议使用。

执行 FLUSHALL 命令

只要快照配置条件不为空,执行该命令时就会执行一次快照操作;而当没有定义快照条件时,即使执行该命令也不会执行快照操作。

执行复制 replication

即使没有定义自动快照条件,且没有手动执行过快照操作,进行复制操作时也会进行自动快照。

2.2 RDB 【快照】原理

Redis 在 RDB 持久化时会调用 glibc 的函数 fork 产生一个子进程,快照持久化完全交给子进程来处理,父进程继续处理客户端请求。子进程刚刚产生时,它和父进程共享内存里面的代码段和数据段。这是 Linux 操作系统的机制,为了节约内存资源,所以尽可能让它们共享起来。在进程分离的一瞬间,内存的增长几乎没有明显变化。

用 Python 语言描述进程分离的逻辑如下。fork 函数会在父子进程同时返回,在父进程里返回子进程的 pid,在子进程里返回零。如果操作系统内存资源不足,pid 就会是负数,表示 fork 失败。

pid = os.fork() if pid > 0: handle_client_requests() # 父进程继续处理客户端请求 if pid == 0: handle_snapshot_write() # 子进程处理快照写磁盘 if pid


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有