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

在实现简易日志组件时,为了写日志的同时,可将日志数据进行写入磁盘实现持久化。如果每记录一条日志就写一次磁盘文件的话, 磁盘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++;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java缓冲队列可以使用两个队列来实现,一个队列用于添加元素,另一个队列用于读取元素。当添加队列满时,将添加队列中的元素全部转移到读取队列中,继续往添加队列中添加元素。当读取队列中没有元素时,将读取队列中的元素全部转移到添加队列中,继续从读取队列中读取元素。这样,两个队列就可以交替使用实现缓冲的效果。 下面是一个简单的Java缓冲队列的实现示例: ```java import java.util.concurrent.ConcurrentLinkedQueue; public class DoubleBufferQueue<T> { private ConcurrentLinkedQueue<T> addQueue = new ConcurrentLinkedQueue<>(); private ConcurrentLinkedQueue<T> readQueue = new ConcurrentLinkedQueue<>(); public void add(T t) { addQueue.add(t); if(addQueue.size() >= 1000) { swapQueues(); } } public T get() { if(readQueue.isEmpty()) { swapQueues(); } return readQueue.poll(); } private void swapQueues() { ConcurrentLinkedQueue<T> tempQueue = addQueue; addQueue = readQueue; readQueue = tempQueue; } } ``` 这个缓冲队列使用了两个`ConcurrentLinkedQueue`队列来实现。`addQueue`用于添加元素,`readQueue`用于读取元素。当`addQueue`中的元素数量大于等于1000时,调用`swapQueues()`方法将两个队列交换,将`addQueue`中的元素全部转移到`readQueue`中,继续往`addQueue`中添加元素。当`readQueue`中没有元素时,调用`swapQueues()`方法将两个队列交换,将`readQueue`中的元素全部转移到`addQueue`中,继续从`readQueue`中读取元素。这样,就实现缓冲的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值