Redis持久化之RDB
一.什么是RDB
RDB持久化就是定期把当前进程Redis内存中所有数据都写入硬盘中,生成一个快照(Redis给内存中当前存储的这些数据赶紧拍张照片,生成一个文件,存储在硬盘中。后期Redis一旦重启,内存中的数据就没有了,就可以根据刚才的快照,将之前的数据给恢复过来,再恢复到内存中)
二.触发方式
1.手动触发
程序员通过redis客户端执行特定的命令来触发快找到生成
save
执行save后,redis就会全力以赴的进行快照的生成操作,此时就会阻塞redis其他客户端的命令,导致类似于keys*的后果
bgsave
bg即background,也就是后台,不会影响redis服务器处理其他客户端的请求和命令。那Redis是搞了个多线程吗?不是的。记住,Redis一定是单线程的。此处Redis是使用多进程的方式来完成并发编程的场景的,来实现bgsave。
bgsave命令的运行流程
1.向父进程发送bgsave命令,Redis父进程去判断现在是否存在正在执行的持久化进程,比如RDB/AOF进程,如果有就直接返回
2.父进程执行fork命令创建子进程。fork命令会阻塞父进程。通过info stats命令查看latest_fork_usec选项,就可以获得最近一次的fork用时,单位为微秒。
3.父进程fork完毕之后,bgsave命令返回“Background saving started”信息并不再阻塞父进程。可以继续响应其他命令。
4.子进程创建RDB文件,根据父进程内存生成临时快照文件
5.子进程发送信号给父进程,父进程更新统计信息
save和bgsave的区别
1.save是同步操作,执行期间不能执行任何redis命令,无法处理任何客户端请求
2.bgsave是异步操作,通过fork子进程进行持久化,主进程继续处理请求(仅在fork期间短暂阻塞)
3.save是由主进程直接写入硬盘(即RDB文件)
4.bgsave则是由子进程将数据写入RDB文件,完成后退出
示例如下:
我们先找到RDB文件在哪里。可以查看redis配置文件(在etc/redis中)redis.conf,里面有如下配置项
dbfilename是dump.rdb,也就是说,存放内存快照的文件名称为dump.rdb
dir就是说,dump.rdb这个文件放在/var/lib/redis下面。如下:
我们可以看一下当前文件中有什么:
然后打开redis进行一些操作之后再打开rdb文件(在另一个客户端中打开文件,原来的哪个redis客户端不要关(关了就会自动触发bgsave):
但好像没什么变化。
现在手动触发bgsave:
在另一个窗口再去查看rdb文件
这回有所改变。这就是手动触发
2.自动触发
在Redis的配置文件中设置一下,让Redis每隔多长时间或没产生多少次修改就自动触发快照的生成。
redis的配置文件就放在/etc/redis目录下,叫做redis.conf
在配置文件中有一个关于保存频率的配置项,如下
表示,15分钟内有一次修改或者5分钟内有10次修改或者1分钟内有10000次修改的话就会自动触发RDB。
三.dump.rdb文件
dump.rdb文件是一个二进制的文件,它将内存中的数据以压缩的形式(压缩消耗一定的cpu资源),保存在这个二进制文件中
redis服务器默认开启rdb机制。
后续redis服务器重新启动,就会尝试加载这个文件,如果发现格式错误,就可能加载数据失败。
当执行生成rdb镜像的操作时,就会把要生成的快照数据,先保存在一个临时文件中,当这个快照生成完毕后,再删除之前的rdb文件,把新生成的临时的rdb文件名改成dump.rdb。所以自始至终,rdb文件就只有一个。