项目需要使用缓存,恰好缓存对象不适合存储为字符串,而且为了高性能希望能有过期时间和LRU特性。 LRU好办,直接集成JDK自带的LinkedHashMap,实现removeEldestEntry方法就行。 可是过期时间就需要自己实现了,实现思路到还不复杂,可以需要测试。最后还是决定找找看看现有类库是否已经提供该功能,首先想到的就是Guava,一看文档果然提供了这种类。
直接上代码
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder().maximumSize(1000).expireAfterWrite(10, TimeUnit.MINUTES).removalListener(MY_LISTENER).build(new CacheLoader<Key, Graph>() {
public Graph load(Key key) throws AnyException {
return createExpensiveGraph(key);}});
关于cache大小和过期时间,代码中直接可见不需要解释。
关于过期时间有两种选项一种是expireAfterWrite,一种是expireAfterAccess。我们项目中实际使用的expireAfterAccess, 我们希望如果这个key一致被访问化就一致有效,不要过期。 每个项目实际业务不同可以根据情况进行选择。
关于removalListener, 我们可以在对象因为过期时间到达或者因为LRU被替换时,调用一些destroy工作。
引用;
1, https://github.com/google/guava/wiki/CachesExplained