原文链接:https://www.chenweiliang.com/cwl-26677.html
RDB的全称是Redis database
。
- 顾名思义,RDB就是用来存储数据的Redis数据库.
- 所以,通过RDB持久化,就是将存储在Redis内存中的数据写入RDB文件,保存到磁盘中,实现持久化。
- Redis 的特点是可以持久化数据,就是将内存中的数据写入磁盘,确保不会丢失数据,也可以将数据从磁盘加载到内存中。
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
手动触发持久化有两种操作:save
和bgsave
。
它们的主要区别在于是否阻塞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的配置, 你可以使用以下两种方式:
- 手动修改Redis配置文件
- 使用命令行设置,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持久化分为手动触发和自动触发两种方式:
- 它的优点是存储文件小,启动Redis时数据恢复速度更快。
- 缺点是存在数据丢失的风险。
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