redis配置文件中的 save <seconds> <changes>

默认的配置为:

save 900 1
save 300 10
save 60 10000

以前在其他博客中或者书籍中看到对于这个配置文件的解读是

1、900秒之内有1次更新,就进行持久化操作
2、300秒之内有10次更新,就进行持久化操作
3、60秒之内有10000次更新,就进行持久化操作

1、自己的疑惑之处


我个人对“ 之内”的理解(可能误解了相关作者本来的意思):有十次更新,第一次和最后一次的间隔不超过300秒,就执行保存。
在我的这种理解下:这个三个条件就是有问题的,因为在检查是否符合条件时,检查的顺序是1、2、3,如果真是这样,那么2,3条件永远不会被执行,因为符合2、3条件的必然符合条件1,在比对条件1时就执行了,条件2、3永远也不会被执行。

2、看官方文档


再看redis官方配置文件中的描述:

#在下面的例子中,行为将是保存:
#在900秒(15分钟)后有1次更新,就进行持久化操作
#在300秒(5分钟)后有10次更新,就进行持久化操作
#在60秒后有10000次更新,就进行持久化操作

官方中使用的是after,中文可能真的复杂了一点,一句话不同的人可能读出不同的意思,所以可以直接看相关的伪码,在相关伪码中其实现是:

(1)、维护一个dirty计数器,记录此刻到上一次进行bgsave保存RDB文件的过程中,共进行了多少次对数据的修改操作(写入、修改、更新等)
(2)、维护一个lastSave属性,记录上一次进行bgsave时的时间戳

对save条件的检查是通过周期函数每隔100毫秒检查一次,在检查的时候,先通过当前时间戳与lastSave属性计算save_interval(此刻的时间戳-lastSave属性),如果dirty>=1,且 save_interval > 900,那就执行保存,如果不满足就检查下一个条件dirty>=10,且 save_interval > 300,那就保存,同理不满足则去检查第三个条件

如果我描述的不好理解,可以看看下面的伪码
1、save存储结构
在这里插入图片描述

2、save条件判断逻辑
在这里插入图片描述
如若有误,还请批评指正

最后:自己在学习的过程中,还有很多的自己学习的笔记和心得,等之后有时间了肯定会进行总结和检查再分享出来让大家批评指正

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