Redis的持久化机制
Redis是一个内存数据库,它的数据存放在内存中,但是如果关闭服务、机器关机或者断电的话,内存中的所有数据都会慢慢消失消失。
内存数据消失的原因:因为内存中的数据是半导体晶体管开关,这种开关高度依赖电源,当电源断电后,无法再控制晶体管的开关状态。这时候电容发挥作用,但是电容的电量也会随着时间而流逝,最终数据彻底消失。
所以Redis提供了两种不同的持久化方式,即RDB内存快照文件 和 AOF 更新日志追加文件。
RDB(Redis Database)内存快照存储: 在指定时间间隔内,将redis内存中存储的数据生成snapshot快照并存入到磁盘文件中,默认文件时dump.rdb文件。可以通过conf启动参数指定文件目录和文件名,以及定时刷入快照的时间。
AOF(Append Of File)日志文件追加: 将redis执行过的所有写、更新操作指令,当这些指令满了多少条之后,执行吸入aof磁盘文件。
这两种持久化方式可以同时使用,以达到最少丢失缓存数据的目的。
当然也可以把这两种方式的持久化全部关闭,这时redis就是一个纯内存缓存数据。
二、RDB快照的实现原理
Redis时单线程程序,这一个线程需要处理多应用的并发读写操作还要进行内存数据结构的逻辑读写操作。最大的隐患是redis在进行持久化时,会需要触发对磁盘io的读写操作,这显然严重拖垮redis的高性能。
那redis为了解决这个隐患,Redis的RDB持久化是在一个子进程中完成的,它会fork()出一个子进程来执行实际的持久化工作,这个子进程在执行过程中会使用写时复制(Copy On Write)技术,子进程fork()出来的一瞬间内存就会凝固,而主进程会一直服务于客户端的读写操作,当需要对内存进行操作时,这个时候就会使用copy on write技术将数据分离成数据段页,将需要读写操作的数据段进行复制并进行修改,而子进程读取的数据段页面数据是不产生变化的,这部分数据会一直进行磁盘数据持久化,这就是为什么叫内存快照的原因。当子进程持久化完成后,会通知主进程当前持久化的时间,主进程会保存这个时间,用于判断执行持久化动作。