Sprievodca jarným ukladaním do vyrovnávacej pamäte
1. Abstrakcia medzipamäte?
V tomto článku si ukážeme, ako na to použite na jar abstrakciu v pamäti - a všeobecne zvyšuje výkon vášho systému.
Pre niektoré príklady metód v reálnom svete povolíme jednoduché ukladanie do vyrovnávacej pamäte a budeme diskutovať o tom, ako môžeme pomocou správy inteligentných vyrovnávacích pamätí prakticky zlepšiť výkon týchto hovorov.
2. Začíname
Abstrakcia základného ukladania do medzipamäte, ktorú poskytuje Spring, spočíva v jarný kontext modul. Takže keď používate Maven, náš pom.xml by mala obsahovať nasledujúcu závislosť:
org.springframework spring-context 5.2.8.RELEASE
Je zaujímavé, že existuje ďalší pomenovaný modul jarná podpora kontextu, ktorý sedí na vrchole jarný kontext modul a poskytuje niekoľko ďalších CacheManagers podporované ako EhCache alebo Kofeín. Ak ich chcete použiť ako medzipamäť, použite jarna-kontextova-podpora modul namiesto toho:
org.springframework spring-context-support 5.2.8.RELEASE
Keďže jarna-kontextova-podpora modul prechodne závisí od jarný kontext pre modul nie je potrebné samostatné vyhlásenie o závislosti jarný kontext.
2.1. Jarná topánka
Ak ste používateľom Spring Boot, použite spring-boot-starter-cache štartovací balíček na ľahké pridanie závislostí do pamäte cache:
org.springframework.boot Spring-Boot-Starter-Cache 2.3.3. UVOĽNENIE
Pod kapotou štartér prináša jarna-kontextova-podpora modul.
3. Povoľte ukladanie do pamäte cache
Na povolenie ukladania do vyrovnávacej pamäte Spring dobre využíva anotácie, podobne ako povolenie akejkoľvek inej funkcie na úrovni konfigurácie v rámci.
Funkciu ukladania do pamäte cache je možné deklaratívne povoliť jednoduchým pridaním súboru @EnableCaching anotácia k niektorej z konfiguračných tried:
@Configuration @EnableCaching verejná trieda CachingConfig {@Bean public CacheManager cacheManager () {vrátiť nový ConcurrentMapCacheManager ("adresy"); }}
Môžete samozrejme povoliť správu medzipamäte pomocou XML konfigurácia tiež:
Poznámka: Po povolení ukladania do pamäte cache - kvôli minimálnemu nastaveniu - musíme zaregistrovať a cacheManager.
3.1. Používanie Spring Boot
Pri použití Spring Boot samotná prítomnosť štartovacieho balíka na triednej ceste popri EnableCaching anotácia by zaregistrovala to isté ConcurrentMapCacheManager. Nie je teda potrebné samostatné vyhlásenie o fazuli.
Automatickú konfiguráciu tiež môžeme prispôsobiť CacheManager pomocou jedného alebo viacerých CacheManagerCustomizer fazuľa:
@ Verejná trieda komponentu SimpleCacheCustomizer implementuje CacheManagerCustomizer {@Override public void customize (ConcurrentMapCacheManager cacheManager) {cacheManager.setCacheNames (asList ("users", "transakcie")); }}
The CacheAutoConfiguration automatická konfigurácia zachytí tieto prispôsobovacie prvky a použije ich na aktuálny CacheManager pred jeho úplnou inicializáciou.
4. Použite ukladanie do medzipamäte s anotáciami
Keď povolíme ukladanie do medzipamäte, ďalším krokom je vytvorenie väzby medzi ukladaním do pamäte a metódami pomocou deklaratívnych anotácií.
4.1. @Ukladateľný do medzipamäte
Najjednoduchší spôsob, ako povoliť metódu ukladania do pamäte cache, je vymedziť ju pomocou @Cacheeable a parametrizujte ho názvom cache, do ktorej by sa výsledky ukladali:
@Cacheable („adresy“) verejný reťazec getAddress (zákazník zákazníka) {...}
The getAddress () volanie najskôr skontroluje cache adresy pred skutočným vyvolaním metódy a následným uložením výsledku do medzipamäte.
Zatiaľ čo vo väčšine prípadov stačí jedna vyrovnávacia pamäť, rámec Spring podporuje aj viac vyrovnávacích pamätí, ktoré sa majú odovzdať ako parametre:
@Cacheable ({"adresy", "adresár"}) verejný reťazec getAddress (zákazník zákazníka) {...}
V takom prípade, ak ktorákoľvek z kešiek obsahuje požadovaný výsledok, výsledok sa vráti a metóda sa nevyvolá.
4.2. @CacheEvict
Aký by bol problém pri príprave všetkých metód @Cacheeable?
Problém je vo veľkosti - nechceme vyplniť cache hodnotami, ktoré často nepotrebujeme. Cache môžu rásť pomerne veľké, dosť rýchlo a my by sme sa mohli uchovať v množstve zastaraných alebo nevyužitých dát.
The @CacheEvict anotácia sa používa na označenie odstránenia jednej alebo viacerých / všetkých hodnôt - aby bolo možné znova načítať nové hodnoty do medzipamäte:
@CacheEvict (hodnota = "adresy", allEntries = true) verejný reťazec getAddress (zákazník zákazníka) {...}
Tu používame ďalší parameter allEntries v spojení s vyrovnávacou pamäťou, ktorá sa má vyprázdniť - vyčistiť všetky položky v vyrovnávacej pamäti adresy a pripraviť ju na nové údaje.
4.3. @CachePut
Zatiaľ čo @CacheEvict znižuje réžiu pri hľadaní položiek vo veľkej pamäti cache odstránením zastaraných a nepoužívaných položiek, v ideálnom prípade, ak chcete vyhnite sa vysťahovaniu príliš veľkého množstva dát z medzipamäte.
Namiesto toho by ste chceli selektívne a inteligentne aktualizovať položky, kedykoľvek sa zmenia.
Vďaka @CachePut anotácie, môžete aktualizovať obsah medzipamäte bez toho, aby ste narušili vykonávanie metódy. To znamená, že metóda by sa vždy vykonala a výsledok sa uložil do medzipamäte.
@CachePut (hodnota = "adresy") verejný reťazec getAddress (zákazník zákazníka) {...}
Rozdiel medzi @Cacheeable a @CachePut je to tak @Cacheeable bude preskočiť spustenie metódy, keďže @CachePut bude skutočne spustiť metódu a potom vložte svoje výsledky do pamäte cache.
4.4. @Ukladanie do vyrovnávacej pamäte
Čo ak chcete na uloženie metódy do medzipamäte použiť viac anotácií rovnakého typu. Pozrite sa na nesprávny príklad nižšie:
@CacheEvict ("adresy") @CacheEvict (hodnota = "adresár", kľúč = customer.name) verejný reťazec getAddress (zákazník zákazníka) {...}
Uvedený kód by sa nepodarilo skompilovať, pretože Java pre danú metódu neumožňuje deklarovať viac anotácií rovnakého typu.
Riešením vyššie uvedeného problému by bolo:
@Caching (evict = {@CacheEvict ("adresy"), @CacheEvict (hodnota = "adresár", key = "# customer.name")}) verejný reťazec getAddress (zákazník zákazníka) {...}
Ako je uvedené v útržku kódu vyššie, môžete zoskupiť viac poznámok do medzipamäte s @ Ukladanie do pamäte cachea použite ho na implementáciu vlastnej prispôsobenej logiky ukladania do pamäte cache.
4.5. @CacheConfig
Vďaka @CacheConfig anotáciu, môžete zefektívniť časť konfigurácie pamäte cache na jednom mieste - na úrovni triedy - aby ste nemuseli veci deklarovať viackrát:
@CacheConfig (cacheNames = {"adresy"}) verejná trieda CustomerDataService {@Cacheable public String getAddress (zákazník zákazníka) {...}
5. Podmienené ukladanie do pamäte cache
Niekedy nemusí byť ukladanie do pamäte cache pre danú metódu vhodné vo všetkých situáciách.
Napríklad - opätovné použitie nášho príkladu z @CachePut anotácia - vykoná sa táto metóda aj výsledky sa vždy uložia do medzipamäte:
@CachePut (hodnota = "adresy") verejný reťazec getAddress (zákazník zákazníka) {...}
5.1. Parameter podmienky
Teraz - ak chceme mať väčšiu kontrolu nad tým, kedy je anotácia aktívna - @CachePut možno parametrizovať parametrom podmienky, ktorý zaberá výraz SpEL, aby sa zabezpečilo, že sa výsledky uložia do medzipamäte na základe vyhodnotenia tohto výrazu:
@CachePut (hodnota = "adresy", podmienka = "# customer.name == 'Tom'") verejný reťazec getAddress (zákazník zákazníka) {...}
5.2. Pokiaľ nie je Parameter
Môžeme tiež ovládať ukladanie do pamäte cache založený skôr na výstupe metódy ako na vstupe - prostredníctvom pokiaľ parameter:
@CachePut (hodnota = "adresy", pokiaľ = "# result.length () <64") verejný reťazec getAddress (zákazník zákazníka) {...}
Vyššie uvedená anotácia by ukladala adresy do medzipamäte, pokiaľ nie sú kratšie ako 64 znakov.
Je dôležité vedieť, že stav a pokiaľ parametre je možné použiť v spojení so všetkými anotáciami uloženia do pamäte cache.
Tento druh podmieneného ukladania do pamäte cache sa môže ukázať ako celkom užitočný na správu veľkých výsledkov a prispôsobenie správania na základe vstupných parametrov namiesto presadzovania všeobecného správania pre všetky operácie.
6. Deklaratívne ukladanie do pamäte cache založené na XML
V prípade, že nemáte prístup k zdrojovému kódu svojej aplikácie alebo chcete externe vložiť správanie do pamäte cache, môžete použiť aj deklaratívne ukladanie do pamäte cache založené na XML.
Tu je naša konfigurácia XML:
7. Ukladanie do pamäte cache založené na prostredí Java
A tu je ekvivalentná konfigurácia Java:
@Configuration @EnableCaching verejná trieda CachingConfig {@Bean public CacheManager cacheManager () {SimpleCacheManager cacheManager = nový SimpleCacheManager (); cacheManager.setCaches (Arrays.asList (nový ConcurrentMapCache ("adresár"), nový ConcurrentMapCache ("adresy"))); vrátiť cacheManager; }}
A tu je náš CustomerDataService:
@Component public class CustomerDataService {@Cacheable (value = "addresses", key = "# customer.name") public String getAddress (zákazník zákazníka) {return customer.getAddress (); }}
8. Zhrnutie
V tomto článku sme diskutovali o základoch ukladania do vyrovnávacej pamäte na jar a o tom, ako túto abstrakciu dobre využiť pomocou anotácií.
Celú implementáciu tohto článku nájdete v projekte GitHub.