Redis RDB全称是什么?Redis RDB内存数据持久化操作方式

RDB的全称是Redis database

  • 顾名思义,RDB就是用来存储数据的Redis数据库.
  • 所以,通过RDB持久化,就是将存储在Redis内存中的数据写入RDB文件,保存到磁盘中,实现持久化。
  • Redis 的特点是可以持久化数据,就是将内存中的数据写入磁盘,确保不会丢失数据,也可以将数据从磁盘加载到内存中。

Redis RDB全称是什么?Redis RDB内存数据持久化操作方式

Redis在开始的操作都是基于内存的,所以性能很高,但是一旦程序关闭,数据就丢失了。

因此,我们需要在指定的时间间隔内将内存数据写入磁盘,也就是行话中的 Snapshot 快照。

恢复时,快照文件直接写入内存。

这也是 Redis 和 Memcached 的主要区别之一,因为 Memcached 没有持久化能力。

对于Redis内存数据的持久化,Redis 为我们提供了以下方法:

  • 快照方法(RDB,Redis DataBase):将内存数据在某一时刻以二进制形式写入磁盘;
  • 仅追加文件(AOF,Append Only File),记录所有操作命令,并以文本形式追加到文件中;
  • 混合持久化,Redis 4.0之后的新方法,混合持久化它结合了RDB和AOF的优点。写入时,先将当前数据以RDB的形式写入文件的开头,然后将后续的操作命令以AOF的形式保存到文件中,这样既可以确保Redis重启时的速度,又可以降低数据丢失的风险。

因为每个持久化方案都有特定的使用场景。

Redis RDB内存数据持久化操作方式

  • RDB(Redis DataBase)是将某个时刻的内存快照(Snapshot)以二进制形式写入磁盘的过程。
  • 内存快照就是我们上面说的。 它是指内存中数据在某一时刻的状态记录。
  • 这类似于拍照,当你给朋友拍照时,一张照片可以瞬间记录下朋友的所有形象。
  • 触发RDB有两种方式:一种是手动触发,另一种是自动触发。

手动触发RDB

手动触发持久化有两种操作:savebgsave

它们的主要区别在于是否阻塞Redis主线程的执行。

1、save命令

在客户端执行save命令,会触发Redis的持久化,但也会使Redis处于阻塞状态,直到RDB持久化后才会响应其他客户端发送的命令,因此在生产环境中必须谨慎使用。

127.0.0.1:6379> save
OK
127.0.0.1:6379>

save 执行命令的过程如图 

2、bgsave 命令

  • bgsave(background save)是后台保存。
  • 它和save命令最大的不同就是bgsave会fork一个子进程来执行持久化。
  • 整个过程只有在子进程是fork的时候。才有短暂的阻塞。
  • 当子进程创建后,Redis 的主进程就可以响应其他客户端的请求。

与阻塞整个进程的save命令相比,bgsave命令显然更适合我们使用。

127.0.0.1:6379> bgsave
Background Saving started # 提示开始后台保存 
127.0.0.1:6379>

自动触发RDB

说完手动触发,再来看看自动触发。 我们可以在配置文件中配置自动触发的条件。

1、save m n

  • save m n 表示在m秒内,如果n个key发生变化,则自动触发持久化。 参数 m 和 n 可以在 Redis 配置文件中找到。
  • 例如save 60 1表示在60秒内,只要有一个key发生变化,就会触发RDB持久化。
  • 自动触发持久化的本质是,如果满足设置的触发条件,Redis 会自动执行一次 bgsave 命令。

注意:当设置了多个save m n 命令时,任何一个条件都会触发持久化。

例如,我们设置下面两个save m n命令:

save 60 10
save 600 20
  • Redis键值在60s内变化10次时,会触发持久化;
  • 如果Redis的key在60s内变化,如果value变化的次数小于10次,那么Redis会判断Redis的key值在600s内是否至少修改了20次,如果是,则触发持久化。

