一、两个问题
- 为什么要持久化
- 如何持久化
1.1 为什么要持久化?
因为Redis数据存在内存,若服务器宕机或重启,数据会全部丢失,需要有一种机制保证数据不会因为故障丢失。
Redis是单线程的,而持久化就是说Redis需要将线程用到保存数据到磁盘,并且还要服务客户端的请求,持久化的IO会严重影响性能。
那么Redis是如何解决的?
这里Redis使用了操作系统的 写时复制(Copy On Write)。也就是从原先处理客户端请求的进程中,fork出一个子进程,来进行持久化。
1.2 如何持久化?
- 快照
- AOF日志
二、Copy On Write
fork()函数
父进程执行fork()后,会产生一个子进程。当fork()被调用的时候,会返回两个值。
为什么返回两个值?
因为是两个线程,返回给父线程,子线程的ID;返回给子线程,0。
exec()函数
exec的作用是,替换当前进程的内存空间的映像,从而执行不同的任务。
也就是说,当子进程执行exec后,就不再是父进程的副本了,因为有了独立的内存空间。
Copy On Write
参考文档
[1]: Redis官方文档 持久化(persistence)
[2]: 一个经典面试题:如何保证缓存与数据库的双写一致性?
[3]: 你的Redis怎么持久化的
[4]: COW奶牛!Copy On Write机制了解一下
[5]: 10分钟彻底理解Redis的持久化机制:RDB和AOF