Introduksjon til Ehcache

1. Oversikt

I denne artikkelen vil vi introdusere Ehcache, en mye brukt, åpen kildekode Java-basert hurtigbuffer. Den har minne- og diskbutikker, lyttere, cache-lastere, RESTful og SOAP API-er og andre svært nyttige funksjoner.

For å vise hvordan hurtigbufring kan optimalisere applikasjonen vår, vil vi lage en enkel metode som beregner kvadratverdier for oppgitte tall. Ved hver samtale vil metoden ringe calcSquareOfNumber (int-nummer) metode og skrive ut informasjonsmelding til konsollen.

Med dette enkle eksemplet vil vi vise at beregning av kvadratiske verdier bare gjøres en gang, og alle andre anrop med samme inngangsverdi returnerer resultatet fra hurtigbufferen.

Det er viktig å legge merke til at vi fokuserer helt på Ehcache selv (uten vår); Hvis du vil se hvordan Ehcache fungerer med Spring, kan du lese denne artikkelen.

2. Maven-avhengigheter

For å bruke Ehcache må vi legge til denne Maven-avhengigheten:

 org.ehcache ehcache 3.1.3 

Den siste versjonen av Ehcache-gjenstanden finner du her.

3. Cache-konfigurasjon

Ehcache kan konfigureres på to måter:

  • Den første måten er gjennom Java POJO der alle konfigurasjonsparametere er konfigurert via Ehcache API
  • Den andre måten er konfigurasjon gjennom XML-fil hvor vi kan konfigurere Ehcache i henhold til gitt skjemadefinisjon

I denne artikkelen viser vi begge tilnærminger - Java så vel som XML-konfigurasjon.

3.1. Java-konfigurasjon

Dette underavsnittet viser hvor enkelt det er å konfigurere Ehcache med POJOer. Vi vil også lage en hjelperklasse for enklere cache-konfigurasjon og tilgjengelighet:

offentlig klasse CacheHelper {private CacheManager cacheManager; private Cache squareNumberCache; offentlig CacheHelper () {cacheManager = CacheManagerBuilder .newCacheManagerBuilder (). build (); cacheManager.init (); squareNumberCache = cacheManager .createCache ("squaredNumber", CacheConfigurationBuilder .newCacheConfigurationBuilder (Integer.class, Integer.class, ResourcePoolsBuilder.heap (10))); } offentlig Cache getSquareNumberCacheFromCacheManager () {return cacheManager.getCache ("squaredNumber", Integer.class, Integer.class); } // standard getters and setters}

For å initialisere cachen vår, må vi først definere Ehcache CacheManager gjenstand. I dette eksemplet lager vi en standard hurtigbuffer squaredNumber ” med newCacheManagerBuilder () API.

Cachen vil ganske enkelt tilordnes Heltall nøklene til Heltall verdier.

Legg merke til hvordan, før vi begynner å bruke den definerte hurtigbufferen, må vi initialisere CacheManager objekt med i det() metode.

Til slutt, for å skaffe cache, kan vi bare bruke getCache () API med oppgitt navn, nøkkel og verdityper for cachen vår.

Med de få linjene opprettet vi vår første cache som nå er tilgjengelig for applikasjonen vår.

3.2. XML-konfigurasjon

Konfigurasjonsobjektet fra underavsnitt 3.1. er lik å bruke denne XML-konfigurasjonen:

 java.lang.Integer java.lang.Integer 10 

Og for å inkludere denne hurtigbufferen i Java-applikasjonen vår, må vi lese XML-konfigurasjonsfilen i Java:

URL myUrl = getClass (). GetResource (xmlFile); XmlConfiguration xmlConfig = ny XmlConfiguration (myUrl); CacheManager myCacheManager = CacheManagerBuilder .newCacheManager (xmlConfig);

4. Ehcache-test

I avsnitt 3. viste vi hvordan du kan definere enkel cache for dine formål. For å vise at caching faktisk fungerer, vil vi lage SquaredCalculator klasse som vil beregne kvadratverdi for den angitte inngangen, og lagre beregnet verdi i en cache.

Selvfølgelig, hvis hurtigbufferen allerede inneholder beregnet verdi, returnerer vi hurtigbufret verdi og unngår unødvendige beregninger:

offentlig klasse SquaredCalculator {private CacheHelper cache; public int getSquareValueOfNumber (int input) {if (cache.getSquareNumberCache (). containKey (input)) {return cache.getSquareNumberCache (). get (input); } System.out.println ("Beregning av kvadratverdi av" + input + "og cache-resultat."); int squaredValue = (int) Math.pow (input, 2); cache.getSquareNumberCache (). put (input, squaredValue); returner squaredValue; } // standard getters og setters; }

For å fullføre testscenariet trenger vi også koden som beregner kvadratverdier:

@Test offentlig ugyldig nårCalculatingSquareValueAgain_thenCacheHasAllValues ​​() {for (int i = 10; i <15; i ++) {assertFalse (cacheHelper.getSquareNumberCache (). ContainKey (i)); System.out.println ("Firkantet verdi av" + i + "er:" + squaredCalculator.getSquareValueOfNumber (i) + "\ n"); } for (int i = 10; i <15; i ++) {assertTrue (cacheHelper.getSquareNumberCache (). containKey (i)); System.out.println ("Firkantet verdi av" + i + "er:" + squaredCalculator.getSquareValueOfNumber (i) + "\ n"); }}

Hvis vi kjører testen vår, får vi dette resultatet i konsollen:

Beregning av kvadratverdi på 10 og cache-resultat. Kvadratverdi på 10 er: 100 Beregning av kvadratverdi på 11 og cache-resultat. Kvadratverdi på 11 er: 121 Beregning av kvadratverdi på 12 og cache-resultat. Kvadratverdi på 12 er: 144 Beregning av kvadratverdi på 13 og cache-resultat. Kvadratverdi på 13 er: 169 Beregning av kvadratverdi på 14 og cache-resultat. Kvadratverdi på 14 er: 196 Kvadratverdi på 10 er: 100 Kvadratverdi på 11 er: 121 Kvadratverdi på 12 er: 144 Kvadratverdi på 13 er: 169 Kvadratverdi på 14 er: 196

Som du kan merke, regne ut() metoden var å gjøre beregninger bare ved første samtale. Ved den andre samtalen ble alle verdiene funnet i hurtigbufferen og returnert fra den.

5. Andre konfigurasjonsalternativer for Ehcache

Da vi opprettet cachen vår i forrige eksempel, var det en enkel cache uten spesielle alternativer. Denne delen vil vise andre alternativer som er nyttige for oppretting av hurtigbuffer.

5.1. Diskpersistens

Hvis det er for mange verdier å lagre i hurtigbufferen, kan vi lagre noen av disse verdiene på harddisken.

PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder () .with (CacheManagerBuilder.persistence (getStoragePath () + File.separator + "squaredValue")) .withCache ("persistent-cache", CacheConfigurationBassett .newResourcePoolsBuilder () .heap (10, EntryUnit.ENTRIES) .disk (10, MemoryUnit.MB, true))) .build (true); persistentCacheManager.close ();

I stedet for standard CacheManager, bruker vi nå PersistentCacheManager som vil vedvare alle verdier som ikke kan lagres i minnet.

Fra konfigurasjonen kan vi se at hurtigbufferen vil lagre 10 elementer i minnet, og den vil tildele 10 MB på harddisken for vedvaring.

5.2. Data utløper

Hvis vi hurtigbufrer mye data, er det naturlig at vi lagrer hurtigbufrede data i en periode, slik at vi kan unngå stor minnebruk.

Ehcache kontrollerer datafriskhetstrog Utløp grensesnitt:

CacheConfiguration cacheConfiguration = CacheConfigurationBuilder .newCacheConfigurationBuilder (Integer.class, Integer.class, ResourcePoolsBuilder.heap (100)) .withExpiry (Expirations.timeToLiveExpiration (Duration.of (60, TimeUnit.SECONDS))

I denne hurtigbufferen vil alle data leve i 60 sekunder, og etter den perioden vil de bli slettet fra minnet.

6. Konklusjon

I denne artikkelen viste vi hvordan du bruker enkel Ehcache-hurtigbufring i et Java-program.

I vårt eksempel så vi at selv en enkelt konfigurert cache kan spare mange unødvendige operasjoner. Vi viste også at vi kan konfigurere cacher gjennom POJOs og XML, og at Ehcache har ganske mange fine funksjoner - for eksempel utholdenhet og utløp av data.

Som alltid kan koden fra denne artikkelen bli funnet på GitHub.