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.