當我通過服務將數據插入到數據庫時,以及何時將數據直接添加到數據庫中時,如何更新彈簧緩存?我們可以實現這一目標嗎?在Spring中刷新緩存
注:
我使用下面庫 1)net.sf.json-lib的 2)彈簧支持上下文
當我通過服務將數據插入到數據庫時,以及何時將數據直接添加到數據庫中時,如何更新彈簧緩存?我們可以實現這一目標嗎?在Spring中刷新緩存
注:
我使用下面庫 1)net.sf.json-lib的 2)彈簧支持上下文
通過我的服務
這是通常通過使用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對「緩存未命中」進行「讀取」(對您的底層數據庫)。以「如何Data Loaders Work」爲例和更多細節參見GemFire的用戶指南文檔。所以,回到我們的例子,如果「Book(Store)」數據庫獨立於應用程序更新(使用Spring的緩存註釋支持和基礎架構),那麼開發人員只需要定義緩存未命中策略。而且,在的GemFire這可能是一個CacheLoader
,當...
bookService.find(<some isbn>);
被稱爲導致「高速緩存未命中」的GemFire的緩存加載器會踢,裝載有這本書和Spring緩存會看到它作爲一個「緩存命中」。
當然,我們的bookService.find(..)的實現無論如何都進入了底層數據庫,但它只能檢索一本「單一」書籍。可以實現加載器以基於某些標準(例如流行度)來填充書籍的整個集合(或範圍),其中應用服務期望潛在客戶使用該應用搜索那些特定集合的書籍,首先,並預先緩存它們。
因此,儘管Spring的Cache註釋通常對每個條目都有效,但緩存存儲專用策略可用於在第一次高速緩存未命中時預取並以一種方式「緩慢」刷新高速緩存。總之,雖然前者可以由Spring處理,但每次說出的「刷新」通常由緩存提供者(例如GemFire)處理。
希望這給你一些想法。
乾杯, 約翰