2022年2月20日星期日

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

原文链接:https://www.chenweiliang.com/cwl-26677.html

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开头注释掉所有配置,持久化也会被禁止,但一般不这么做。





欢迎转载《Redis RDB全称是什么?Redis RDB内存数据持久化操作方式

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


网站地址:https://www.chenweiliang.com/



欲获取更多资讯内幕和秘技,欢迎进入Telegram频道:https://www.chenweiliang.com/go/tgchannel

没有评论:

发表评论