Uvod u Ehcache

1. Pregled

U ovom ćemo članku predstaviti Ehcache, široko korištenu predmemoriju otvorenog koda zasnovanu na Javi. Sadrži pohranu memorije i diska, slušatelje, učitače predmemorije, RESTful i SOAP API-je i druge vrlo korisne značajke.

Da bismo pokazali kako predmemoriranje može optimizirati našu aplikaciju, stvorit ćemo jednostavnu metodu koja će izračunati kvadratne vrijednosti danih brojeva. Pri svakom pozivu, metoda će pozvati convertSquareOfNumber (int broj) metoda i ispis poruke s informacijama na konzolu.

Ovim jednostavnim primjerom želimo pokazati da se izračunavanje kvadrata vrijednosti vrši samo jednom, a svaki drugi poziv s istom ulaznom vrijednošću vraća rezultat iz predmemorije.

Važno je primijetiti da smo u potpunosti fokusirani na sam Ehcache (bez proljeća); ako želite vidjeti kako Ehcache radi s Springom, pogledajte pročitajte ovaj članak.

2. Ovisnosti Mavena

Da bismo mogli koristiti Ehcache, moramo dodati ovu ovisnost o Mavenu:

 org.ehcache ehcache 3.1.3 

Najnoviju verziju artefakta Ehcache možete pronaći ovdje.

3. Konfiguracija predmemorije

Ehcache se može konfigurirati na dva načina:

  • Prvi način je putem Java POJO gdje su svi konfiguracijski parametri konfigurirani putem Ehcache API-ja
  • Drugi način je konfiguracija kroz XML datoteku gdje možemo konfigurirati Ehcache u skladu s navedenom definicijom sheme

U ovom ćemo članku prikazati oba pristupa - Java kao i XML konfiguraciju.

3.1. Java konfiguracija

Ovaj će pododjeljak pokazati kako je lako konfigurirati Ehcache s POJO-ovima. Također ćemo stvoriti pomoćnu klasu za lakšu konfiguraciju i dostupnost predmemorije:

