Guava教程-Cache讲解
来源:互联网 发布:纸白银行情软件 编辑:程序博客网 时间:2024/06/17 01:36
概述
缓存是日常开发中经常应用到的一种技术手段,合理的利用缓存可以极大的改善应用程序的性能。
Guava官方对Cache的描述
Caches are tremendously useful in a wide variety of use cases. For example, you should consider using caches when a value is expensive to compute or retrieve, and you will need its value on a certain input more than once.
A Cache is similar to ConcurrentMap, but not quite the same. The most fundamental difference is that a ConcurrentMap persists all elements that are added to it until they are explicitly removed. A Cache on the other hand is generally configured to evict entries automatically, in order to constrain its memory footprint. In some cases a LoadingCache can be useful even if it doesn’t evict entries, due to its automatic cache loading.
适用场景
- You are willing to spend some memory to improve speed.
- You expect that keys will sometimes get queried more than once.
- Your cache will not need to store more data than what would fit inRAM. (Guava caches are local to a single run of your application.
They do not store data in files, or on outside servers. If this does
not fit your needs, consider a tool like Memcached.)
实战
maven依赖
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version></dependency>
Cache API
一、创建
Guava Cache有以下两种创建方式:
- CacheLoader
- Callable
1、通过CacheLoader
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() .maximumSize(1000) .expireAfterWrite(10, TimeUnit.MINUTES) .build( new CacheLoader<Key, Graph>() { public Graph load(Key key) throws AnyException { return createExpensiveGraph(key); } });
然后,我们可以通过 V LoadingCache.get(K key) 方法来获取cache
try { return graphs.get(key);} catch (ExecutionException e) { throw new OtherException(e.getCause());}
也可以不处理异常
return graphs.getUnchecked(key);
2、通过Callable
Cache<Key, Value> cache = CacheBuilder.newBuilder() .maximumSize(1000) .build();
然后通过Cache.get(String arg0, Callable
try { // If the key wasn't in the "easy to compute" group, we need to // do things the hard way. cache.get(key, new Callable<Value>() { @Override public Value call() throws AnyException { return doThingsTheHardWay(key); } });} catch (ExecutionException e) { throw new OtherException(e.getCause());}
二、显式插入
使用cache.put(key, value)方法可以直接向缓存中插入值,这会直接覆盖掉给定键之前映射的值。
例如:
cache.put(key, value)
三、清除
1、基于大小
通过CacheBuilder.maximumSize(long)指定缓存容量大小,如下:
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() .maximumSize(1000) .build( new CacheLoader<Key, Graph>() { public Graph load(Key key) throws AnyException { return createExpensiveGraph(key); } });
另外,如果缓存值占据完全不同的内存空间,可以使用CacheBuilder.maximumWeight(long)指定最大总重,如下:
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() .maximumWeight(100000) .weigher(new Weigher<Key, Graph>() { public int weigh(Key k, Graph g) { return g.vertices().size(); } }) .build( new CacheLoader<Key, Graph>() { public Graph load(Key key) { // no checked exception return createExpensiveGraph(key); } });
2、基于时间
CacheBuilder provides two approaches to timed eviction:
- expireAfterAccess(long, TimeUnit) Only expire entries after the
specified duration has passed since the entry was last accessed by a
read or a write. Note that the order in which entries are evicted
will be similar to that of size-based eviction. - expireAfterWrite(long, TimeUnit) Expire entries after the specified
duration has passed since the entry was created, or the most recent
replacement of the value. This could be desirable if cached data
grows stale after a certain amount of time.
例如:
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() .expireAfterAccess(10, TimeUnit.MINUTES) .build( new CacheLoader<Key, Graph>() { public Graph load(Key key) { // no checked exception return createExpensiveGraph(key); } });
四、显示删除
At any time, you may explicitly invalidate cache entries rather than waiting for entries to be evicted. This can be done:
- individually, using Cache.invalidate(key)
- in bulk, using Cache.invalidateAll(keys)
- to all entries, using Cache.invalidateAll()
参考文档
Guava User Guide:https://github.com/google/guava/wiki
http://ifeve.com/google-guava-cachesexplained/
- Guava教程-Cache讲解
- guava cache
- Guava cache
- Guava-cache
- Guava Cache
- guava cache
- Guava学习笔记:Guava cache
- Guava学习笔记:Guava cache
- Guava学习笔记:Guava cache
- Guava学习笔记:Guava cache
- Guava学习笔记:Guava cache
- Guava学习笔记:Guava cache
- Guava学习笔记:Guava cache
- Guava学习笔记:Guava cache
- Cache高速缓存guava-libraries Cache
- Guava Cache之Cache接口
- Guava教程
- Guava教程
- 海量数据处理面试题与十个方法大总结
- PHP
- android studio native 方法一直显示 红色
- HQl查询例子和讲解(转载的!---)
- js柯里化
- Guava教程-Cache讲解
- _stdcall和_cdecl区别
- GEF原理及实现系列(七、模型同步)
- Fiddler调式使用知多少(一)深入研究
- zynq PS侧DMA驱动
- GEF原理及实现系列(八、选项板)
- Java 与 邮件发送
- 什么是sql绑定变量?怎么实现绑定变量?
- 拖拽任意元素