写点什么

七、Redis 持久化的两种方式 RDB 和 AOF 理解,mybatis 接口实现原理

用户头像
极客good
关注
发布于: 刚刚

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


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


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 文件中是不是就有很多冗余的数据呢?


实际上是这样的,那怎么解决这个问题呢?这里就要提到一个命令啦

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
七、Redis持久化的两种方式RDB和AOF理解,mybatis接口实现原理