En guide til hurtigbufring om våren

1. Cache-abstraksjonen?

I denne artikkelen skal vi vise hvordan bruk Caching Abstraction om våren - og generelt forbedre ytelsen til systemet ditt.

Vi aktiverer enkel hurtigbufring for noen eksempler på virkelige metoder, og vi vil diskutere hvordan vi praktisk kan forbedre ytelsen til disse samtalene gjennom smart cacheadministrasjon.

2. Komme i gang

Kjernen caching abstraksjon levert av Spring ligger i vår-kontekst modul. Så når du bruker Maven, vår pom.xml bør inneholde følgende avhengighet:

 org.springframework spring-context 5.2.8.RELEASE 

Interessant, det er en annen modul som heter vår-kontekst-støtte, som sitter på toppen av vår-kontekst modul og gir noen flere CacheManagers støttet av slike som EhCache eller koffein. Hvis du skal bruke dem som cache-lagring, så bruk vår-kontekst-støtte modul i stedet:

 org.springframework spring-context-support 5.2.8.RELEASE 

Siden vår-kontekst-støtte modul avhenger transitt av vår-kontekst modul, er det ikke behov for en egen avhengighetserklæring for vår-kontekst.

2.1. Vårstøvel

Hvis du er en Spring Boot-bruker, bruk deretter spring-boot-starter-cache startpakke for enkelt å legge til hurtigavhengighet:

 org.springframework.boot spring-boot-starter-cache 2.3.3.RELEASE 

Under panseret bringer starteren vår-kontekst-støtte modul.

3. Aktiver hurtigbufring

For å aktivere caching bruker Spring notater godt, omtrent som å aktivere andre konfigurasjonsnivåfunksjoner i rammeverket.

Cache-funksjonen kan aktiveres erklærende ved å bare legge til @EnableCaching kommentar til noen av konfigurasjonsklassene:

@Configuration @EnableCaching offentlig klasse CachingConfig {@Bean offentlig CacheManager cacheManager () {returner ny ConcurrentMapCacheManager ("adresser"); }}

Du kan selvfølgelig aktivere hurtigadministrering med XML konfigurasjon også:

Merk: Etter at vi har aktivert caching - for minimalt oppsett - må vi registrere en cacheManager.

3.1. Bruke Spring Boot

Når du bruker Spring Boot, er det bare tilstedeværelsen av startpakken på klassestien ved siden av EnableCaching merknader ville registrere det samme ConcurrentMapCacheManager. Så det er ikke behov for en egen bønnedeklarasjon.

Vi kan også tilpasse den autokonfigurerte CacheManager bruker en eller flere CacheManagerCustomizer bønner:

@Component public class SimpleCacheCustomizer implementerer CacheManagerCustomizer {@Override public void customize (ConcurrentMapCacheManager cacheManager) {cacheManager.setCacheNames (asList ("brukere", "transaksjoner")); }}

De CacheAutoConfiguration automatisk konfigurasjon henter disse tilpasningene og bruker dem til gjeldende CacheManager før den ble fullstendig initialisert.

4. Bruk hurtigbufring med merknader

Når vi har aktivert caching, er neste trinn å binde caching-oppførselen til metodene med deklarative merknader.

4.1. @Cacheable

Den enkleste måten å aktivere hurtigbufring av en metode på er å avgrense den med @Cacheable og parameteriser den med navnet på hurtigbufferen der resultatene vil bli lagret:

@Cacheable ("adresser") offentlig String getAddress (kundekunde) {...} 

De getAddress () samtale vil først sjekke hurtigbufferen adresser før du faktisk påkaller metoden og deretter cacher resultatet.

Mens det i de fleste tilfeller er en cache nok, støtter Spring-rammeverket også flere cacher som skal sendes som parametere:

@Cacheable ({"adresser", "katalog"}) offentlig String getAddress (kundekunde) {...}

I dette tilfellet, hvis noen av hurtigbufferne inneholder det nødvendige resultatet, returneres resultatet, og metoden blir ikke påkalt.

4.2. @CacheEvict

Nå, hva ville være problemet med å lage alle metoder @Cacheable?

Problemet er størrelse - vi vil ikke fylle hurtigbufferen med verdier som vi ikke trenger ofte. Cacher kan vokse ganske store, ganske raskt, og vi kan holde på mange uaktuelle eller ubrukte data.

De @CacheEvict kommentar brukes til å indikere fjerning av en eller flere / alle verdier - slik at nye verdier kan lastes inn i hurtigbufferen igjen:

@CacheEvict (verdi = "adresser", allEntries = sant) offentlig String getAddress (kundekunde) {...}

Her bruker vi den ekstra parameteren allEntries i forbindelse med hurtigbufferen som skal tømmes - for å fjerne alle oppføringene i hurtigbufferen adresser og forberede den for nye data.

