zoukankan      html  css  js  c++  java
  • 【Mybatis】FIFO缓冲实现

    FIFO (first in, first out) 即“先进先出”缓冲淘汰算法。

    Cache 接口定义

    public interface Cache {
    
      /**
       * 缓冲 ID
       */
      String getId();
    
      /**
       * 存储数据
       */
      void putObject(Object key, Object value);
    
      /**
       * 获取数据
       */
      Object getObject(Object key);
    
      /**
       * 删除数据
       */
      Object removeObject(Object key);
    
      /**
       * 清空缓冲
       */
      void clear();
    
      /**
       * 获取缓冲大小
       */
      int getSize();
      
      ReadWriteLock getReadWriteLock();
    }
    

    FIFOCache 实现类

    FIFOCache 实现 Cache 接口

    package org.apache.ibatis.cache.decorators;
    
    import java.util.Deque;
    import java.util.LinkedList;
    import java.util.concurrent.locks.ReadWriteLock;
    import org.apache.ibatis.cache.Cache;
    
    /**
     * FIFO (first in, first out) cache decorator
     */
    public class FifoCache implements Cache {
    
      private final Cache delegate;
      private final Deque<Object> keyList;
      private int size;
    
      public FifoCache(Cache delegate) {
        this.delegate = delegate;
        this.keyList = new LinkedList<Object>();
        this.size = 1024;
      }
    
      @Override
      public String getId() {
        return delegate.getId();
      }
    
      @Override
      public int getSize() {
        return delegate.getSize();
      }
    
      public void setSize(int size) {
        this.size = size;
      }
    
      @Override
      public void putObject(Object key, Object value) {
        cycleKeyList(key);
        delegate.putObject(key, value);
      }
    
      @Override
      public Object getObject(Object key) {
        return delegate.getObject(key);
      }
    
      @Override
      public Object removeObject(Object key) {
        return delegate.removeObject(key);
      }
    
      @Override
      public void clear() {
        delegate.clear();
        keyList.clear();
      }
    
      @Override
      public ReadWriteLock getReadWriteLock() {
        return null;
      }
    
      private void cycleKeyList(Object key) {
        keyList.addLast(key);
        if (keyList.size() > size) {
          Object oldestKey = keyList.removeFirst();
          delegate.removeObject(oldestKey);
        }
      }
    }
    
  • 相关阅读:
    Java内置包装类
    for循环思路题
    常用函数
    函数
    冒泡排序
    数组的运用
    for循环中有意思的练习题。
    for循环
    运算中容易出现的错误
    分支的运用
  • 原文地址:https://www.cnblogs.com/newber/p/14211538.html
Copyright © 2011-2022 走看看