2、flushall

  • flushall 命令用于清除 Redis 数据库。
  • 在生产环境中必须谨慎使用。
  • 当 Redis 执行 flushall 命令时,会触发自动持久化并清除 RDB 文件。

3、主从同步触发

Redis主从复制中,当从节点进行全量复制操作时,主节点会执行bgsave命令,将RDB文件发送给从节点,此过程自动触发 Redis 持久化。

Redis 可以通过命令查询当前的配置参数。

查询命令的格式为:config get xxx

例如,如果要获取 RDB 文件的存储名称设置,可以使用 config get dbfilename

执行效果如下:

127.0.0.1:6379> config get dbfilename
1) "dbfilename"
2) "dump.rdb"

由于Redis服务器在加载RDB文件时会阻塞,直到加载完成,可能会造成很长时间,网站无法访问。

若想手动删除Redis的RDB 缓存文件dump.rdb,可以使用以下命令,查找dump.rdb文件储存路径 ▼

find / -name dump.rdb
  • 然后,通过SSH手动删除dump.rdb缓存文件。

Redis设置RDB的配置

关于设置RDB的配置, 你可以使用以下两种方式:

  1. 手动修改Redis配置文件
  2. 使用命令行设置,config set dir "/usr/data"是修改RDB文件的存储命令

注意:redis.conf中的配置可以通过config get xxx获取,通过config set xxx value修改,而手动修改Redis配置文件的方法全局有效,即重启Redis服务器设置的参数不会丢失,而是使用命令修改那样,Redis 重启后就会丢失。

但是如果要手动修改Redis配置文件立即生效,需要重启Redis服务器,命令方式不需要重启Redis服务器。

RDB文件恢复

Redis服务器启动时,如果Redis根目录下存在RDB文件dump.rdb,Redis会自动加载RDB文件恢复持久化数据。

如果根目录下没有dump.rdb文件,请先将dump.rdb文件移动到Redis的根目录下。

当然,Redis启动时有日志信息,会显示RDB文件是否加载。

Redis服务器在加载RDB文件时会阻塞,直到加载完成。

现在我们知道RDB持久化分为手动触发和自动触发两种方式:

  1. 它的优点是存储文件小,启动Redis时数据恢复速度更快。
  2. 缺点是存在数据丢失的风险。

RDB文件的恢复也很简单,只需将RDB文件放在Redis的根目录下,Redis启动时就会自动加载和恢复数据。

RDB优缺点

1) RDB优点

RDB内容为二进制数据,占用内存少,更紧凑,更适合作为备份文件;

RDB对于灾难恢复非常有用,它是一个压缩文件,可以更快地传输到远程服务器,用于Redis服务恢复;

RDB可以大大提高Redis的运行速度,因为Redis主进程会Fork一个子进程来持久化数据到磁盘。

Redis主进程不进行磁盘I/O等操作;

与AOF 格式文件相比,RDB 文件的重启速度更快。

2) RDB的缺点

因为RDB只能保存一定时间间隔的数据,如果中间意外终止Redis服务,会丢失一段时间的Redis数据;

RDB需要频繁fork才能使用子入口将其保存在磁盘上的过程。

如果数据集很大,fork 可能会很耗时,如果数据集很大,CPU 性能很差,可能会导致 Redis 无法为客户端服务几毫秒甚至一秒。

当然,我们也可以禁用持久化来提高 Redis 的执行效率。

如果你对数据丢失不敏感,可以在客户端连接时通过执行 config set save "" 命令禁用 Redis 的持久化。

redis.conf中,如果在save开头注释掉所有配置,持久化也会被禁止,但一般不这么做。

希望陈沩亮博客( https://www.chenweiliang.com/ ) 分享的《Redis RDB全称是什么?Redis RDB内存数据持久化操作方式》,对您有帮助。

欢迎分享本文链接:https://www.chenweiliang.com/cwl-26677.html

欢迎加入陈沩亮博客的 Telegram 频道,获取最新更新!

喜欢就分享和按赞!
您的分享和按赞,是我们持续的动力!