Guava Cache的学习----https://github.com/google/guava
一、Guava的适用性
二、两种缓存的加载
1.第一种CacheLoader方式,返回的是LoadingCache对象,这个对象可以在build的时候对于返回值进行统一的计算
2.第二种Callable方式,返回的是Cache对象,get取值的时候可以自定义返回值的计算方式
三、源码解析
1.LocalCache可以看做是一个类似ConcurrentHashMap高性能的哈希表(其实结构完全一致,也包含segment,table等,只不过某些参数不一样)是线程安全的,但是其它线程并发修改了这个缓存,会显示在迭代器访问中,但是不会报ConcurrentModificationException错。默认使用equals方法(内容相同)判断key/value的相等,但如果申明了弱引用key 或者 弱/软引用的value,那么必须使用==判断相等(内存地址相同)
2.CacheBuilder:缓存构建器。构建缓存的入口,指定缓存配置参数并初始化本地缓存,通过build方法的参数不同,构建Cache和loadingCache,空参构建Cache,不空参构建LoadingCache。
3. Cache:接口,定义get、put、invalidate等操作,这里只有缓存增删改的操作,没有数据加载的操作。
4.LoadingCache:接口,继承自Cache。定义get、getUnchecked、getAll等操作,这些操作都会从数据源load数据。
5.LocalCache:类。整个guava cache的核心类,包含了guava cache的数据结构以及基本的缓存的操作方法。
6.LocalLoadingCache:LocalCache内部静态类,继承自LocalManualCache类,实现LoadingCache接口。其所有操作也是调用成员变量localCache(LocalCache类型)的相应方法。
B:流程解析
1.CacheBuilder.newBuilder().build(new CacheLoader(){...}) CacheBuilder参数设置完毕后最后调用build(CacheLoader )构造,参数是用户自定义的CacheLoader缓存加载器,复写一些方法(load,reload),返回LoadingCache接口(一种面向接口编程的思想,实际返回具体实现类),具体build()方法流程如2所示
1.1 build方法内部用LocalCache对象的内部类LocalLoadingCache中的构造方法,加载缓存类
1.2 具体构造方法做了一些什么呢?可以看到构造方法实际上又构造了一个LoaclCache的缓存类,从而构造一个CacheLoad类型的LocalCache类就这样初始化了。
2.LocalCache的get操作如下
四、缓存回收机制
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)