下面讲了音讯到内存的过程,为了音讯不失落,是须要长久化到磁盘上的,这里又分为同步刷屏和异步刷屏。
在内存里解决后,就开始开释锁,解决完的后果叫result。所以到了刷屏的阶段,可能会有一个或者多个的result须要解决。
同步刷盘
同步刷盘的服务,也是一个线程,专门用来解决这些result。他保护着requestsWrite和requestsRead的链表。requestsWrite是放须要解决的result,requestsRead是放筹备解决的result。
每个result须要同步刷盘服务解决的时候,都会放入requestsWrite,因为requestsWrite并不是线程平安的,所以这里也须要加锁和开释锁的操作。
下面提过,这个服务也是一个线程,这个线程就是用来解决requestsRead的。
这个线程每解决完requestsRead就会期待最多10ms的工夫,直至被从新唤醒。
所以requestsWrite有数据的时候,就会唤醒这个线程,这个线程就会把requestsWrite和requestsRead里的数据进行替换。
因为写入requestsWrite是并发的,所以替换的时候,可能会有多个result到requestsRead里。
替换完后,就开始把requestsRead里的数据进行落盘,这个线程并不影响requestsWrite的写入。
异步刷盘
异步刷盘,简略的说,就是不等落盘就间接返回。
同样的,异步刷盘也有一个线程的服务,每隔一段时间就开始进行刷盘。然而这里也有一个小区别,就是是否开启堆外内存机制。
如果没有开启,那音讯是追加到与物理文件映射的内存中,而后写入到磁盘。
如果开启了,那会创立一个一个commitlog一样大小的堆外内存,所以音讯会追加到这个堆外内存中,而后是提交到与物理文件映射的内存中,最初写入到磁盘。