[英]Spring WebFlux with in memory cache
我正在使用 Spring Web 流量和番石榴緩存。 在一些示例中,他們使用 CacheMono.lookup 從緩存中檢索值。 我嘗試了相同的行並具有以下代碼。
CacheMono.lookup(key -> Mono.justOrEmpty(guavaCache.get(id, PhoneNumber.class))
.map(Signal::next), id)
.onCacheMissResume(() -> {
LOGGER.info("fetch from db");
return phoneNumberRepository.findById(id);})
.andWriteWith((key, signal) -> Mono.fromRunnable(() ->
Optional.ofNullable(signal.get())
.ifPresent(value -> {
if(value == null){
LOGGER.info("value is null");
}
LOGGER.info("value is not null "+value);
guavaCache.put(key, value);}))))
對於 guava 緩存不包含它從 db 獲取並存儲到緩存中的值時的初始流程。 但是對於同一個鍵,當我再次發送請求時,緩存具有該鍵的值。 但 CacheMono.lookup 仍在執行從 db 中獲取( I am seeing LOGGER.info("fetch from db");.
但同時我沒有看到日志LOGGER.info("value is not null "+value);
我對這種行為感到困惑。為什么當緩存已經有數據時第二次調用 onCacheMissResume 。
您會看到LOGGER.info("fetch from db")
因為每次CacheMono
創建Mono<PhoneNumber>
以從 db 獲取時都會調用它。 但是,如果該值存在於您的緩存中,則不會訂閱此Mono<PhoneNumber>
。
您可以通過登錄onSubscribe
事件來檢查它:
.onCacheMissResume(() -> {
LOGGER.info("fetch from db");
return phoneNumberRepository.findById(id)
.doOnSubscribe(ignored -> LOGGER.info("really fetching from db"));
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.