Bevezetés a JCache-be

1. Áttekintés

Egyszerűen fogalmazva, a JCache a Java gyorsítótárazott API-ja. Ebben az oktatóanyagban megnézzük, mi az a JCache, és hogyan tudjuk használni.

2. Maven-függőségek

A JCache használatához hozzá kell adnunk a következő függőséget pom.xml:

 javax.cache cache-api 1.0.0-PFD 

Ne feledje, hogy a könyvtár legújabb verzióját a Maven Central Repository-ban találhatjuk meg.

Hozzá kell adnunk az API megvalósítását is pom.xml; itt használjuk a Hazelcast-ot:

 com.hazelcast hazelcast 3.9-EA 

A Hazelcast legújabb verzióját megtalálhatjuk a Maven központi adattárában is.

3. JCache-implementációk

A JCache-t különféle gyorsítótár-megoldások valósítják meg:

  • JCache referencia megvalósítás
  • Hazelcast
  • Oracle Koherencia
  • Terrakotta Ehcache
  • Infinispan

Vegye figyelembe, hogy más referencia-megvalósításokkal ellentétben nem ajánlott a JCache Reference Implementation használata a gyártásban, mivel ez egyidejűségi problémákat okoz.

4. Fő alkotóelemek

4.1. Gyorsítótár

A Gyorsítótár Az interfész a következő hasznos módszerekkel rendelkezik:

  • kap() - paraméterként veszi az elem kulcsát, és visszaadja az elem értékét; visszatér nulla ha a kulcs nem létezik a Gyorsítótár
  • getAll () - több kulcs is átadható ennek a módszernek, mint a Készlet; ta metódus a megadott kulcsokat és a hozzájuk tartozó értékeket a-ként adja vissza Térkép
  • getAndRemove () - a metódus lekér egy értéket a kulcsával, és eltávolítja az elemet a Gyorsítótár
  • put () - új elemet illeszt be a Gyorsítótár
  • egyértelmű() - eltávolítja az összes elemet a Gyorsítótár
  • tartalmazzaKey () - ellenőrzi, hogy a Gyorsítótár egy adott kulcsot tartalmaz

Mint láthatjuk, a módszerek neve nagyjából magától értetődő. Ha további információra van szüksége ezekről a módszerekről, látogasson el a Javadoc oldalra.

4.2. CacheManager

CacheManager az API egyik legfontosabb felülete. Lehetővé teszi számunkra a létrehozást, konfigurálást és bezárást Gyorsítótárak.

4.3. CachingProvider

CachingProvider egy felület, amely lehetővé teszi számunkra, hogy létrehozzuk és kezeljük a CacheManagers.

4.4. Konfiguráció

Konfiguráció olyan felület, amely lehetővé teszi számunkra a konfigurálást Gyorsítótárak. Egy konkrét megvalósítása van - MutableConfiguration és egy alfelület - CompleteConfiguration.

5. A. Létrehozása Gyorsítótár

Lássuk, hogyan hozhatunk létre egy egyszerűt Gyorsítótár:

CachingProvider cachingProvider = Caching.getCachingProvider (); CacheManager cacheManager = cachingProvider.getCacheManager (); MutableConfiguration config = new MutableConfiguration (); Gyorsítótár gyorsítótár = cacheManager .createCache ("simpleCache", config); cache.put ("kulcs1", "érték1"); cache.put ("kulcs2", "érték2"); cacheManager.close ();

Csak annyit csinálunk:

  • A. Létrehozása CachingProvider objektum, amelyet a CacheManager tárgy
  • A. Létrehozása MutableConfiguration objektum, amely a Konfiguráció felület
  • A. Létrehozása Gyorsítótár objektum a CacheManager korábban létrehozott objektumot
  • Az összes bejegyzést kitöltve gyorsítótáraznunk kell a bejegyzésünkbe Gyorsítótár tárgy
  • A. Bezárása CacheManager hogy felszabadítsa a Gyorsítótár

Ha nem biztosítjuk a JCache megvalósítását a pom.xml, a következő kivételt fogjuk dobni:

javax.cache.CacheException: Nincsenek beállítva CachingProviders

Ennek az az oka, hogy a JVM nem találta a program konkrét megvalósítását getCacheManager () módszer.

6. EntryProcessor

EntryProcessor lehetővé teszi számunkra a módosítást Gyorsítótár atomi műveleteket használó bejegyzések anélkül, hogy újból hozzá kellene őket adni a Gyorsítótár. Használatához végre kell hajtanunk a EntryProcessor felület:

public class SimpleEntryProcessor implementálja az EntryProcessor, Serializable {public String process (MutableEntry entry, Object ... args) dobja az EntryProcessorException {if (entry.exists ()) {String current = entry.getValue (); entry.setValue (jelenlegi + "- módosított"); visszatérő áram; } return null; }}

Most használjuk a mi EntryProcessor végrehajtás:

@Test public void whenModifyValue_thenCorrect () {this.cache.invoke ("kulcs", új SimpleEntryProcessor ()); assertEquals ("érték módosítva", cache.get ("kulcs")); }

7. Eseményhallgatók

Az eseményhallgatók lehetővé teszik számunkra, hogy cselekedjünk a. - ben meghatározott eseménytípusok bármelyikének elindításakor Esemény típus enum, amelyek:

  • LÉTREHOZOTT
  • FRISSÍTVE
  • ELTÁVOLÍTVA
  • LEJÁRT

Először meg kell valósítanunk a használni kívánt események interfészeit.

Például, ha a LÉTREHOZOTT és a FRISSÍTVE eseménytípusokat, akkor meg kell valósítanunk az interfészeket CacheEntryCreatedListener és CacheEntryUpdatedListener.

Lássunk egy példát:

public class SimpleCacheEntryListener megvalósítja a CacheEntryCreatedListener, CacheEntryUpdatedListener, Serializable {private boolean updated; privát logikai létrehozva; // standard getters public void onUpdated (Iterable események) dobja a CacheEntryListenerException {this.updated = true; } public void onCreated (Iterable események) dobja a CacheEntryListenerException {this.created = true; }}

Most futtassuk a tesztünket:

@Test public void, amikor a RunEvent_thenCorrect () megszakítja az InterruptedException {this.listenerConfiguration = new MutableCacheEntryListenerConfiguration (FactoryBuilder.factoryOf (this.listener), null, false, true); this.cache.registerCacheEntryListener (this.listenerConfiguration); assertEquals (hamis, this.listener.getCreated ()); this.cache.put ("kulcs", "érték"); assertEquals (igaz, this.listener.getCreated ()); assertEquals (hamis, this.listener.getUpdated ()); this.cache.put ("kulcs", "newValue"); assertEquals (igaz, this.listener.getUpdated ()); }

8. CacheLoader

CacheLoader lehetővé teszihogy használjuk az átolvasási módota gyorsítótárat fő adattárként kezelni, és adatokat olvasni belőle.

Valódi helyzetben a gyorsítótárat beolvashatjuk a tényleges tárhelyről.

Nézzünk meg egy példát. Először is meg kell valósítanunk a CacheLoader felület:

public class SimpleCacheLoader megvalósítja a CacheLoader {public String load (Integer key) dobja a CacheLoaderException {return "fromCache" + kulcs; } public Map loadAll (Iterable keys) dobja a CacheLoaderException {Map data = new HashMap (); for (int kulcs: kulcsok) {data.put (kulcs, betöltés (kulcs)); } visszatérési adatok; }}

És most használjuk a mi CacheLoader végrehajtás:

public class CacheLoaderTest {private Cache cache; @A nyilvános void beállítása előtt () {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", konfiguráció); } @Test public void whenReadingFromStorage_thenCorrect () {for (int i = 1; i <4; i ++) {String value = cache.get (i); assertEquals ("fromCache" + i, érték); }}}

9. Következtetés

Ebben az oktatóanyagban megnéztük, hogy mi a JCache, és néhány gyakorlati helyzetben feltártuk néhány fontos tulajdonságát.

Mint mindig, ennek az oktatóanyagnak a teljes megvalósítása megtalálható a GitHubon.