在Spring中刷新缓存

时间:2015-09-07 10:17:19

标签: spring-cache

当我通过我的服务将数据插入数据库时​​以及直接将数据添加到数据库中时,如何刷新spring缓存。我们能实现这一目标吗?

注意:

我正在使用以下libs 1)net.sf.json-LIB 2)弹簧支持上下文

1 个答案:

答案 0 :(得分:0)

  

通过我的服务

这通常使用Spring @Cacheable@CachePut注释在您的应用程序服务(例如@Service应用程序组件)中实现,例如......

@Service
class BookService {

  @Cacheable("Books")
  Book findBook(ISBN isbn) {
    ...
    return booksRepository().find(isbn);
  }

  @CachePut(cacheNames = "Books", key = "#book.isbn")
  Book update(Book book) {
    ...
    return booksRepository.save(book);
  }
}

@Cacheable@CachePut都将更新缓存提供程序,因为底层方法可以回调到底层数据库。

  

当我直接将数据添加到数据库

这通常由底层缓存存储实现。例如,在 GemFire 中,您可以使用CacheLoader来"通读" (可能是你的底层数据库)"缓存未命中"。请参阅GemFire的用户指南文档"如何Data Loaders Work"作为一个例子和更多细节。

所以,回到我们的例子,如果" Book(Store)"数据库是独立于应用程序更新的(使用Spring的缓存注释支持和基础结构),然后开发人员只需要定义缓存未命中的策略。而且,在GemFire中可能是CacheLoader,当......

bookService.find(<some isbn>);

被调用导致&#34;缓存未命中&#34;,GemFire的CacheLoader将启动,用该书加载缓存,Spring将其视为&#34;缓存命中&#34;

当然,我们对bookService.find(..)的实现无论如何都去了底层数据库,但它只检索了一个&#34;单个&#34;书。可以实现加载器以基于某些标准(例如流行度)来填充整个集合(或范围)的书籍,其中应用程序服务期望潜在客户搜索那些特定的书籍集合,首先,使用该应用程序并预先缓存它们。

因此,虽然Spring的缓存注释通常适用于每个条目,但缓存存储特定的策略可用于预取,并且在某种程度上,&#34;刷新&#34;懒惰地,在第一次缓存未命中时缓存。

总之,虽然前者可以由Spring处理,但是&#34;刷新&#34;每个人通常由缓存提供商(例如GemFire)处理。

希望这会给你一些想法。

干杯, 约翰