【发布时间】:2015-09-07 10:17:18
【问题描述】:
当我通过我的服务将数据插入数据库时,以及当我将数据直接添加到数据库中时,我如何刷新 spring 缓存。我们可以做到这一点吗?
注意:
我正在使用以下库 1)net.sf.json-lib 2)spring-support-context
【问题讨论】:
标签: spring-cache
当我通过我的服务将数据插入数据库时,以及当我将数据直接添加到数据库中时,我如何刷新 spring 缓存。我们可以做到这一点吗?
注意:
我正在使用以下库 1)net.sf.json-lib 2)spring-support-context
【问题讨论】:
标签: spring-cache
通过我的服务
这通常在应用程序的服务(例如@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 的用户指南文档“How Data Loaders Work”作为示例和更多详细信息。
所以,回到我们的示例,如果“Book (Store)”数据库独立于应用程序进行更新(使用 Spring 的 Caching Annotation 支持和基础设施),那么开发人员只需要定义缓存未命中的策略。而且,在 GemFire 中,这可能是 CacheLoader,而当...
bookService.find(<some isbn>);
被调用导致“缓存未命中”,GemFire 的 CacheLoader 将启动,使用该书加载缓存,Spring 会将其视为“缓存命中”。
当然,我们的 bookService.find(..) 实现无论如何都转到了底层数据库,但它只检索“单一”书。可以实现一个加载器以根据某些标准(例如受欢迎程度)填充整个图书集(或范围),其中应用程序服务期望潜在客户首先使用应用程序搜索这些特定的图书集,并预先缓存它们。
因此,虽然 Spring 的 Cache 注释通常对每个条目起作用,但缓存存储特定的策略可用于预取,并且在第一次缓存未命中时以一种方式“刷新”缓存。
总之,虽然前者可以由 Spring 处理,但“刷新”通常由缓存提供程序(例如 GemFire)处理。
希望这能给你一些想法。
干杯, 约翰
【讨论】: