偶然查找代码的时候发现tomcat中有一个ConcurrentCache类。并发?缓存?我感兴趣的点了进去。
功能描述:用于缓存数据,数据量超过size可能过期旧数据。
代码挺简单的,其中eden为热点数据,longterm为长期数据,size为缓存大小。
- 添加数据(put)添加到eden,超过缓存大小后将eden中的数据全部转移至longterm。此时在eden中没有儿longterm有的数据,由于是弱引用的,会在GC时回收掉。
- 获取缓存(get)会先从eden中查找,没有数据再去查询longterm,如果longterm中有数据,则重新设置为热点数据(eden)。
完整代码:
public final class ConcurrentCache<K, V> {
private final int size;
private final Map<K, V> eden;
private final Map<K, V> longterm;
public ConcurrentCache(int size) {
this.size = size;
this.eden = new ConcurrentHashMap(size);
this.longterm = new WeakHashMap(size);
}
public V get(K k) {
V v = this.eden.get(k);
if (v == null) {
synchronized(this.longterm) {
v = this.longterm.get(k);
}
if (v != null) {
this.eden.put(k, v);
}
}
return v;
}
public void put(K k, V v) {
if (this.eden.size() >= this.size) {
synchronized(this.longterm) {
this.longterm.putAll(this.eden);
}
this.eden.clear();
}
this.eden.put(k, v);
}
}
网友评论