程序员知识点梳理,Redis的这个功能,和Mysql有异曲同工之妙
发布于 2019-08-08 | 作者: 沙茶敏碎碎念 | 来源: 网易号 | 转载于:
网易号
下面这个程序员面试场景并不少见。
面试官:Redis跟MemoryCache相比有什么优点?
程序员:可以持久化存储
面试官:Redis怎么持久化存储的呢?
程序员:...(靠,忘记背诵了)
今天我们来聊一聊Redis的持久化存储,不要死记硬背,真正从原理理解这么一个过程。
Redis有两种持久化的方式,一种是快照,一种是AOF日志。那么这两者又有什么区别呢?
快照,Snapshot。很多人对这个名词不太理解,其实就是我们现实中照相一样,如果你用过胶片相机(暴露年龄了),那么会更有深刻的理解,当按下照相机快门键的时候,胶片会进行曝光,这个时候,眼前的东西都会定格在胶片当中,无论后面的景色如何改变,也不会改变胶片里面的内容。
Redis的快照,也是如此,当Redis进行快照持久化的时候,会调用操作系统的Fork函数,Fork函数会把母进程中所有的内存进行拷贝,就像把景色装进胶片一样。接下来再慢慢的进行写磁盘操作。这个时候,会充分地运用到操作系统的CopyOnWrite机制,在一开始,子进程还是使用母进程的数据,从来达到节约内存的效果,直到数据发生改变。所以,在Redis空闲的时候,进行Rdb持久化是最划算的。
AOF日志,每一条最Redis的操作,都会以日志的方式记录下来,举个简单的例子,有一个集合,初始是空,先放进1,再放进2,最后变成{1,2}。在快照的持久化,记录的是集合的最终结果{1,2}而在AOF日志持久化中,记录的则是add1,add2,只要对日志进行重放,一样也可以得到结果。
我们都知道,操作系统写文件,都是先写到缓冲区,缓冲区写满才会被刷进磁盘。这个时候如果宕机了,内容是不会保存到文件当中的,好在操作系统提供了fsync的系统函数让我们可以事实把缓冲区的数据刷进磁盘。当然,如果我们每条指令都刷进磁盘,系统的瓶颈很可能会转到磁盘IO上,所以生产环境上,Redis一般配置1s钟默认执行一次fync。
学习,我们要善于对知识进行归纳整理。Redis的持久化存储,跟Mysql有没有什么异曲同工之妙呢?不难发现,在生产环境中,我们的运维工程师也会经常备份Mysql的全量数据zip包,这不就是快照的备份方式么?另一方面,每一条Mysql的操作,也会生成binlog日志,这不就是AOF日志么?技术总是想通的,一个好的程序员,要善于去发现技术的共同点,这才能往更深层次去迈进。
与Mysql加快备份恢复一样,现网的Redis,我们也是快照持久化跟AOF日志混合使用,在Redis4.0之后,我们可以在系统空闲或者定期执行快照备份,假如服务重启的时候,系统会读取最后一次快照,然后回放快照时间点之后的AOF日志,就可以恢复数据了。