javna klasa CacheHelper {private CacheManager cacheManager; private Cache squareNumberCache; javni CacheHelper () {cacheManager = CacheManagerBuilder .newCacheManagerBuilder (). build (); cacheManager.init (); squareNumberCache = cacheManager .createCache ("squaredNumber", CacheConfigurationBuilder .newCacheConfigurationBuilder (Integer.class, Integer.class, ResourcePoolsBuilder.heap (10))); } javna predmemorija getSquareNumberCacheFromCacheManager () {return cacheManager.getCache ("squaredNumber", Integer.class, Integer.class); } // standardni getteri i postavljači}

Da bismo inicijalizirali našu predmemoriju, prvo moramo definirati Ehcache CacheManager objekt. U ovom primjeru stvaramo zadanu predmemoriju kvadratniBroj " s newCacheManagerBuilder () API.

Predmemorija će se jednostavno preslikati Cijeli broj tipke za Cijeli broj vrijednosti.

Primijetite kako, prije nego što počnemo koristiti definiranu predmemoriju, moramo inicijalizirati CacheManager objekt s u tome() metoda.

Napokon, da bismo dobili našu predmemoriju, možemo samo koristiti getCache () API s navedenim vrstama imena, ključa i vrijednosti naše predmemorije.

S tih nekoliko redaka stvorili smo prvu predmemoriju koja je sada dostupna našoj aplikaciji.

3.2. XML konfiguracija

Konfiguracijski objekt iz pododjeljka 3.1. jednako je korištenju ove XML konfiguracije:

 java.lang.Integer java.lang.Integer 10 

A da bismo uključili ovu predmemoriju u našu Java aplikaciju, moramo pročitati XML konfiguracijsku datoteku na Javi:

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

4. Ehcache test

U odjeljku 3. pokazali smo kako možete definirati jednostavnu predmemoriju za svoje svrhe. Da bismo pokazali da predmemoriranje zapravo djeluje, mi ćemo stvoriti SquaredCalculator klasa koja će izračunati kvadrat pružene vrijednosti i pohraniti izračunatu vrijednost u predmemoriju.

Naravno, ako predmemorija već sadrži izračunatu vrijednost, vratit ćemo predmemoriranu vrijednost i izbjeći nepotrebne izračune:

javna klasa SquaredCalculator {privatna predmemorija CacheHelper; javni int getSquareValueOfNumber (int input) {if (cache.getSquareNumberCache (). containsKey (input)) {return cache.getSquareNumberCache (). get (input); } System.out.println ("Izračun kvadratne vrijednosti" + ulaz + "i rezultat predmemoriranja."); int squaredValue = (int) Math.pow (ulaz, 2); cache.getSquareNumberCache (). put (input, squaredValue); povratak squaredValue; } // standardni getteri i postavljači; }

Da bismo dovršili testni scenarij, trebat će nam i kôd koji će izračunati kvadratne vrijednosti:

@Test public void whenCalculatingSquareValueAgain_thenCacheHasAllValues ​​() {for (int i = 10; i <15; i ++) {assertFalse (cacheHelper.getSquareNumberCache (). ContainsKey (i)); System.out.println ("Kvadratna vrijednost" + i + "je:" + squaredCalculator.getSquareValueOfNumber (i) + "\ n"); } za (int i = 10; i <15; i ++) {assertTrue (cacheHelper.getSquareNumberCache (). containsKey (i)); System.out.println ("Kvadratna vrijednost" + i + "je:" + squaredCalculator.getSquareValueOfNumber (i) + "\ n"); }}

Ako pokrenemo test, na našoj konzoli dobit ćemo ovaj rezultat:

Izračunavanje kvadratne vrijednosti 10 i rezultat predmemoriranja. Kvadratna vrijednost 10 je: 100 Izračunavanje kvadratne vrijednosti 11 i rezultat predmemoriranja. Kvadratna vrijednost 11 je: 121 Izračunavanje kvadratne vrijednosti 12 i rezultat predmemoriranja. Kvadratna vrijednost 12 je: 144 Izračunavanje kvadratne vrijednosti 13 i rezultat predmemoriranja. Kvadratna vrijednost 13 je: 169 Izračunavanje kvadratne vrijednosti 14 i rezultat predmemoriranja. Kvadratna vrijednost 14 je: 196 Kvadratna vrijednost 10 je: 100 Kvadratna vrijednost 11 je: 121 Kvadratna vrijednost 12 je: 144 Kvadratna vrijednost 13 je: 169 Kvadratna vrijednost 14 je: 196

Kao što možete primijetiti, izračunati() metoda vršila je proračune samo na prvi poziv. Pri drugom pozivu sve su vrijednosti pronađene u predmemoriji i vraćene iz nje.

5. Ostale mogućnosti konfiguracije Ehcachea

Kada smo stvorili svoju predmemoriju u prethodnom primjeru, bila je to jednostavna predmemorija bez ikakvih posebnih opcija. Ovaj će odjeljak prikazati druge opcije korisne u stvaranju predmemorije.

5.1. Postojanost diska

Ako ima previše vrijednosti za pohranu u predmemoriju, neke od tih vrijednosti možemo pohraniti na tvrdi disk.

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

Umjesto zadane CacheManager, sada koristimo PersistentCacheManager koji će zadržati sve vrijednosti koje se ne mogu spremiti u memoriju.

Iz konfiguracije možemo vidjeti da će predmemorija spremiti 10 elemenata u memoriju i na tvrdom će disku izdvojiti 10 MB za trajnost.

5.2. Istek podataka

Ako predmemoriramo puno podataka, prirodno je da spremimo predmemorirane podatke neko vrijeme kako bismo mogli izbjeći veliku upotrebu memorije.

Ehcache kontrolira svježinu podataka Istek sučelje:

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

U ovoj će predmemoriji svi podaci živjeti 60 sekundi i nakon tog razdoblja bit će izbrisani iz memorije.

6. Zaključak

U ovom smo članku pokazali kako koristiti jednostavno Ehcache predmemoriranje u Java programu.

U našem primjeru vidjeli smo da čak i jednostavno konfigurirana predmemorija može uštedjeti puno nepotrebnih operacija. Također, pokazali smo da možemo konfigurirati predmemorije putem POJO-a i XML-a te da Ehcache ima prilično lijepih značajki - poput postojanosti i isteka podataka.

Kao i uvijek, kôd iz ovog članka možete pronaći na GitHubu.