微服务框架
【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
分布式缓存
文章目录
- 微服务框架
- 分布式缓存
- 41 Redis 持久化
- 41.2 RDB 持久化【底层原理】
- 41.2.1 RDB
- 41.2.2 总结
41 Redis 持久化
41.2 RDB 持久化【底层原理】
41.2.1 RDB
上一节课中已经实现了当满足一定条件时就去触发bgsave,完成异步的持久化
【开启子进程】bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。
因为是异步的,所以这个操作基本上对 主进程0 阻塞
【举个栗子】
首先有一个物理内存【粗略理解 → 计算机中的内存条】
然后有一个主进程,它要实现对数据的读写,肯定需要到内存中实现操作,
但是在Linux 系统中,所有的进程都没有办法直接操作物理内存,而是由操作系统给每一个进程分配一个虚拟内存,所以主进程就只能操作虚拟内存
这时操作系统会维护一个物理内存 与虚拟内存之间的映射关系表,我们称之为 页表
所以现在的情况就是,主进程操作虚拟内存,虚拟内存基于页表的映射关系,到物理内存真正的存储位置,由此实现对物理内存的数据的读写
而我们执行fork 的时候,会去创建一个子进程
fork 并不是把内存数据做拷贝,它仅仅是对 页表做一个拷贝
即把这个映射关系拷贝给子进程,有了这个页表,在子进程操作虚拟内存时,就也可以通过页表映射到相同的物理内存区域
这样就实现了子进程和主进程 内存空间的共享【这样就无须拷贝内存数据,速度嘎嘎提升】
然后子进程就可以去读取数据了,并将其写入磁盘的文件中
其实到这儿就是异步持久化的实现
fork采用的是copy-on-write技术:【为了避免主进程在写、子进程又同时在读,产生冲突问题甚至于脏数据】
-
当主进程执行读操作时,访问共享内存;
-
当主进程执行写操作时,则会拷贝一份数据,执行写操作。
这就是copy-on-write 的技术
每一次只要有写,就去拷贝。
41.2.2 总结
RDB方式bgsave的基本流程?
-
fork主进程得到一个子进程,共享内存空间
-
子进程读取内存数据并写入新的RDB文件
-
用新RDB文件替换旧的RDB文件。
RDB会在什么时候执行?save 60 1000代表什么含义?
- 默认是服务停止时。
- 代表60秒内至少执行1000次修改则触发RDB
RDB的缺点?
- RDB执行间隔时间长,两次RDB之间写入数据有丢失的风险
- fork子进程、压缩、写出RDB文件都比较耗时