Dubbo: LRUCache issue

Created on 15 Sep 2017  ·  2Comments  ·  Source: apache/dubbo

https://github.com/alibaba/dubbo/blob/17619dfa974457b00fe27cf68ae3f9d266709666/dubbo-common/src/main/java/com/alibaba/dubbo/common/utils/LRUCache.java#L22

  • LRUCache现在的实现未完成吗, LRU没体现出来啊
  • 现在是基于linkedhashmap, 用一个全局锁去guard线程安全, 为什么不采用ConcurrentHashMap的实现方式, 来提高并发呢?
typquestion & discussion

Most helpful comment

linkedHashMap 使用链表实现map,所以具备链表的特性,即删除最先加入的key,removeEldestEntry方法就是这个功能。也就是说它自带了类似lru的驱出key的能力。
具体代码:

public LruCache(URL url) {
        final int max = url.getParameter("cache.size", 1000);
        this.store = new LinkedHashMap<Object, Object>() {
            private static final long serialVersionUID = -3834209229668463829L;
            @Override
            protected boolean removeEldestEntry(Entry<Object, Object> eldest) {
                return size() > max;
            }
        };
    }

使用ConcurrentHashMap,就需要额外实现一套维护热点数据的算法,而dubbo在过去几年都没有维护,大多是使用者自己在master上自己维护的私有库,所以很多方面并不是非常优秀。
不过你应该知道dubbo的的扩展能力极强,有个好的架子,所以你完全可以自己实现lru,或者引入优秀的lru框架比如caffeine,来实现自己的需求。

All 2 comments

linkedHashMap 使用链表实现map,所以具备链表的特性,即删除最先加入的key,removeEldestEntry方法就是这个功能。也就是说它自带了类似lru的驱出key的能力。
具体代码:

public LruCache(URL url) {
        final int max = url.getParameter("cache.size", 1000);
        this.store = new LinkedHashMap<Object, Object>() {
            private static final long serialVersionUID = -3834209229668463829L;
            @Override
            protected boolean removeEldestEntry(Entry<Object, Object> eldest) {
                return size() > max;
            }
        };
    }

使用ConcurrentHashMap,就需要额外实现一套维护热点数据的算法,而dubbo在过去几年都没有维护,大多是使用者自己在master上自己维护的私有库,所以很多方面并不是非常优秀。
不过你应该知道dubbo的的扩展能力极强,有个好的架子,所以你完全可以自己实现lru,或者引入优秀的lru框架比如caffeine,来实现自己的需求。

@fucongchan 当前建议通过dubbo扩展机制接入更专业的cache框架

Was this page helpful?
0 / 5 - 0 ratings