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.