Redis中的rdb快照持久化

今天来学习redis中的持久化操作,这是redis缓存一大优势。

rdb的工作原理

每隔 N分钟 或 N次写 操作后, 从内存dump数据形成rdb文件 , 压缩 放在 备份目录

注: 红色部分可通过参数来配置。

rdb的配置文件

打开redis.conf文件。



接下来详细说明:

save 900 1    #刷新快照到硬盘中,必须满足两者要求才会触发,即900秒之内至少有1个key发生变化。
save 300 10   #必须是300秒之内至少有10个key发生变化。
save 60 10000 #必须是60秒之内至少有10000个key发生变化。
stop-writes-on-bgsave-error yes    #后台存储rdb文件发生错误时停止写入。
rdbcompression yes    #使用LZF压缩rdb文件。
rdbchecksum yes       #存储和加载rdb文件时校验。
dbfilename dump.rdb   #设置rdb文件名。
dir ./                #设置工作目录,rdb文件会写入该目录。

主要说一下:stop-writes-on-bgsave-error的配置。在之前的redis版本中,redis是单进程的,因此在redis在持久化的过程中,如果有其他的客户端发送请求,此时redis服务器是不会响应客户端的请求的,后来redis改版后,可以通过主进程来进行持久化的工作,子进程来响应客户端的请求。此时就会出现一个问题,当主进程进行持久化的过程中,客户端同时在向服务器端发送写的操作,如果突然断电等特殊情况,导致主进程的持久化出现了错误,在这个过程中的客户端的写入是否保存呢?就是该参数来配置的,stop-writes-on-bgsave-error yes,那就是此阶段客户端的写操作不写入。


rdb的缺陷

在2个保存点之间 , 断电 , 将会丢失(1到N)分钟的数据。

出于对持久化的更精细要求 , redis增添了aof方式 (append only file)。

演示案例

1)设置保存rdb文件的目录

修改rdb持久化保存目录。

2)删除当前目下的dump.rdb文件(防止干扰)

3)开启redis服务器

4)使用redis的工具,一秒钟中set一万条数据

上面的参数写错了,应该是 ./bin/redis-benchmark -n 10000. 注意是 -n

5)再次插入一个不相干的数据

6)模拟断电,不正常的情况

7)再次启动redis服务器

8)测试数据是否存在

想必,大家应该知道为啥最后的 address没有保存下来了吧,因为是刚刚插入那条数据,就模拟突然断电了,不符合那三个save的要求,所以没有保存。

这就是redis使用rdb持久化的缺陷,会存在数据丢失的情况。

查看redis的持久化文件dump.rdb

注意事项

如果不想使用rdb来持久化操作,直接注释掉那三个save配置信息即可。

想要进行更加精细的持久化,请使用aop日志来持久化。一般,我使用两者来进行持久化。


  目录