在实现简易日志组件时,为了写日志的同时,可将日志数据进行写入磁盘实现持久化。如果每记录一条日志就写一次磁盘文件的话, 磁盘IO会占用正常处理逻辑的性能。因此,采用双内存缓冲区的思路来将写日志与写磁盘文件这两个动作进行解耦。
1、将业务日志写入到日志缓冲区
2、当进行刷盘时,将日志缓冲区的数据转移到待刷盘缓冲区
3、日志缓冲区继续执行,而刷盘线程可另外工作
以下为实现的逻辑代码:
package com.dfs.namenode.server;
import java.util.LinkedList;
/**
* 文件变更日志
*/
public class FSEditLog {
/**
* 日志序号
*/
private long txidSeq = 0L;
/**
* 用于存储当前写线程的日志序号
*/
private ThreadLocal<Long> localTxid = new ThreadLocal<>();
/**
* 双层缓存,用于写日志,同时可刷盘
*/
private DoubleBuffer editLogBuffer = new DoubleBuffer();
/**
* 默认没人在刷盘
*/
private boolean isSyncRunning = false;
/**
* 已刷盘的最大日志序号
*/
private long syncMaxTxid = 0;
/**
* 是否有线程在等待刷新下一批log到磁盘文件
*/
private boolean isWaitSync;
/**
* 记录log日志
* @param content
*/
public void LogEdit(String content) {
//上锁写buffer
synchronized (this) {
//每次写日志都递增一次日志序号
txidSeq++;