昨天在公交车上,再一次听了五月天的《顽固》,里面的一句歌词现在听起来意义非凡,歌词:你当时相信的那些事情,会在如今变成美丽风景,听起来会是很激励的话,其实人生最怕的就是没有希望,心中不再相信存在着美好的风景,就像大冰说的,这个世界上的确是有人能够早九晚五,又能够浪迹天涯,最初的美好,特别珍贵,成长中可以丢掉稚气,但是不能丢掉初心。
BB结束
下面说说RDB和AOF
这两个算是Redis最有名的了,因为redis是基于内存的,而内存的好处是快,坏处也十分明显就是安全性不高,没有硬盘稳定,用来存储数据会有数据丢失的隐患,那如何处理这个隐患呢,就是通过持久化的策略将数据从内存同步到硬盘上,而这个持久化策略,redis提供了两种,一个是RDB,一个就是AOF
好现在我们知道了他是干什么的了,那他们是怎么做的,有什么区别,为什么还搞了两种方案。
下面就说说两种持久发策略的实现方式
1 RDB
RDB持久化的方式,他其实是redis将数据写入rdb文件中,这个文件保存的主要是redis数据库里面的数据,也就是key-value。
rdb的执行过成中,又是可以通过两个方法来完成的,save和bgsave
1 save
他会调用rdbsave方法,然后写入文件,但是有一个问题就是他会阻塞主进程
2 bgsave
这个就是常用的了,他会增加一个fork子进程,然后子进程调用rbbsave方法,写入文件。
和save的对比就很明显了,一个是同步的一个是异步的,bgsave要更好一些
2 AOF
AOF aof的持久化,是一个同步日志的操作,而这个日志保存的是,redis执行的命令,比如:
删除一个key,在第四行后面加一个值,保存一个值。
实现上,他是在每次执行命令后,都会将命令追加到缓存区aof_buf的末尾,等缓存区满了,就会写入到aof文件里了。但是存在一个问题,一旦内存gg了,就会存在数据的丢失
其实他也有具体的三种策略 always everysec no
1)always
每次都同步到磁盘,这种相当于不用缓冲区了,所以他的效率低,但是安全性很高
2)everysec
这种是每隔1s同步下磁盘,这种效率高,安全性相对较高,而且出问题,也只是会丢失1s的数据
3) no
由操作系统控制同步磁盘,这种效率高,但是安全性低。
对比了一下,基本的选择策略还是everysec,他比较普适。
除此之外还有一个问题,就是aof文件过大的问题,比如对同一条数据,增加了一条,又修改了他,其实如果是想通过记录命令来回复数据的话,其实只需要记录一次就搞定了,但是这种要查询一下redis数据库是否有这条数据,这种实现就是AOF的重写,重写后会将命令写入一个新的aof文件,都重写完了,就会替换原有的aof文件
3 上面介绍了rdb和aof的细节
那总结一下他们的优缺点
rdb的优点
1)rdb文件是一个压缩的二进制文件,占用空间小
2)rdb这种方式是全量的复制数据,适合还原数据,恢复数据的速度也更快
rdb的缺点
1)fork子进程会占用cpu资源
2)因为是全量的,就不能实时的写入,一般的间隔时间是五分钟,影响了写入的速度,数据丢失的风险就增大了
aof的优点
1)他的命令是增量的增加,所以写入的速度就很快
2)因为他写入的东西少,所以他可以在很短的时间就进行备份数据,防止数据丢失,增加安全性
aof的缺点
2)因为保存的是命令,恢复数据就很慢。
4 aof和rdb的优先级
如果redis同时配置了rdb和aof,redis会优先执行aof