美文网首页
tomcat中的ConcurrentCache

tomcat中的ConcurrentCache

作者: 我不懂我不懂a | 来源:发表于2022-08-14 16:40 被阅读0次

    偶然查找代码的时候发现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);
        }
    }
    

    相关文章

      网友评论

          本文标题:tomcat中的ConcurrentCache

          本文链接:https://www.haomeiwen.com/subject/gwhlgrtx.html