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.


$config[zx-auto] not found$config[zx-overlay] not found