七、Redis 持久化的两种方式 RDB 和 AOF 理解,mybatis 接口实现原理
save 命令,会阻塞服务器进程,只有当 RDB 文件生成成功才会接着响应服务端的其他命令。
而 bgsave ,既然有这个命令,肯定是和 save 有所不同的,bgsave 不会阻塞服务器进程,会创建一个子进程来创建 RDB 文件
但是注意的是使用 bgsave 命令的时候,虽然是通过子进程生成 RDB 文件,不会阻塞服务进程,其他的命令可以执行,但是有几个命令是不能执行的。
save
bgsave
bgrewriteaof
在 bgsave 期间 服务器拒绝这三个命令,主要是方式线程间竞争产生问题。
[](
)通过配置文件自动生成 RDB
初了手动执行这两个命令外,还可以在配置文件中配合参数,达到条件的时候就会自动的生成 RDB
打开我们的配置文件 redis.conf,找到如下图,这个是默认的配置。
save 900 1
表示在 900 秒内,如果发生了一次写操作,就触发 bgsave 命令生成 RDB
同理
save 300 10 在 300 秒内,发生了 10 次写操作,就触发 bgsave
save 60 10000 在 60 秒内发生了 10000 次写操作,就触发 bgsave
上面的这些可以进行配置,可以看到默认的设置,如果短时间内发生大量的写操作就会自动的触发 bgsave ,生成 RDB 文件, 防止数据丢失。
好了,上面虽然说达到这三个条件中的一个,redis 就会自动的生成 RDB 文件,那系统是怎样控制,又是怎样识别是否满足条件呢?
原来啊,服务器维持了一个 dirty 计数器,以及一个 lastsave 属性。
dirty 计数器记录着从上次 save/bgave 到现在发生了多少次写操作,没进行一次写操作,计数器就加 1
比如
set a 123
计数器 dirty 加 1
set a 123 b 234 c 456
计数器 dirty 加 3
而 lastsave 是 unix 时间戳,记录上次 save 或 bgsave 的时间。
有了这两个属性,就可以判断什么时候执行啦,redis 服务器会周期性的执行 serverCron 函数,默认的话是每 100 毫秒执行一次。
这个 serverCron 函数先通过当前时间减去 lastsave 获取时间间隔。
如果 dirty 大于 saveparm.chranges
并且时间间隔大于 saveparm.seconds
那么就会触发 bgsave 生成 RDB 文件
其中 saveparm.seconds 和 saveparm.chranges 分别对应的是配置文件中设置的 save 900 1 等。
既然生成了 RDB 文件,我们只知道 RDB 是一个压缩的二进制文件,那 RDB 文件到底结构是什么样的呢?
我看了一下《redis 设计与实现》没有怎么看明白哈哈,感兴趣的可以去看看。
RDB 方式就讲到这里了,记住 RDB 方式,是定时的执行 bgsave 命令生成 RDB 文件保存在磁盘上实现持久化的。适合数据备份,用于数据恢复可能会丢失最近几分钟的数据。
[](
)AOF
==================================================================
全称是 append only file. AOF 持久化的方式是通过 redis 服务器记录保存下所有的写命令到 AOF 文件存放在磁盘上,实现持久化的,看下图:
怎样采用 AOF 的方式持久化呢?
打开我们的配置文件,在配置文件中找到 appendonly 改成 yes 就可以采用 AOF 的方式备份了
我们启动 redis 服务,为了测试方便,我们新启的一个 redis 服务,数据库中没有任何 key
我们看看 appendonly.aof 也是没有任何东西的。
现在我们存入一个 key
然后我们来看下 aof 文件的内容:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190822185741824.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ub
mV0L3FxXzI3NzkwMDEx,size_16,color_FFFFFF,t_70)
可以看到,初了一些 $3 等一些特殊符号外我们可以看到我们执行的命令。
select 0
set a bbb
但是我们一些读操作的就不会记录。由此可见,AOF 持久化就是将所有的写操作存入 AOF 文件中,当数据恢复的时候,执行 AOF 文件中的命令就可以获取数据了。
我们接着来看那,我向数据库中先加一个 key b ,然后删除 key a .
好了,现在我们再来看看 aof 文件中是什么情况。
可以看到命令有:
select 0
set a bbb
set b ddd
del a
所以 aof 文件中包含了这四条命令,到这大家有没有发现一个问题,如果我重复的对某一个 key 值进行操作,那么 aof 文件中就会记录所有的操作命令,但是实际上只有最后一次操作才是有效的,那这个 aof 文件中是不是就有很多冗余的数据呢?
实际上是这样的,那怎么解决这个问题呢?这里就要提到一个命令啦
评论