Introduktion til Ehcache

1. Oversigt

I denne artikel introducerer vi Ehcache, en meget anvendt, open source Java-baseret cache. Den har hukommelses- og diskbutikker, lyttere, cache-loadere, RESTful og SOAP API'er og andre meget nyttige funktioner.

For at vise, hvordan caching kan optimere vores applikation, opretter vi en enkel metode, der beregner kvadratværdier for de angivne tal. Ved hvert opkald kalder metoden calcSquareOfNumber (int-nummer) metode og udskrive informationsmeddelelse til konsollen.

Med dette enkle eksempel vil vi vise, at beregning af kvadratiske værdier kun udføres en gang, og hvert andet opkald med samme inputværdi returnerer resultatet fra cachen.

Det er vigtigt at bemærke, at vi er helt fokuseret på Ehcache selv (uden forår); hvis du vil se, hvordan Ehcache fungerer med Spring, skal du kigge på at læse denne artikel.

2. Maven-afhængigheder

For at bruge Ehcache skal vi tilføje denne Maven-afhængighed:

 org.ehcache ehcache 3.1.3 

Den seneste version af Ehcache-artefakten kan findes her.

3. Cache-konfiguration

Ehcache kan konfigureres på to måder:

  • Den første vej er gennem Java POJO, hvor alle konfigurationsparametre er konfigureret via Ehcache API
  • Den anden måde er konfiguration gennem XML-fil, hvor vi kan konfigurere Ehcache i henhold til den angivne skemadefinition

I denne artikel viser vi begge tilgange - Java såvel som XML-konfiguration.

3.1. Java-konfiguration

Dette underafsnit viser, hvor let det er at konfigurere Ehcache med POJO'er. Vi opretter også en hjælperklasse for lettere cache-konfiguration og tilgængelighed:

offentlig klasse CacheHelper {privat 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 og setters}

For at initialisere vores cache skal vi først definere Ehcache CacheManager objekt. I dette eksempel opretter vi en standardcache squaredNumber ” med newCacheManagerBuilder () API.

Cachen kortlægges simpelthen Heltal nøgler til Heltal værdier.

Bemærk hvordan vi, før vi begynder at bruge den definerede cache, skal initialisere CacheManager objekt med i det() metode.

Endelig, for at få vores cache, kan vi bare bruge getCache () API med det angivne navn, nøgle og værdityper på vores cache.

Med de få linjer oprettede vi vores første cache, som nu er tilgængelig for vores applikation.

3.2. XML-konfiguration

Konfigurationsobjektet fra underafsnit 3.1. er lig med at bruge denne XML-konfiguration:

 java.lang.Integer java.lang.Integer 10 

Og for at inkludere denne cache i vores Java-applikation skal vi læse XML-konfigurationsfil i Java:

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

4. Ehcache-test

I afsnit 3. viste vi, hvordan du kan definere enkel cache til dine formål. For at vise, at cache faktisk fungerer, opretter vi SquaredCalculator klasse, der beregner kvadratværdien af ​​det leverede input og gemmer den beregnede værdi i en cache.

Selvfølgelig, hvis cache allerede indeholder beregnet værdi, returnerer vi cachelagret værdi og undgår unødvendige beregninger:

offentlig klasse SquaredCalculator {privat CacheHelper cache; public int getSquareValueOfNumber (int input) {if (cache.getSquareNumberCache (). containKey (input)) {return cache.getSquareNumberCache (). get (input); } System.out.println ("Beregning af kvadratværdi af" + input + "og cachelagringsresultat."); int squaredValue = (int) Math.pow (input, 2); cache.getSquareNumberCache (). put (input, squaredValue); returner squaredValue; } // standard getters og setters; }

For at fuldføre vores testscenarie har vi også brug for koden, der beregner kvadratværdier:

@Test offentligt ugyldigt nårCalculatingSquareValueAgain_thenCacheHasAllValues ​​() {for (int i = 10; i <15; i ++) {assertFalse (cacheHelper.getSquareNumberCache (). IndeholderKey (i)); System.out.println ("Firkantet værdi af" + i + "er:" + squaredCalculator.getSquareValueOfNumber (i) + "\ n"); } for (int i = 10; i <15; i ++) {assertTrue (cacheHelper.getSquareNumberCache (). indeholder nøgle (i)); System.out.println ("Firkantet værdi af" + i + "er:" + squaredCalculator.getSquareValueOfNumber (i) + "\ n"); }}

Hvis vi kører vores test, får vi dette resultat i vores konsol:

Beregning af kvadratværdi på 10 og cacheresultat. Kvadratværdi på 10 er: 100 Beregning af kvadratværdi på 11 og cacheresultat. Kvadratværdi på 11 er: 121 Beregning af kvadratværdi på 12 og cacheresultat. Kvadratværdi på 12 er: 144 Beregning af kvadratværdi på 13 og cacheresultat. Kvadratværdi på 13 er: 169 Beregning af kvadratværdi på 14 og cache-resultat. Kvadratværdi på 14 er: 196 Kvadratværdi på 10 er: 100 Kvadratværdi på 11 er: 121 Kvadratværdi på 12 er: 144 Kvadratværdi på 13 er: 169 Kvadratværdi på 14 er: 196

Som du kan bemærke, Beregn() metoden udførte kun beregninger ved første opkald. Ved det andet opkald blev alle værdier fundet i cachen og returneret fra den.

5. Andre Ehcache-konfigurationsindstillinger

Da vi oprettede vores cache i det foregående eksempel, var det en simpel cache uden særlige indstillinger. Dette afsnit viser andre muligheder, der er nyttige til oprettelse af cache.

5.1. Disk Persistence

Hvis der er for mange værdier til at gemme i cachen, kan vi gemme nogle af disse værdier på harddisken.

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

I stedet for standard CacheManager, vi bruger nu PersistentCacheManager som fastholder alle værdier, der ikke kan gemmes i hukommelsen.

Fra konfiguration kan vi se, at cache gemmer 10 elementer i hukommelsen, og det tildeler 10 MB på harddisken til vedholdenhed.

5.2. Dataudløb

Hvis vi cache en masse data, er det naturligt, at vi gemmer cachelagrede data i et stykke tid, så vi kan undgå stor hukommelsesforbrug.

Ehcache styrer datafriskhedstrug Udløb grænseflade:

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

I denne cache vil alle data leve i 60 sekunder, og efter denne periode slettes de fra hukommelsen.

6. Konklusion

I denne artikel viste vi, hvordan man bruger simpel Ehcache-cache i et Java-program.

I vores eksempel så vi, at selv en simpelt konfigureret cache kan spare mange unødvendige handlinger. Vi viste også, at vi kan konfigurere cacher gennem POJO'er og XML, og at Ehcache har ganske gode funktioner - såsom vedholdenhed og udløb af data.

Som altid kan koden fra denne artikel findes på GitHub.