2

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

笔记:

我正在使用以下库 1)net.sf.json-lib 2)spring-support-context

4

1 回答 1

1

通过我的服务

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

@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 的用户指南文档“数据加载器如何工作”作为示例和更多详细信息。

因此,回到我们的示例,如果“Book (Store)”数据库独立于应用程序进行更新(使用 Spring 的 Caching Annotation 支持和基础设施),那么开发人员只需定义缓存未命中的策略。而且,在 GemFire 中,这可能是一个CacheLoader,而当...

bookService.find(<some isbn>);

调用导致“缓存未命中”,GemFire 的 CacheLoader 将启动,使用该书加载缓存,Spring 会将其视为“缓存命中”。

当然,我们的 bookService.find(..) 实现还是去了底层数据库,但它只检索“单一”书。可以实现一个加载器以根据某些标准(例如受欢迎程度)填充整个图书集(或范围),其中应用程序服务期望潜在客户首先使用应用程序搜索这些特定的图书集,并预先缓存它们。

因此,虽然 Spring 的 Cache 注释通常对每个条目起作用,但缓存存储特定策略可用于预取,并且以一种方式,在第一次缓存未命中时懒惰地“刷新”缓存。

总之,虽然前者可以由 Spring 处理,但“刷新”通常由缓存提供程序(例如 GemFire)处理。

希望这能给你一些想法。

干杯,约翰

于 2015-09-09T17:25:29.633 回答