Redis持久化数据
Redis中的数据是存储在内存中,内存是DRAM动态随机存储器,断电就会丢失内容,所以需要使用持久化技术来内存中的数据存到磁盘中,以防止突然断电丢失
两种持久化机制:快照 和 AOF
Redis持久化之快照:
什么是快照?
快照就是内存在某一时刻的全数据备份,是数据的二进制序列,着眼于数据,在存储上来说,非常紧凑
快照原理
Redis是单线程程序,当进行快照的时候,如果数据量很大的话,那么处理起来就会需要很多时间,导致Redis服务不能及时响应其他客户端的请求,所以Redis每次需要进行快照的时候,都fork出一个子进程,父进程继续为客户端提供服务,而子进程则去备份数据,但是当备份数据的时候,如果此时有客户端更新了数据,那该如何处理呢?
为了防止备份时更新数据,Redis使用了Copy On Write机制
使用操作系统的 COW 机制来进行数据段页面的分离。数据段是由很多操作系统的页面组合而成,当父进程对其中一个页面的数据进行修改时,会将被共享的页面复制一份出来,然后对这个复制的页面进行修改。这时子进程相应的页面是没有变化的,还是进程产生时那一瞬间的数据。
Redis持久化之AOF机制
AOF 日志存储的是Redis 服务器的顺序指令序列,AOF 日志只记录对内存进行修改的指令记录。
假设 AOF 日志记录了自Redis 实例创建以来所有的修改性指令序列,那么就可以通过对一个空的Redis 实例顺序执行所有的指令,来恢复Redis 当前实例的内存数据结构的状态。下面的例子讲一下为什么AOF比快照更冗余
//指令序列
set key "hello";
set key "hello word"
set key "hello word 2"
此时key的值为:hello word 2,AOF详细记录了指令机制,但是由于快照只关注于数据本身,进行快照的时候,其实只需要1条指令,那就是 set key "hello word 2"即可,但是AOF却使用了3条指令,所以快照比AOF更加紧凑
AOF重写,对AOF进行瘦身
子进程对Redis中的数据进行转换成一系列的Redis指令,去掉冗余的指令序列,序列化后的指令存储到一个新的AOP日志文件中,序列化完毕后,再将在操作期间更新的数据的AOF日志追加到这个新的AOF文件中,再使用新的AOF文件替代旧AOF文件即可
Fsync机制
如果对AOF进行操作时候,其实AOF日志是存在内存缓存中的,为了防止突然宕机导致AOF数据丢失,使用Fsync机制将内存中的数据刷新到磁盘中,可以设置 fsync的执行间隔,比如设置2秒执行1次这样…