Úvod do JCache

1. Prehľad

Jednoducho povedané, JCache je štandardné rozhranie API pre ukladanie do pamäte cache pre Java. V tomto tutoriále sa pozrieme na to, čo je JCache a ako ho môžeme používať.

2. Maven závislosti

Ak chcete používať JCache, musíme do našej pridať nasledujúcu závislosť pom.xml:

 javax.cache cache-api 1.0.0-PFD 

Upozorňujeme, že najnovšiu verziu knižnice nájdeme v centrálnom úložisku Maven.

Musíme tiež pridať implementáciu API do nášho pom.xml; tu použijeme Hazelcast:

 com.hazelcast hazelcast 3,9-EA 

Najnovšiu verziu Hazelcastu nájdeme aj v jeho centrálnom úložisku Maven.

3. Implementácie JCache

JCache je implementovaný rôznymi riešeniami ukladania do pamäte cache:

  • Referenčná implementácia JCache
  • Hazelcast
  • Súdržnosť Oracle
  • Terakotová Ehcache
  • Infinispan

Upozorňujeme, že na rozdiel od iných referenčných implementácií vo výrobe sa neodporúča používať implementáciu JCache Reference Implementation, pretože to spôsobuje určité problémy so súbežnosťou.

4. Hlavné komponenty

4.1. Cache

The Cache rozhranie má nasledujúce užitočné metódy:

  • dostať () - vezme kľúč prvku ako parameter a vráti hodnotu prvku; vracia sa nulový ak kľúč neexistuje v Cache
  • získať všetko() - tejto metóde je možné odovzdať viac kľúčov ako Sada; tMetóda vráti dané kľúče a súvisiace hodnoty ako a Mapa
  • getAndRemove () - metóda načíta hodnotu pomocou svojho kľúča a odstráni prvok z Cache
  • put () - vloží novú položku do Cache
  • jasný() - odstráni všetky prvky v Cache
  • containsKey () - skontroluje, či a Cache obsahuje konkrétny kľúč

Ako vidíme, názvy metód sú do veľkej miery vysvetľujúce. Viac informácií o týchto a ďalších metódach nájdete na Javadoc.

4.2. CacheManager

CacheManager je jedným z najdôležitejších rozhraní API. Umožňuje nám to založiť, nakonfigurovať a uzavrieť Kešky.

4.3. CachingProvider

CachingProvider je rozhranie, ktoré nám umožňuje vytvárať a spravovať životný cyklus CacheManagers.

4.4. Konfigurácia

Konfigurácia je rozhranie, ktoré nám umožňuje konfigurovať Kešky. Má jednu konkrétnu implementáciu - MutableConfiguration a podrozhranie - CompleteConfiguration.

5. Vytvorenie a Cache

Pozrime sa, ako môžeme vytvoriť jednoduchý Cache:

CachingProvider cachingProvider = Caching.getCachingProvider (); CacheManager cacheManager = cachingProvider.getCacheManager (); MutableConfiguration config = nový MutableConfiguration (); Cache cache = cacheManager .createCache ("simpleCache", konfigurácia); cache.put ("kľúč1", "hodnota1"); cache.put ("key2", "value2"); cacheManager.close ();

Všetko, čo robíme, je:

  • Vytvorenie a CachingProvider objekt, ktorý používame na zostrojenie a CacheManager objekt
  • Vytvorenie a MutableConfiguration objekt, ktorým je implementácia Konfigurácia rozhranie
  • Vytvorenie a Cache objekt pomocou CacheManager objekt, ktorý sme vytvorili skôr
  • Keď dáme všetky záznamy, musíme do pamäte cache vložiť medzipamäť Cache objekt
  • Zatváranie CacheManager uvoľniť zdroje, ktoré používa Cache

Pokiaľ nezabezpečíme žiadnu implementáciu JCache v našom pom.xml, bude vyvolaná nasledujúca výnimka:

javax.cache.CacheException: Neboli nakonfigurovaní žiadni poskytovatelia CachingProviders

Dôvodom je to, že JVM nemohol nájsť žiadnu konkrétnu implementáciu getCacheManager () metóda.

6. EntryProcessor

EntryProcessor umožňuje nám upraviť Cache položky využívajúce atómové operácie bez nutnosti ich opätovného pridávania do súboru Cache. Aby sme ho mohli použiť, musíme implementovať EntryProcessor rozhranie:

public class SimpleEntryProcessor implementuje EntryProcessor, Serializable {public String process (MutableEntry entry, Object ... args) throws EntryProcessorException {if (entry.exists ()) {String current = entry.getValue (); entry.setValue (aktuálne + "- upravené"); spätný prúd; } return null; }}

Teraz použijeme našu EntryProcessor implementácia:

@Test public void whenModifyValue_thenCorrect () {this.cache.invoke ("kľúč", nový SimpleEntryProcessor ()); assertEquals ("hodnota - upravená", cache.get ("kľúč")); }

7. Poslucháči udalostí

Poslucháči udalostí nám umožňujú konať pri spustení ktoréhokoľvek z typov udalostí definovaných v Typ udalosti enum, ktoré sú:

  • VYTVORENÉ
  • AKTUALIZOVANÉ
  • ODSTRÁNENÝ
  • EXPIROVANÉ

Najprv musíme implementovať rozhrania udalostí, ktoré budeme používať.

Napríklad, ak chceme použiť VYTVORENÉ a AKTUALIZOVANÉ typy udalostí, potom by sme mali implementovať rozhrania CacheEntryCreatedListener a CacheEntryUpdatedListener.

Pozrime sa na príklad:

verejná trieda SimpleCacheEntryListener implementuje CacheEntryCreatedListener, CacheEntryUpdatedListener, Serializable {private boolean aktualizované; vytvorený súkromný boolean; // štandardné getre public void onUpdated (Iterable udalosti) hodí CacheEntryListenerException {this.updated = true; } public void onCreated (Iterable udalosti) hodí CacheEntryListenerException {this.created = true; }}

Teraz spustíme náš test:

@Test public void whenRunEvent_thenCorrect () hodí 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 ("kľúč", "hodnota"); assertEquals (true, this.listener.getCreated ()); assertEquals (false, this.listener.getUpdated ()); this.cache.put ("kľúč", "newValue"); assertEquals (true, this.listener.getUpdated ()); }

8. CacheLoader

CacheLoader umožňujepoužívame režim čítaniazaobchádzať s vyrovnávacou pamäťou ako s hlavným úložiskom údajov a načítať z nej údaje.

V scenári z reálneho sveta môžeme nechať medzipamäť načítať údaje zo skutočného úložiska.

Pozrime sa na príklad. Najprv by sme mali implementovať CacheLoader rozhranie:

verejná trieda SimpleCacheLoader implementuje CacheLoader {verejné načítanie reťazcov (celočíselný kľúč) hodí CacheLoaderException {návrat "fromCache" + kľúč; } public Map loadAll (Iterable keys) throws CacheLoaderException {Map data = new HashMap (); pre (int key: keys) {data.put (key, load (key)); } návratové údaje; }}

A teraz použijeme našu CacheLoader implementácia:

public class CacheLoaderTest {private Cache cache; @ Pred public void setup () {CachingProvider cachingProvider = Caching.getCachingProvider (); CacheManager cacheManager = cachingProvider.getCacheManager (); MutableConfiguration config = new MutableConfiguration () .setReadThrough (true) .setCacheLoaderFactory (nový FactoryBuilder.SingletonFactory (nový SimpleCacheLoader ())); this.cache = cacheManager.createCache ("SimpleCache", konfigurácia); } @Test public void whenReadingFromStorage_thenCorrect () {for (int i = 1; i <4; i ++) {String value = cache.get (i); assertEquals ("fromCache" + i, hodnota); }}}

9. Záver

V tomto tutoriáli sme videli, čo je JCache, a preskúmali sme niektoré z jeho dôležitých funkcií v niekoľkých praktických scenároch.

Celú implementáciu tohto tutoriálu nájdete ako vždy na GitHub.