Spring Cache bez adnotacji

Spring Cache bez adnotacji
TE
  • Rejestracja:ponad 11 lat
  • Ostatnio:4 dni
  • Postów:67
0

Cześć!

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

baant
  • Rejestracja:ponad 11 lat
  • Ostatnio:2 miesiące
  • Lokalizacja:Wrocław
  • Postów:524
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

S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4708
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()


jeden i pół terabajta powinno wystarczyć każdemu
Zobacz pozostałe 2 komentarze
Charles_Ray
Czyli to taka zabawka do domowego pet project? :)
jarekr000000
Jeśli każdy Twój cache jaki robisz potrzebuje najbardziej wypasionych i wszystkich opcji, nie moze być prosty to tak - tylko zabawka. Ale akurat ja mam zabawki na produkcji - tacy klienci. Niepoważni.
jarekr000000
Sorry, jestem cięty na enterprise rozwiązania. Ale problem trochę jest. Widać, że przydałby się pakiet funkcyjnych rozwiązań - już 2 ata mija jak o tym wspominamy na różnych soędach - takie Java Enterprise Functional Edition. Można by wrzucić przerobione rozwiązania funkcyjne ( nawet oparte o VAVR): Transaction applicative, Cache, Security - może nawet IO. Wszystko to co ludzie czasem tworzą kawałkami w projektach. Z drugiej strony wyszłoby to zawsze trochę enterprisy i mnie sam koncept zniechęca... - sam nie wiem czy bym używał :-/
Charles_Ray
Doskonale to rozumiem, sam również poszukuję lekkich rozwiązań, aby nie strzelać z armaty do wróbla. Natomiast tak długo jak zespół dyżuruje nad aplikacją 24/7, tak będę stawiał na stabilność i monitoring :) aczkowiek jedno nie wyklucza drugiego, nie przekreślam Vavra.
nie100sowny
  • Rejestracja:około 9 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Kraków
  • Postów:402
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:

Kopiuj
      @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.


"Gdy się nie wie, co się robi, to się dzieją takie rzeczy, że się nie wie, co się dzieje"
edytowany 7x, ostatnio: nie100sowny
S9
To bardziej proxy niż decorator :P
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Postów:1875
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.


”Engineering is easy. People are hard.” Bill Coughran
edytowany 2x, ostatnio: Charles_Ray
Zobacz pozostały 1 komentarz
tomepaw
Niech zgadnę, OutOfMemory? :P
nie100sowny
Dlatego obowiązkowo powinno się ustawiać max cache size
Charles_Ray
IMO Spring nie powinien podkładać mapy jeśli sami nie dodamy providera albo szczeknąć warningiem, cokolwiek
TE
  • Rejestracja:ponad 11 lat
  • Ostatnio:4 dni
  • Postów:67
0

Dzięki wszystkim za wskazówki! :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.