Guava中的Cache简易源码分析
本文是用guava 18.0,本文讨论com.google.common.cache下的Cache
1、是什么?有什么用?
Cache是guava提供的一个工具缓存类。我们可以利用他缓存一些信息到本机的内存中。在框架,组件中会经常用到这个功能。例如,缓存一些用户信息
2、怎样用?
/**
* 如何将数据过期?(奇怪的想法,用定时器去删除内存的数据。)
* 在用户调用get方法的时候,去判断该key是否过期,如果过期就将value进行删除。
*/
Cache<Object, Object> localCache = CacheBuilder.newBuilder()
.maximumSize(1000) // 设置缓存的最大容量
.expireAfterWrite(1, TimeUnit.MINUTES)
.build();
localCache.put("testkey","testValue");
System.out.println(localCache.getIfPresent("testkey"));
System.out.println(localCache.get("1", new Callable<Object>() {
@Override
public Object call() throws Exception {
return "666";
}
}));
运行结果为:
testValue
666
3、简易源码分析
3.1、如何保存?
com.google.common.cache.LocalCache.LocalManualCache#put
---》com.google.common.cache.LocalCache#put
----》com.google.common.base.Equivalence.Equals#doHash # 拿key.hashCode() 值
------》com.google.common.cache.LocalCache#rehash # 对刚刚拿到的key hashcode进行rehash,为什么要这么干?应该是为了将key弄的更加分散些
-------》com.google.common.cache.LocalCache#segmentFor # 用刚刚得到的hash值,作为segments对象数组的索引(下标),找到对应的segment对象
--------》com.google.common.cache.LocalCache.Segment#put