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,移除