作者回复: 你好,RocketMQ:关于 lru 的这个细节现象,观察的非常仔细,问的非常好。 关于 lru 在存储层面,具体的实现类是 LRU2Cache 这个类,同时这个 LRU2Cache 也是继承了 LinkedHashMap,说明 LRU2Cache 自己本身就是一个 Map 类型的派生类,但是呢 LRU2Cache 自己也持有了一个【private PreCache<K, Boolean> preCache】变量,该变量的容量默认是 1000。 可以看看这段 get/put 的代码: ======================== @Override public V get(Object key) { lock.lock(); try { return super.get(key); } finally { lock.unlock(); } } @Override public V put(K key, V value) { lock.lock(); try { if (preCache.containsKey(key)) { // add it to cache preCache.remove(key); return super.put(key, value); } else { // add it to history list preCache.put(key, true); return value; } } finally { lock.unlock(); } } ======================== LRU2Cache 在 get 的时候,总是从 LRU2Cache 自己的父类中去 get 数据,但是在 put 的时候,针对同一个 key 进行第二次 put 的时候才会放到 LRU2Cache 自己的父类中去。 这其实是 LRU2Cache 自身针对不常用的缓存数据一种考量,若请求的结果 R1 调用的频率极低的时候,那么 LRU2Cache 就会考虑优先将 R1 放到 preCache 中,在以后的 999 次请求中,R1 若还会被用到的话,那就会将 R1 转移到 LRU2Cache 的父类缓存中去;若在以后的 999 次请求中还是不会用到 R1 的话,那么就只好依赖 PreCache#removeEldestEntry 方法移除这种百八十年不动的“僵尸冷数据”。
作者回复: 你好,飞飞:实际开发这个问的好,我只是众多实际开发中的一员,不能以点代面。看不同开发人员的诉求,如果不想引入其他框架或不想写,也可以直接使用 dubbo 的,又或者有些公司主推使用 dubbo 特性啥的,也可能有其他特别喜好使用 dubbo 人员啥的,这个都不不好说,具体场景具体问题,因地制宜看待罢了,只要适合自己的就好。
作者回复: 你好,Lum:这个我教你一个墨守成规的快速找到的方式,在源码的【org.apache.dubbo.cache】包下,进行【Ctrl + Shift + F】快捷键搜索,然后输入【"cache.】这样的内容,然后就可以快速看到哪些是与时间相关的配置参数键了。
作者回复: 你好,杨老师:这个看不同人的喜好吧~如果是少部分接口,或者是少部分系统内部的功能,需要使用缓存的话,怎么书写都无大碍。 但是如果一旦这种少部分功能的慢慢累积增多时,就得慢慢考虑雷同重复代码的抽象封装了,至于是考虑在Dubbo层面扩展,还是自行横切拦截扩展,那只是不同的方式而已。 而直接在 Dubbo 层面扩展,意思就很明确,缓存的粒度,就是调用下游的接口,或者系统暴露的接口,比较精准聚焦。 而除了需要对Dubbo的接口进行缓存,还需要对一些数据库的查询操作,系统内的业务聚合操作做缓存的话,那么Dubbo框架就无法满足了,这个时候就得考虑自定义横切拦截了。
作者回复: 你好,星期八:是的,我们可以试着反推一下,如果缓存调用前的数据,可是调用之前还不知道调用结果,那缓存什么呢?缓存空对象么?如果缓存空对象的话,那么当接收消费方请求时,提供方发现有一个空对象缓存,如果把空对象返回给消费方,从功能的角度来说,功能是有缺失的,不加缓存还能拿到数据,加了缓存反而拿到一个空对象,明显不是消费方想要的结果。
作者回复: 你好,Mandone:哈哈,好像是哦,自问自答啦,没关系啦,发现问题,找到问题,解答疑惑,这挺好的,非常棒~
作者回复: 你好,Mandone:在这个 javax.cache.Caching.CachingProviderRegistry#getCachingProvider(java.lang.ClassLoader) 方法中,会进行判断,如果利用 SPI 机制加载 CachingProvider 的所有实现类后,发现有多个实现类则会抛出异常的,抛出的异常信息代码为:throw new CacheException("Multiple CachingProviders have been configured when only a single CachingProvider is expected")。