Redis快照持久化

本文将简单介绍 Redis 快照持久化概念,如何进行持久化配置,快照持久化操作流程。

Redis 持久化有两种方式,。在项目中我们可以根据实际情况选择合适的持久化方式,也可以不用持久化,这关键看 Redis 在项目中扮演了什么样的角色。接下来本文将介绍 Redis 的第一种持久化方式:快照持久化

快照持久化

快照持久化,顾名思义,就是通过拍摄快照的方式实现数据的持久化,Redis 可以在某个时间点上对内存中的数据创建一个副本文件,副本文件中的数据在 Redis 重启时会被自动加载,我们也可以将副本文件拷贝到其他地方一样可以使用。

该持久化默认开启,一次性把 Redis 中全部的数据保存一份副本在硬盘中,如果数据量非常大(10-20G)就不适合频繁该持久化操作。

如何配置快照持久化

Redis 中的快照持久化默认是开启的,redis.conf 中相关配置主要有如下几项:

#   save ""
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./

上面配置中的三个 save 配置了 Redis 快照持久化的频率。含义分别如下:

  • save 900 1:表示 900 秒内至少一个键被更改则进行快照;

  • save 300 10:表示 300 秒内至少 10 个键被更改则进行快照;

  • save 60 10000:60 秒内至少 10000 个键被更改则进行快照

  • stop-writes-on-bgsave-error:表示在快照创建出错后,是否继续执行写命令;默认为 yes,继续执行写命令;

  • rdbcompression:则表示是否对快照文件进行压缩;默认为 yes,对快照文件进行压缩;

  • dbfilename:表示生成的快照文件的名字,默认为 dump.rdb;

  • dir:则表示生成的快照文件的位置,默认为当前目录;

在 Redis 中,快照持久化默认就是开启的。我们可以通过如下步骤验证快照持久化的效果:

(1)进入 Redis 安装目录,如果有 dump.rdb 文件,先将之删除。如下:

Redis快照持久化

(2)启动 Redis,随便向 Redis 中存储几个数据,然后关闭 Redis 并退出。命令如下:

Redis快照持久化

(3)关闭 Redis 后,进入 Redis 安装主目录,你会发现刚刚删掉的 dump.rdb 文件又回来了,这就是生成的备份文件。

(4)再次启动 Redis 并进入,发现刚刚存储的数据都还在,这是因为 Redis 在启动时加载了 dump.rdb 中的数据。

(5)再次将 Redis 目录下的 dump.rdb 备份文件删除。

(6)重复步骤(4)启动 Redis并进入到控制台,所有的数据都不存在了。

快照持久化操作流程

疑问:Redis 快照持久化到底是怎么运行的?持久化的时机是什么?

执行 save 命令

我们可以手动向 Redis 发送一条命令来创建一个快照,save 是一个阻塞命令;Redis 在接收到 save 命令之后,开始执行备份操作之后,在备份操作执行完毕之前,将不再处理其他请求,其他请求将被挂起。

save 命令执行如下:

Redis快照持久化

执行 bgsave 命令

除了 save 命令,我们还可以发送一条命令来创建一个快照,不同于 save 命令,bgsave 命令会 fork 一个子进程,然后这个子进程负责执行将快照写入硬盘,而父进程则继续处理客户端发来的请求,这样就不会导致客户端命令阻塞了。bgsave 命令执行如下:

Redis快照持久化

Redis 自动触发

如果我们在 redis.conf 中配置了如下选项:

save 900 1
save 300 10
save 60 10000

那么当条件满足时,比如 900 秒内有一个 key 被操作了,那么 Redis 就会自动触发 bgsava 命令进行备份。我们可以根据实际需求在 redis.conf 中配置多个这种触发规则。

执行 shutdown 命令

当我们用 shutdown 命令关闭 Redis 时,此时也会执行一个 save 命令进行备份操作,并在备份操作完成后将服务器关闭。

主从备份

有一种特殊情况也会触发 bgsave 命令,就是在主从备份的时候。当从机连接上主机后,会发送一条 sync 命令来开始一次复制操作,此时主机会开始一次 bgsave 操作,并在 bgsave 操作结束后向从机发送快照数据实现数据同步。

快照持久化的缺点

快照持久化有一些缺点,比如 save 命令会发生阻塞,bgsave 虽然不会发生阻塞,但是 fork 一个子进程又要耗费资源,在一些极端情况下,fork 子进程的时间甚至超过数据备份的时间。定期的持久化也会让我们存在数据丢失的风险。

天下之事常成于困约,而败于奢靡。——陆游
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号