Spring Cache bez adnotacji

0

Cześć!

Czy ktoś ma pomysł jak pozbyć adnotacji do cachowania w Springu, podobnie tak jak z @Transactional w tej prezentacji ?

0

Nie wiem co tam spring czaruje z cachem, ale ostatnio używałem do prostego cachowania jednej małej rzeczy takiej libki: https://github.com/ben-manes/caffeine

3

W Vavr.io masz dwa gotowe rozwiązania.
Lazy -> do prostych wartości
FunctionX.memoized() - do dowolnych funkcji. Pewnie chodzi Ci o to drugie.
Przedstaw metodę jako Function2,3 czy co tam potrzebujesz, a potem tylko odpal .memoized()

2

@jarekr000000: Twoje rozwiązanie może co najwyżej zastąpić adnotację @Cacheable, często przydaje się również @CacheEvict

Jeżeli więć chcemy mieć cache, który się odświeża po zapisie napisałbym dekorator dla danej klasy. Przykładowo:

      @Value
    public class Settings{
        private final Long id;
    }

    public interface Repository<T, ID>{
        ID save(T settings);
        T find(ID id);
    }

    public class SettingsRepository implements Repository<Settings, Long>{

        @Override
        public Long save(Settings settings) {
            //bla bla bla
            return settings.getId();
        }

        @Override
        public Settings find(Long id) {
            //bla bla bla
            return null;
        }
    }


    public class CachingRepository<T, ID>  implements Repository<T, ID>{

        private final Repository<T, ID> repository;
        private final ConcurrentHashMap<ID, T> cache = new ConcurrentHashMap<>();

        public CachingRepository( Repository<T, ID> repository) {
            this.repository = repository;
        }
        
        @Override
        public ID save(T t) {
            ID saved = repository.save(t);
            cache.remove(saved);
            return saved;
        }

        @Override
        public T find(ID id) {
            return cache.computeIfAbsent(id, repository::find)
        }

    }


    Repository repo = new CachingRepository<>(new SettingsRepository());
    //jedziemy z koksem tryliard requestów / sekundę

Oczywiście to trywialny przykład na produkcji należałoby się upewnić, że repozytorium ma pojedynczą instancję, zbadać czy nie lepszy będzie jakiś caffeine, off heap etc.

0

@CacheEvict to zło, ogólnie cache czyszczony manualnie to proszenie się o problemy. No właśnie, co robi @Cacheable by default w Springu panowie inżynierowie? :) raz nam przez to wywaliło usługę na produkcji.

0

Dzięki wszystkim za wskazówki! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1