• 【Mybatis】LRU缓冲实现


    LRU (least recently used) 即“最近最少使用”缓冲淘汰算法。
    Mybatis 的 LRUCache 是利用 java 的基础工具包 LinkedHashMap 特性二次开发完成。

    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();
    }
    

    LRUCache 实现类

    LRUCache 实现 Cache 接口

    package org.apache.ibatis.cache.decorators;
    
    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.concurrent.locks.ReadWriteLock;
    import org.apache.ibatis.cache.Cache;
    
    /**
     * Lru (least recently used) cache decorator
     */
    public class LruCache implements Cache {
    
      private final Cache delegate;
      private Map<Object, Object> keyMap;
      private Object eldestKey;
    
      public LruCache(Cache delegate) {
        this.delegate = delegate;
        setSize(1024);
      }
    
      @Override
      public String getId() {
        return delegate.getId();
      }
    
      @Override
      public int getSize() {
        return delegate.getSize();
      }
    
      public void setSize(final int size) {
        keyMap = new LinkedHashMap<Object, Object>(size, .75F, true) {
          private static final long serialVersionUID = 4267176411845948333L;
    
          @Override
          protected boolean removeEldestEntry(Map.Entry<Object, Object> eldest) {
            boolean tooBig = size() > size;
            if (tooBig) {
              eldestKey = eldest.getKey();
            }
            return tooBig;
          }
        };
      }
    
      @Override
      public void putObject(Object key, Object value) {
        delegate.putObject(key, value);
        cycleKeyList(key);
      }
    
      @Override
      public Object getObject(Object key) {
        keyMap.get(key); //touch
        return delegate.getObject(key);
      }
    
      @Override
      public Object removeObject(Object key) {
        return delegate.removeObject(key);
      }
    
      @Override
      public void clear() {
        delegate.clear();
        keyMap.clear();
      }
    
      @Override
      public ReadWriteLock getReadWriteLock() {
        return null;
      }
    
      private void cycleKeyList(Object key) {
        keyMap.put(key, key);
        if (eldestKey != null) {
          delegate.removeObject(eldestKey);
          eldestKey = null;
        }
      }
    }
    
  • 相关阅读:
    HDUOJ---Can you solve this equation?
    HDUOJ---A + B Again
    C++知识整理(进制)
    位运算的方法,大结
    位运算的方法,小结
    C++知识整理(在此感谢大牛的整理)
    nyoj---快速查找素数
    HDUOJ----湫湫系列故事——减肥记I
    《道德经》:十条简洁有用的人生建议
    Nginx的几个常用配置和技巧
  • 原文地址:https://www.cnblogs.com/newber/p/14211402.html
Copyright © 2020-2023  润新知