本篇文章是对Google的Guava中Cache进行一个源码级的分析,因为篇幅有限,而单单就LocalCache的量就达到了5000+行,还是有很多细节无法展现出来,富文本格式代码展示不太容易,就用了图片来替换.尽量让格式看起来好点.
Cache本质上就是ConcurrentMap,区别是:Cache除了拥有Map集合属性,为了内存使用还拥有可设置的自动移除的策略,而ConcurrentMap只是数据结构,会一直保存数据,直到显式移除.
提供了build方法的两种返回类型,其分别创建两种类型的缓存器,这两种类型的缓存器都属于LocalCache的内部类,
CacheBuilder的内部属性(下文有详细),会为LocalCache缓存的生命周期等操作赋值(注意看构造中参数):
1. 自动从数据源加载到缓存中 其是实现LoadingCache接口是对Cache接口的一个扩展,eg:实现了自动从CacheLoading中加载数据
我们可以想到当如果是继承了Cache接口就要实现从Callable中获取,如果继承了LoadingCache就可以提前从创建时候指定的CacheLoader中获取.
LocalCache是缓存的最终实现类,大部分逻辑代码都在改类中编写通过该类分析,该类中包含了很多的静态内部类和接口定义阅读源码学习
当你看到这里,相信你对Guava的设计架构已经有一个大概的认识,现在我们开始了解一下细节的问题
3. Cache的数据格式和ConcurrentMap是一样的,那么他的数据结构到底是什么样的?来提高效率的?
(首先设置默认值,当,this.值不等于默认值,说明已经赋值过,在赋值就报错),之所以说是细节,是因为大部分人不会注意到,学到就要用到奥!
Cache的数据格式和ConcurrentMap是一样的,那么他的数据结构到底是什么样的?来提高效率的?
我的步骤是这样的,因为当我们在添加缓存的时候,都默认是Strong强引用,guava既然支持引入回收,那么他肯定是在报错的时候,对我们的数据,进行了wrap
在setValue中我们找到了包装的代码:即将缓存的key和value包装为用户设置cache的引用方式
我们再来看Guava缓存中的引用是如何定义的! 这里不做详细介绍,如果不懂,可以看大部分Java程序猿所不了解的引用关系
相信当大家看到这里的时候,对CacheBuilder有正确的认识之后,基本就不用介绍了吧! 直接撸代码
网友评论 ()条 查看