当我通过我的服务将数据插入数据库时以及直接将数据添加到数据库中时,如何刷新spring缓存。我们能实现这一目标吗?
注意:
我正在使用以下libs 1)net.sf.json-LIB 2)弹簧支持上下文
答案 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)处理。
希望这会给你一些想法。
干杯, 约翰