ConcurrentLruCache

ConcurrentLruCache

 

并发堆内缓存,使用LRU缓存淘汰策略(最近最少使用)

 

private final int sizeLimit;  缓存数量限制,可以是0表示不走缓存

private final Function<K, V> generator;  缓存数据生成

private final ConcurrentHashMap<K, V> cache = new ConcurrentHashMap<>();  缓存容器

private final ConcurrentLinkedDeque<K> queue = new ConcurrentLinkedDeque<>();  缓存key容器,对key进行排序,在缓存满容量时选择最近使用最少的key

private final ReadWriteLock lock = new ReentrantReadWriteLock();  缓存读写分离

private volatile int size;  当前缓存数量

 

#public V get(K key)  核心接口,获取缓存数据

  ##sizeLimit == 0,直接使用generator.apply

  ##若缓存命中 -> 若size < sizeLimit return cached; 否则使用readLock,queue.removeLastOccurrence(key) 从队列的末尾往前找并移除,再queue.offer(key),目的是把该key的排序设为最多使用

  ##否则,使用writeLock,再次尝试获取缓存

    ##若命中 -> queue.removeLastOccurrence(key) 从队列的末尾往前找并移除,再queue.offer(key)

    ##否则使用generator.apply获取数据,若size == sizeLimit -> 使用queue.poll()出最少使用的key,并移除缓存;最后queue.offer(key);cache.put(key, value);

 

#public boolean contains(K key)  return this.cache.containsKey(key);

#public boolean remove(K key)  使用writeLock,移除

#public void clear()  使用writeLock,移除

 

posted on 2021-10-14 15:18  icodegarden  阅读(304)  评论(0编辑  收藏  举报