Java 使用双内存缓冲区 实现简易日志组件

本文介绍了如何使用Java的双内存缓冲区策略来优化日志组件,以减少磁盘I/O对正常业务处理的影响。通过将日志写入缓冲区并在合适时机转移至待刷盘缓冲区,实现日志写入与磁盘持久化的解耦。文中提到了逻辑代码,并提及Java NIO中类似实现。
摘要由CSDN通过智能技术生成

在实现简易日志组件时,为了写日志的同时,可将日志数据进行写入磁盘实现持久化。如果每记录一条日志就写一次磁盘文件的话, 磁盘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++;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值