Redis持久化
Redis持久化可以围绕三个问题进行展开。1.持久化从内存到磁盘发生了什么 2.如何尽可能保证持久化的安全 3.AOF和RDB的区别
1.持久化从内存到磁盘发生了什么?
先从大的方面说:内存的速度和硬盘的速度完全是两个概念级别的,内存可以理解为是电,而硬盘(机械硬盘)可以理解到真正的介质存在。
现在最好的ssd硬盘读写大概800mb/s,而现在一般的ddr3代1333的速度读写在7000mb/s以上。
从缓存到磁盘,个人认为肯定要经过三个大的部分,缓存-->CPU-->硬盘。并且目前我认为会存在一个调度的过程,CPU自己也有对应的一级二级三级缓存。如果CPU的缓存内有需要的数据就会直接拿,如果没有就会去缓存地方要,并且刷入自己的缓存中,之后这一部分数据就会给到硬盘,硬盘也有自己的一个缓存区,步骤和之前的CPU是一样的。然后再根据种类的不同刷入。
在Redis中持久性一般使用的不多,大多数情况会结合数据库进行异步的缓存,当然它自带这个功能肯定也是有道理的。
2.如何尽可能保证持久化的安全
首先一点在Redis中持久化有两种不同的方式,一种是叫AOF(记录Redis中的操作)另一种是RDB(类似MySQL的快照功能)。两者之间各有优缺点,但是在Redis中一般为了保证持久化的安全性
会使用到Linux提供的一个fsync(int fd)的方法,这个方法会强制将AOF日志刷到磁盘中,但是很慢。毕竟是为了安全有些东西必须舍弃。
当然Redis也提供了两种途径:1.永不使用fsync 2.来一个指令就调用一次fsync
3.AOF和RDB的区别
AOF日志存储的是Redis服务器中的顺序指令序列,Redis接收到命令之后会进行参数校验以及逻辑处理,如果没问题就会执行然后再刷入AOF中,就是先执行再刷入,毕竟是Redis。高速这个思想是在设计的时候被放在第一位的。然后会把日志存在一块内存上,然后异步的刷到磁盘上。果然高速是唯一的要求!AOF是一个增量操作,会随着时间的变大而变大,所以会有一个AOF重写的方法,先开一个子进程对内存进行遍历,然后将数据可序列化到一个日志文件中,将操作期间的增量刷到这个日志文件中,追加完毕后就可以完成之前的瘦身工作了。(可以想象为把之前的增量操作都实现,或者说是重现开始增量)
RDB类似MySQL的快照功能,当然Redis是一个单线程的,所有它需要一边处理新的,又要进行持久化,这个会很不科学,所以和Java一样,它有一个COW机制,Redis会产生一个进程,这个进程会和正常的进程一样,不过是和连体婴儿一样,他和正常的进程共享数据,在最后分离的一瞬间再完成记录(准确的是 我Copy一份,然后自己拿去修改),这样的话就不会产生我还在持久化而你已经删除了他的情况。
还有一个概念就是混合持久化,这个其实很好理解就是两个机制轮流来,来满足特定情况下的需求。