簡體   English   中英

具有內存緩存的 Spring WebFlux

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM