Uvod u JCache

1. Pregled

Jednostavno rečeno, JCache je standardni API za predmemoriranje za Javu. U ovom uputstvu vidjet ćemo što je JCache i kako ga možemo koristiti.

2. Ovisnosti Mavena

Da bismo koristili JCache, trebamo dodati sljedeću ovisnost u našu pom.xml:

 javax.cache cache-api 1.0.0-PFD 

Imajte na umu da najnoviju verziju knjižnice možemo pronaći u središnjem spremištu Maven.

Također moramo dodati implementaciju API-ja u naš pom.xml; ovdje ćemo koristiti Hazelcast:

 com.hazelcast lješnjak 3.9-EA 

Također možemo pronaći najnoviju verziju Hazelcasta u njegovom središnjem spremištu Maven.

3. JCache implementacije

JCache se implementira kroz različita rješenja za predmemoriranje:

  • Implementacija JCache reference
  • Lijeska
  • Koherencija Oraclea
  • Terakota Ehcache
  • Infinispan

Imajte na umu da, za razliku od ostalih referentnih implementacija, ne preporučuje se upotreba JCache Reference Implementacije u proizvodnji jer uzrokuje neke probleme s istodobnošću.

4. Glavne komponente

4.1. Predmemorija

The Predmemorija sučelje ima sljedeće korisne metode:

  • dobiti() - uzima ključ elementa kao parametar i vraća vrijednost elementa; vraća se null ako ključ ne postoji u Predmemorija
  • getAll () - više se ključeva može proslijediti ovoj metodi kao Set; tmetoda vraća zadane ključeve i pridružene vrijednosti kao a Karta
  • getAndRemove () - metoda dobiva vrijednost pomoću svog ključa i uklanja element iz datoteke Predmemorija
  • staviti() - ubacuje novu stavku u Predmemorija
  • čisto() - uklanja sve elemente u programu Predmemorija
  • containsKey () - provjerava je li Predmemorija sadrži određeni ključ

Kao što vidimo, nazivi metoda prilično su samorazumljivi. Za više informacija o ovim i ostalim metodama posjetite Javadoc.

4.2. CacheManager

CacheManager je jedno od najvažnijih sučelja API-ja. Omogućuje nam uspostavljanje, konfiguriranje i zatvaranje Predmemorije.

4.3. CachingProvider

CachingProvider je sučelje koje nam omogućuje stvaranje i upravljanje životnim ciklusom CacheManagers.

4.4. Konfiguracija

Konfiguracija je sučelje koje nam omogućuje konfiguraciju Predmemorije. Ima jednu konkretnu provedbu - PromjenjivaKonfiguracija i pod-sučelje - CompleteConfiguration.

5. Stvaranje a Predmemorija

Pogledajmo kako možemo stvoriti jednostavan Predmemorija:

CachingProvider cachingProvider = Caching.getCachingProvider (); CacheManager cacheManager = cachingProvider.getCacheManager (); MutableConfiguration config = novi MutableConfiguration (); Predmemorija predmemorije = cacheManager .createCache ("simpleCache", config); cache.put ("key1", "value1"); cache.put ("key2", "value2"); cacheManager.close ();

Sve što radimo je:

  • Stvaranje a CachingProvider objekt koji koristimo za konstrukciju a CacheManager objekt
  • Stvaranje a PromjenjivaKonfiguracija objekt, što je provedba Konfiguracija sučelje
  • Stvaranje a Predmemorija objekt pomoću CacheManager objekt koji smo stvorili ranije
  • Stavljajući sve unose, trebamo predmemorirati u naš Predmemorija objekt
  • Zatvaranje CacheManager za oslobađanje resursa koje koristi Predmemorija

Ako ne pružimo nikakvu primjenu JCachea u našem pom.xml, izbacit će se sljedeća iznimka:

javax.cache.CacheException: Nije konfiguriran nijedan dobavljač keširanja

Razlog tome je što JVM nije mogao pronaći konkretnu provedbu getCacheManager () metoda.

6. EntryProcessor

EntryProcessor omogućuje nam izmjenu Predmemorija unosi koji koriste atomske operacije bez da ih morate ponovno dodavati u Predmemorija. Da bismo ga koristili, moramo implementirati EntryProcessor sučelje:

javna klasa SimpleEntryProcessor provodi EntryProcessor, Serializable {postupak javnog niza (unos MutableEntry, Object ... args) baca EntryProcessorException {if (entry.exists ()) {String current = entry.getValue (); entry.setValue (trenutno + "- izmijenjeno"); povratna struja; } return null; }}

A sada, iskoristimo naš EntryProcessor provedba:

@Test public void whenModifyValue_thenCorrect () {this.cache.invoke ("key", novi SimpleEntryProcessor ()); assertEquals ("vrijednost - izmijenjena", cache.get ("ključ")); }

7. Slušatelji događaja

Slušatelji događaja omogućuju nam poduzimanje radnji nakon pokretanja bilo koje vrste događaja definirane u Vrsta događaja enum, a to su:

  • STVORENO
  • AŽURIRANO
  • UKLONJENO
  • ISTEKAO

Prvo, moramo implementirati sučelja događaja koje ćemo koristiti.

Na primjer, ako želimo koristiti STVORENO i AŽURIRANO vrste događaja, tada bismo trebali implementirati sučelja CacheEntryCreatedListener i CacheEntryUpdatedListener.

Pogledajmo primjer:

javna klasa SimpleCacheEntryListener implementira CacheEntryCreatedListener, CacheEntryUpdatedListener, Serializable {private boolean updated; stvorena privatna logička vrijednost; // standardni getteri public void onUpdated (Iterable events) baca CacheEntryListenerException {this.updated = true; } javna praznina onCreated (Iterable events) baca CacheEntryListenerException {this.created = true; }}

Ajmo sada pokrenuti naš test:

@Test public void whenRunEvent_thenCorrect () baca InterruptedException {this.listenerConfiguration = new MutableCacheEntryListenerConfiguration (FactoryBuilder.factoryOf (this.listener), null, false, true); this.cache.registerCacheEntryListener (this.listenerConfiguration); assertEquals (false, this.listener.getCreated ()); this.cache.put ("ključ", "vrijednost"); assertEquals (true, this.listener.getCreated ()); assertEquals (false, this.listener.getUpdated ()); this.cache.put ("key", "newValue"); assertEquals (true, this.listener.getUpdated ()); }

8. CacheLoader

CacheLoader dopuštada koristimo način čitanjatretirati predmemoriju kao glavnu pohranu podataka i čitati podatke iz nje.

U stvarnom scenariju predmemorija može čitati podatke iz stvarne pohrane.

Pogledajmo primjer. Prvo, trebali bismo implementirati CacheLoader sučelje:

javna klasa SimpleCacheLoader implementira CacheLoader {javno opterećenje niza (Integer ključ) baca CacheLoaderException {return "fromCache" + ključ; } javna karta loadAll (Iterable tipke) baca CacheLoaderException {Podaci karte = novi HashMap (); za (tipka int: tipke) {data.put (tipka, učitavanje (tipka)); } vratiti podatke; }}

A sada, iskoristimo naše CacheLoader provedba:

javna klasa CacheLoaderTest {predmemorija privatne predmemorije; @ Prije javne void postavke () {CachingProvider cachingProvider = Caching.getCachingProvider (); CacheManager cacheManager = cachingProvider.getCacheManager (); MutableConfiguration config = new MutableConfiguration () .setReadThrough (true) .setCacheLoaderFactory (new FactoryBuilder.SingletonFactory (new SimpleCacheLoader ())); this.cache = cacheManager.createCache ("SimpleCache", config); } @Test public void whenReadingFromStorage_thenCorrect () {for (int i = 1; i <4; i ++) {Vrijednost niza = cache.get (i); assertEquals ("fromCache" + i, vrijednost); }}}

9. Zaključak

U ovom uputstvu vidjeli smo što je JCache i istražili neke njegove važne značajke u nekoliko praktičnih scenarija.

Kao i uvijek, cjelovitu implementaciju ovog vodiča možete pronaći na GitHubu.