Spring为缓存昂贵的方法调用提供了强大的开箱即用支持。 这里详细介绍了缓存抽象。
我的目的是要介绍Spring现在为框架的4.0+版本提供的较新的缓存实现之一-使用Google Guava Cache
简而言之,请考虑一种具有几种慢速方法的服务:
public class DummyBookService implements BookService {@Overridepublic Book loadBook(String isbn) {// Slow method 1.}@Overridepublic List<Book> loadBookByAuthor(String author) {// Slow method 2}}
借助Spring Caching抽象,可以通过在这些行上使用方法上的注释来加快具有相同参数的重复调用–在这里,loadBook的结果被缓存到“ book”缓存中,而缓存的图书清单又被缓存到另一个“ books”快取:
public class DummyBookService implements BookService {@Override@Cacheable("book")public Book loadBook(String isbn) {// slow response time..}@Override@Cacheable("books")public List<Book> loadBookByAuthor(String author) {// Slow listing}
}
现在,对缓存抽象的支持需要一个CacheManager可用,该CacheManager负责管理基础缓存以存储缓存的结果,而对于新的Guava Cache支持,CacheManager遵循以下原则:
@Bean
public CacheManager cacheManager() {return new GuavaCacheManager("books", "book");
}
Google Guava Cache提供了丰富的API,能够预加载缓存,根据上次访问或创建时间设置驱逐时间,设置缓存的大小等,如果要自定义缓存,则可以传递guava CacheBuilder到CacheManager进行此自定义:
@Bean
public CacheManager cacheManager() {GuavaCacheManager guavaCacheManager = new GuavaCacheManager();guavaCacheManager.setCacheBuilder(CacheBuilder.newBuilder().expireAfterAccess(30, TimeUnit.MINUTES));return guavaCacheManager;
}
如果所有缓存都具有相似的配置,则此方法效果很好,如果需要对缓存进行不同的配置(例如),该怎么办。 在上面的示例中,我可能希望“书”缓存永不过期,但“书”缓存具有30分钟的过期时间,那么GuavaCacheManager抽象不能很好地工作,相反,更好的解决方案是实际上使用SimpleCacheManager提供了一种更直接的方法来获取缓存,并且可以通过以下方式进行配置:
@Bean
public CacheManager cacheManager() {SimpleCacheManager simpleCacheManager = new SimpleCacheManager();GuavaCache cache1 = new GuavaCache("book", CacheBuilder.newBuilder().build());GuavaCache cache2 = new GuavaCache("books", CacheBuilder.newBuilder().expireAfterAccess(30, TimeUnit.MINUTES).build());simpleCacheManager.setCaches(Arrays.asList(cache1, cache2));return simpleCacheManager;
}
如果需要,可以将某些缓存配置为由不同的缓存引擎本身来支持,例如简单的哈希映射,一些由Guava或EhCache进行缓存,某些由诸如Gemfire的分布式缓存支持,则此方法非常有效。
翻译自: https://www.javacodegeeks.com/2014/11/spring-caching-abstraction-and-google-guava-cache.html