Önbelleğe alınmış Spring WebFlux

Sep 09 2020

Spring web flux ve guava cache kullanıyorum. Bazı örneklerde, değeri önbellekten almak için CacheMono.lookup kullanıyorlar. Aynı satırları denedim ve aşağıdaki kodu aldım.

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 önbelleği, db'den getirdiği ve önbelleğe depoladığı değeri içermediğinde ilk akış için. Ancak aynı anahtar için isteği tekrar gönderdiğimde, önbellekte anahtar değeri var. Ancak CacheMono.lookup hala db'den getirme işlemini yürütüyor ( I am seeing LOGGER.info("fetch from db");.Ama aynı zamanda günlükleri görmüyorum LOGGER.info("value is not null "+value);, bu davranışla kafam karıştı. Önbellekte veriler zaten varken neden onCacheMissResume 2. kez çağrılır.

Yanıtlar

3 AlexanderPankin Sep 10 2020 at 07:32

Görüyorsunuz LOGGER.info("fetch from db")çünkü her CacheMonooluşturulduğunda Mono<PhoneNumber>db'den getirilmek için çağrılıyor . Ancak Mono<PhoneNumber>değer önbelleğinizde mevcutsa bu abone olmayacaktır.

Günlük onSubscribeolayı ile inceleyebilirsiniz :

.onCacheMissResume(() -> {
    LOGGER.info("fetch from db");
    return phoneNumberRepository.findById(id)
        .doOnSubscribe(ignored -> LOGGER.info("really fetching from db"));
})