Bevezetés az Ehcache-ba

1. Áttekintés

Ebben a cikkben bemutatjuk az Ehcache-t, egy széles körben használt, nyílt forráskódú Java-alapú gyorsítótárat. Jellemzője a memória- és lemeztárolók, a hallgatók, a gyorsítótár-betöltők, a RESTful és a SOAP API-k, valamint egyéb nagyon hasznos funkciók.

Annak bemutatására, hogy a gyorsítótárazás miként optimalizálhatja alkalmazásunkat, létrehozunk egy egyszerű módszert, amely kiszámítja a megadott számok négyzetértékeit. Minden hívásnál a módszer hívni fogja calcSquareOfNumber (int szám) módszerrel, és nyomtasson információs üzenetet a konzolra.

Ezzel az egyszerű példával azt akarjuk megmutatni, hogy a négyzetértékek kiszámítása csak egyszer történik, és minden más azonos bemeneti értékű hívás a cache eredményét adja eredményül.

Fontos észrevenni, hogy teljes egészében magára az Ehcache-re koncentrálunk (Spring nélkül); Ha meg szeretné tudni, hogyan működik az Ehcache Springszel, olvassa el ezt a cikket.

2. Maven-függőségek

Az Ehcache használatához hozzá kell adnunk ezt a Maven-függőséget:

 org.ehcache ehcache 3.1.3 

Az Ehcache műtárgy legújabb verziója itt található.

3. Gyorsítótár beállítása

Az Ehcache kétféleképpen konfigurálható:

  • Az első út a Java POJO-n keresztül történik, ahol az összes konfigurációs paramétert az Ehcache API-n keresztül konfigurálják
  • A második módszer az XML fájlon keresztüli konfigurálás, ahol az Ehcache-t a megadott séma-definíció szerint konfigurálhatjuk

Ebben a cikkben mindkét megközelítést bemutatjuk - a Java-t, valamint az XML-konfigurációt.

3.1. Java konfiguráció

Ez az alfejezet megmutatja, milyen egyszerű konfigurálni az Ehcache-t POJO-kkal. Ezenkívül létrehozunk egy segítő osztályt a gyorsítótár könnyebb konfigurálása és elérhetősége érdekében:

public class CacheHelper {private CacheManager cacheManager; privát gyorsítótár squareNumberCache; public CacheHelper () {cacheManager = CacheManagerBuilder .newCacheManagerBuilder (). build (); cacheManager.init (); squareNumberCache = cacheManager .createCache ("squaredNumber", CacheConfigurationBuilder .newCacheConfigurationBuilder (Integer.class, Integer.class, ResourcePoolsBuilder.heap (10)); } public Cache getSquareNumberCacheFromCacheManager () {return cacheManager.getCache ("négyzetszám", Integer.class, Integer.class); } // szokásos mérőeszközök és beállítók}

A gyorsítótár inicializálásához először meg kell határoznunk az Ehcache-t CacheManager tárgy. Ebben a példában alapértelmezett gyorsítótárat hozunk létre squaredNumber ” a ... val newCacheManagerBuilder () API.

A gyorsítótár egyszerűen feltérképezi Egész szám gombok Egész szám értékek.

Figyelje meg, hogy a definiált gyorsítótár használatának megkezdése előtt inicializálnunk kell a CacheManager objektum a benne() módszer.

Végül a gyorsítótár megszerzéséhez csak a getCache () API a gyorsítótárunk megadott nevével, kulcsával és értéktípusaival.

Ezzel a pár sorral hoztuk létre az első gyorsítótárunkat, amely már elérhető az alkalmazásunk számára.

3.2. XML konfiguráció

A konfigurációs objektum a 3.1 alszakaszból. egyenlő az XML konfiguráció használatával:

 java.lang.Integer java.lang.Integer 10 

És hogy ezt a gyorsítótárat beépítsük a Java alkalmazásunkba, el kell olvasnunk az XML konfigurációs fájlt a Java-ban:

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

4. Ehcache teszt

A 3. részben bemutattuk, hogyan definiálhatja az egyszerű gyorsítótárat a céljaihoz. Létrehozzuk, hogy megmutassuk, hogy a gyorsítótárazás valóban működik SquaredCalculator osztály, amely kiszámítja a megadott bemenet négyzetértékét, és a kiszámított értéket egy gyorsítótárban tárolja.

Természetesen, ha a gyorsítótár már tartalmaz számított értéket, akkor a gyorsítótárazott értéket adjuk vissza, és elkerüljük a felesleges számításokat:

public class SquaredCalculator {private CacheHelper cache; public int getSquareValueOfNumber (int input) {if (cache.getSquareNumberCache (). tartalmazzaKey (input)) {return cache.getSquareNumberCache (). get (input); } System.out.println ("A" + input + "négyzetértékének és a gyorsítótárazás eredményének kiszámítása."); int squaredValue = (int) Math.pow (input, 2); cache.getSquareNumberCache (). put (input, squaredValue); return squaredValue; } // szokásos mérőeszközök és beállítók; }

Tesztforgatókönyvünk teljesítéséhez szükségünk lesz a négyzetértékeket kiszámító kódra is:

@Test public void whenCalculatingSquareValueAgain_thenCacheHasAllValues ​​() {for (int i = 10; i <15; i ++) {assertFalse (cacheHelper.getSquareNumberCache (). TartalmazzaKey (i)); System.out.println ("A" + i + "négyzetértéke:" + squaredCalculator.getSquareValueOfNumber (i) + "\ n"); } for (int i = 10; i <15; i ++) {assertTrue (cacheHelper.getSquareNumberCache (). tartalmazzaKey (i)); System.out.println ("A" + i + "négyzetértéke:" + squaredCalculator.getSquareValueOfNumber (i) + "\ n"); }}

Ha lefuttatjuk a tesztünket, akkor ezt az eredményt megkapjuk a konzolunkon:

A 10 négyzetértékének és a gyorsítótárazás eredményének kiszámítása. A 10 négyzetértéke: 100 A 11 négyzetértékének és a gyorsítótár eredményének kiszámítása. A 11 négyzetértéke: 121 A 12 négyzetértékének és a gyorsítótárazás eredményének kiszámítása. A 12 négyzetértéke: 144 A 13 négyzetértékének és a gyorsítótárazás eredményének kiszámítása. A 13 négyzetértéke: 169 A 14 négyzetértékének és a gyorsítótárazás eredményének kiszámítása. A 14 négyzet értéke: 196 A 10 négyzet értéke: 100 A 11 négyzet értéke: 121 A 12 négyzet értéke: 144 A 13 négyzet értéke: 169 A 14 négyzet értéke: 196

Amint észreveheti, kiszámítja() A módszer csak az első hívásra végzett számításokat. A második híváskor az összes érték megtalálható volt a gyorsítótárban, és visszatért belőle.

5. Egyéb Ehcache konfigurációs beállítások

Amikor az előző példában létrehoztuk a gyorsítótárunkat, egy egyszerű gyorsítótár volt, különösebb opciók nélkül. Ez a szakasz további lehetőségeket mutat be, amelyek hasznosak a gyorsítótár létrehozásában.

5.1. Lemez perzisztencia

Ha túl sok értéket kell tárolni a gyorsítótárba, akkor ezen értékek egy részét eltárolhatjuk a merevlemezen.

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

Alapértelmezett helyett CacheManager, most használjuk PersistentCacheManager amely megőrzi az összes olyan értéket, amelyet nem lehet a memóriába menteni.

A konfigurációból láthatjuk, hogy a gyorsítótár 10 elemet ment a memóriába, és 10 MB-ot oszt ki a merevlemezen a kitartás érdekében.

5.2. Adatok lejárata

Ha sok adatot tárolunk gyorsítótárban, akkor természetes, hogy a gyorsítótárazott adatokat bizonyos ideig elmentjük, így elkerülhetjük a nagy memóriahasználatot.

Az Ehcache ellenőrzi az adatok frissességét Lejárat felület:

CacheConfiguration cacheConfiguration = CacheConfigurationBuilder .newCacheConfigurationBuilder (Integer.class, Integer.class, ResourcePoolsBuilder.heap (100)) .WithExpiry (Expirations.timeToLiveExpiration (Duration.of) (60EC, TimeUDS);

Ebben a gyorsítótárban minden adat 60 másodpercig él, és ezen időtartam után törli a memóriából.

6. Következtetés

Ebben a cikkben bemutattuk az egyszerű Ehcache gyorsítótár használatát egy Java alkalmazásban.

Példánkban azt láttuk, hogy egy egyszerűen konfigurált gyorsítótár is sok felesleges műveletet takaríthat meg. Megmutattuk azt is, hogy a gyorsítótárakat konfigurálhatjuk POJO-k és XML-en keresztül, és hogy az Ehcache-nek nagyon szép tulajdonságai vannak - például a perzisztencia és az adatok lejárata.

Mint mindig, a cikk kódja megtalálható a GitHubon.