• java 自定义 LRU(最近最少使用)策略 实现 缓存机制


    1. java提供了一个简单的方式实现LRU:  LinkedHashMap

     

     2. 自定义实现

    LRU至少需要两个主要操作: 添加(add)和搜索(search)

    public class LRUCache {
        private Map<String, CacheEntry> map;
        private CacheEntry head , tail;
        private int maxSize;
        public LRUCache(int maxSize){
            if(maxSize < 1){
                throw new IllegalArgumentException("Cache maxSize has to be at least 1");
            }
            this.map = new HashMap<String, CacheEntry>();
            head = new CacheEntry("head","");
            tail = new CacheEntry("tail", "");
            head.setNext(tail);
            tail.setPrev(head);
            this.maxSize = maxSize;
        }
        public void add(String key, String value){
            CacheEntry cacheEntry = map.get(key);
            if(cacheEntry == null){
                cacheEntry = new CacheEntry(key, value);
                if(map.size() == maxSize){
                    //缓存达到最大数目
                    //删除最老的条目
                    CacheEntry deleteEntry = tail.getPrev();
                    //从map中移除
                    map.remove(deleteEntry.getKey());
                    //从队列中移除
                    remove(deleteEntry);
                }
                //添加条目到队列
                addFront(cacheEntry);
                //添加到map
                map.put(key, cacheEntry);
            }else{
                //更新值
                cacheEntry.setValue(value);
                //访问条目
                accessed(cacheEntry);
            }
        }
    
        public String search(String key){
            CacheEntry entry = map.get(key);
            if(entry == null){
                return null;
            }
            accessed(entry);
            return entry.getValue();
        }
        //打印缓存内容
        public void print(){
            CacheEntry entry = head.getNext();
            while(entry != tail){
                System.out.println("{" + entry.getKey() + ":" + entry.getValue() + "}");
                entry = entry.getNext();
            }
            System.out.println();
        }
    
        public void accessed(CacheEntry entry) {
            if(entry.getPrev() != head){
                remove(entry);
                addFront(entry);
            }
        }
    
        private void addFront(CacheEntry entry) {
            //在队列的头部添加条目
            CacheEntry nextEntry = head.getNext();
            head.setNext(entry);
            entry.setPrev(head);
            entry.setNext(nextEntry);
            if(nextEntry != null){
                nextEntry.setPrev(entry);
            }
        }
    
        private void remove(CacheEntry entry) {
            if(entry == head || entry == tail){
                return;//错误
            }
            entry.getPrev().setNext(entry.getNext());
            if(entry.getNext() != null){
                entry.getNext().setPrev(entry.getPrev());
            }
        }
    }
    /**
     * Created by admin on 2018/3/30.
     */
    public class CacheEntry {
        private CacheEntry prev, next;
        private String key, value;
        CacheEntry(String key, String value){
            this.key = key;
            this.value = value;
        }
    
        public CacheEntry getPrev() {
            return prev;
        }
    
        public void setPrev(CacheEntry prev) {
            this.prev = prev;
        }
    
        public CacheEntry getNext() {
            return next;
        }
    
        public void setNext(CacheEntry next) {
            this.next = next;
        }
    
        public String getKey() {
            return key;
        }
    
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    }
  • 相关阅读:
    openCV中cvSnakeImage()函数代码分析
    程序所有重构,升级的目标(备注,更新)
    基础总结篇之中的一个:Activity生命周期
    Tomcat全攻略
    VRRP协议具体解释
    二叉树三种遍历(递归以及非递归实现)
    AssertValid函数学习
    java定时器的使用(Timer)
    循环队列
    使用Heartbeat实现双机热备
  • 原文地址:https://www.cnblogs.com/rocky-fang/p/8676318.html
Copyright © 2020-2023  润新知