4.3. @CachePut

Samtidig som @CacheEvict reduserer kostnadene ved å slå opp oppføringer i en stor cache ved å fjerne foreldede og ubrukte oppføringer, helst du vil unngå å kaste for mye data ut av hurtigbufferen.

I stedet vil du selektivt og intelligent oppdatere oppføringene når de endres.

Med @CachePut kommentar, kan du oppdatere innholdet i hurtigbufferen uten å forstyrre kjøringen av metoden. Det vil si at metoden alltid vil bli utført og resultatet hurtigbufret.

@CachePut (verdi = "adresser") offentlig String getAddress (kundekunde) {...}

Forskjellen mellom @Cacheable og @CachePut er det @Cacheable vil hopp over å kjøre metoden, mens @CachePut vil faktisk kjøre metoden og legg deretter resultatene i hurtigbufferen.

4.4. @Caching

Hva om du vil bruke flere merknader av samme type for hurtigbufring av en metode. Se på feil eksempel nedenfor:

@CacheEvict ("adresser") @CacheEvict (verdi = "katalog", nøkkel = kunde.navn) offentlig String getAddress (kundekunde) {...}

Ovennevnte kode kunne ikke kompileres siden Java ikke tillater at flere merknader av samme type blir deklarert for en gitt metode.

Løsningen til ovennevnte utgave vil være:

@Caching (evict = {@CacheEvict ("adresser"), @CacheEvict (verdi = "katalog", nøkkel = "# kunde.navn")}) offentlig String getAddress (kundekunde) {...}

Som vist i kodebiten ovenfor, kan du gruppere flere caching-merknader med @Caching, og bruk den til å implementere din egen tilpassede cachelogikk.

4.5. @CacheConfig

Med @CacheConfig kommentar, kan du strømlinjeforme noe av hurtigbufferkonfigurasjonen til et enkelt sted - på klassenivå - slik at du ikke trenger å erklære ting flere ganger:

@CacheConfig (cacheNames = {"adresser"}) offentlig klasse CustomerDataService {@Cacheable public String getAddress (Kundekunde) {...}

5. Betinget hurtigbufring

Noen ganger fungerer caching kanskje ikke bra for en metode i alle situasjoner.

For eksempel - gjenbruk av eksemplet vårt fra @CachePut kommentar - dette vil både utføre metoden og cache resultatene hver gang:

@CachePut (verdi = "adresser") offentlig String getAddress (kundekunde) {...} 

5.1. Tilstandsparameter

Nå - hvis vi vil ha mer kontroll over når kommentaren er aktiv - @CachePut kan parametriseres med en tilstandsparameter som tar et SpEL-uttrykk for å sikre at resultatene blir bufret basert på evaluering av det uttrykket:

@CachePut (verdi = "adresser", tilstand = "# kunde.navn == 'Tom'") offentlig String getAddress (kundekunde) {...}

5.2. Med mindre parameter

Vi kan også kontrollere cachingen basert på utdataene fra metoden i stedet for inngangen - via med mindre parameter:

@CachePut (verdi = "adresser", med mindre = "# resultat.lengde () <64") offentlig String getAddress (kundekunde) {...}

Ovennevnte kommentar vil cache adresser med mindre de er kortere enn 64 tegn.

Det er viktig å vite at tilstand og med mindre parametere kan brukes sammen med alle caching-merknadene.

Denne typen betinget hurtigbufring kan vise seg å være ganske nyttig for å håndtere store resultater og tilpasse atferd basert på inndataparametere i stedet for å håndheve en generell oppførsel til alle operasjoner.

6. Deklarativ XML-basert caching

I tilfelle du ikke har tilgang til applikasjonens kildekode eller ønsker å injisere caching-oppførselen eksternt, kan du også bruke deklarativ XML-basert caching.

Her er vår XML-konfigurasjon:

7. Den Java-baserte cachingen

Og her er tilsvarende Java-konfigurasjon:

@Configuration @EnableCaching offentlig klasse CachingConfig {@Bean offentlig CacheManager cacheManager () {SimpleCacheManager cacheManager = ny SimpleCacheManager (); cacheManager.setCaches (Arrays.asList (ny ConcurrentMapCache ("katalog"), ny ConcurrentMapCache ("adresser"))); returner cacheManager; }}

Og her er vår CustomerDataService:

@Komponent offentlig klasse CustomerDataService {@Cacheable (verdi = "adresser", nøkkel = "# kunde.navn") offentlig String getAddress (kundekunde) {return customer.getAddress (); }}

8. Oppsummering

I denne artikkelen diskuterte vi det grunnleggende om Caching om våren og hvordan vi kan utnytte abstraksjonen godt med kommentarer.

Den fulle implementeringen av denne artikkelen finner du i GitHub-prosjektet.


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