Kulcsérték-áruház krónika térképpel
1. Áttekintés
Ebben az oktatóanyagban megnézzük, hogyan használhatjuk a Krónika Térképet kulcs-érték párok tárolására. Rövid példákat is készítünk annak viselkedésének és használatának bemutatására.
2. Mi az a krónika térkép?
A dokumentációt követően „A Chronicle Map egy szupergyors, memóriában lévő, nem blokkoló, kulcsérték-tároló, amely alacsony késési és / vagy többfolyamatos alkalmazásokhoz készült.”
Dióhéjban ez egy halom kulcsérték-tároló. A térkép nem igényel nagy mennyiségű RAM-ot a megfelelő működéséhez. A rendelkezésre álló lemezkapacitás alapján nőhet. Ezenkívül támogatja az adatok replikálását egy multi-master szerver beállításban.
Most nézzük meg, hogyan tudunk beállítani és dolgozni vele.
3. Maven-függőség
A kezdéshez hozzá kell adnunk a krónika-térkép függőséget a projektünkhöz:
net.openhft krónika-térkép 3.17.2
4. A krónika térkép típusai
Kétféle módon hozhatunk létre térképet: akár memóriakártyaként, akár állandó térképként.
Nézzük meg mindkettőt részletesen.
4.1. Memórián belüli térkép
A memóriában lévő Chronicle Map egy olyan térképtár, amelyet a szerver fizikai memóriájában hoznak létre. Ez azt jelenti, hogy csak abban a JVM folyamatban érhető el, amelyben a térképtár létrehozásra került.
Lássunk egy gyors példát:
ChronicleMap inMemoryCountryMap = ChronicleMap .of (LongValue.class, CharSequence.class) .name ("country-map") .entries (50) .averageValue ("America") .create ();
Az egyszerűség kedvéért létrehozunk egy térképet, amely 50 országazonosítót és nevüket tárolja. Amint a kódrészletből láthatjuk, a létrehozás a. Kivételével meglehetősen egyszerű átlagos érték() konfiguráció. Ez megadja a térképnek, hogy konfigurálja a térképbejegyzés értékei által elfoglalt átlagos bájtok számát.
Más szavakkal, a térkép létrehozásakor a Krónika Térkép meghatározza az értékek sorosított formája által vett átlagos bájtok számát. Ezt úgy hajtja végre, hogy a megadott átlagos értéket a konfigurált értékű rendező segítségével sorosítja. Ezután kiosztja a meghatározott bájtok számát az egyes térképbejegyzések értékéhez.
Egy dolgot meg kell jegyeznünk, ha a memóriában lévő térképről van szó, hogy az adatok csak akkor érhetők el, amikor a JVM folyamat él. A könyvtár törli az adatokat, amikor a folyamat befejeződik.
4.2. Megmaradt térkép
A memóriában lévő térképpel ellentétben a megvalósítás egy állandó térképet menti lemezre. Most nézzük meg, hogyan készíthetünk állandó térképet:
ChronicleMap persistedCountryMap = ChronicleMap .of (LongValue.class, CharSequence.class) .name ("country-map") .entries (50) .avigationValue ("America") .createPersistedTo (new File (System.getProperty ("user.home) ") +" / országinformációk.dat "));
Ez létrehoz egy fájlt country-details.dat a megadott mappában. Ha ez a fájl már rendelkezésre áll a megadott elérési útvonalon, akkor a készítő megvalósítása megnyit egy hivatkozást a meglévő adattárolóhoz ebből a JVM-folyamatból.
Használhatjuk a fennmaradt térképet olyan esetekben, amikor azt szeretnénk:
- túlélni az alkotói folyamaton túl; például a forró alkalmazások áttelepítésének támogatására
- tegye globálissá egy szerveren; például több egyidejű folyamathozzáférés támogatására
- adattárként működik, amelyet a lemezre mentünk
5. Méret konfiguráció
A krónika térkép készítése közben kötelező az átlagos érték és az átlagos kulcs konfigurálása, kivéve azokat az eseteket, amikor a kulcs / érték típusunk dobozos primitív vagy érték interfész. Példánkban nem konfiguráljuk az átlagos kulcsot a kulcs típusa óta LongValue egy érték interfész.
Most nézzük meg, milyen lehetőségek vannak a kulcs / érték bájtok átlagos számának konfigurálásához:
- átlagos érték() - Az az érték, amelyből meghatározzák a térképbejegyzés értékéhez allokálandó átlagos bájtok számát
- averageValueSize () - A térképbejegyzés értékéhez rendelendő átlagos bájtok száma
- konstansValueSizeBySample () - A térképbejegyzés értékéhez allokálandó bájtok száma, ha az érték mérete mindig megegyezik
- átlagosKulcs () - Az a kulcs, amelyből meghatározzák a térképbejegyzés kulcsához rendelendő átlagos bájtok számát
- átlagosKeySize () - A térképbejegyzés kulcsához kiosztandó átlagos bájtok száma
- konstansKeySizeBySample () - A térképbejegyzés kulcsához lefoglalandó bájtok száma, ha a kulcs mérete mindig azonos
6. Kulcs- és értéktípusok
Vannak bizonyos szabványok, amelyeket be kell tartanunk a Krónika Térkép elkészítésekor, különösen a kulcs és az érték meghatározásakor. A térkép akkor működik a legjobban, ha a kulcsot és az értéket az ajánlott típusok használatával hozzuk létre.
Íme néhány az ajánlott típusok közül:
- Érték interfészek
- Bármely osztály megvalósítása Byteable interfész a Chronicle Bytes-től
- Bármely osztály megvalósító BytesMallhallable interfész a Chronicle Bytes-től; a megvalósítási osztálynak nyilvános no-arg konstruktorral kell rendelkeznie
- byte[] és ByteBuffer
- CharSequence, Húr, és StringBuilder
- Egész szám, Hosszú, és Kettős
- Bármely osztály megvalósító java.io.Externalizálható; a megvalósítási osztálynak nyilvános no-arg konstruktorral kell rendelkeznie
- Bármilyen típusú megvalósítás java.io.Serializálható, beleértve a dobozos primitív típusokat (kivéve a fent felsoroltakat) és a tömbtípusokat
- Bármely más típus, ha egyedi sorosítók vannak
7. Krónika térkép lekérdezése
A Chronicle Map támogatja az egykulcsos és a többkulcsos lekérdezéseket.
7.1. Egykulcsos lekérdezések
Az egykulcsos lekérdezések azok a műveletek, amelyek egyetlen kulccsal foglalkoznak. KrónikaTérkép támogatja az összes műveletet a Java-ból Térkép interfész és ConcurrentMap felület:
LongValue qatarKey = Values.newHeapInstance (LongValue.class); qatarKey.setValue (1); inMemoryCountryMap.put (qatarKey, "Katar"); // ... CharSequence country = inMemoryCountryMap.get (kulcs);
A normál get and put műveletek mellett KrónikaTérkép hozzáad egy speciális műveletet, getUsing (), ami csökkenti a memória lábnyomát egy bejegyzés lekérése és feldolgozása közben. Lássuk ezt működés közben:
LongValue kulcs = Values.newHeapInstance (LongValue.class); StringBuilder country = new StringBuilder (); key.setValue (1); persistedCountryMap.getUsing (kulcs, ország); assertThat (country.toString (), is (egyenlőTo ("Románia"))); key.setValue (2); persistedCountryMap.getUsing (kulcs, ország); assertThat (country.toString (), is (egyenlőTo ("India")));
Itt ugyanazt használtuk StringBuilder objektum a különböző kulcsok értékeinek lekéréséhez azáltal, hogy továbbítja a getUsing () módszer. Alapvetően ugyanazt az objektumot használja fel különféle bejegyzések lekérésére. Esetünkben a getUsing () módszer egyenértékű:
country.setLength (0); country.append (persistedCountryMap.get (kulcs));
7.2. Többkulcsos lekérdezések
Lehetnek olyan felhasználási esetek, amikor egyszerre több kulccsal is foglalkoznunk kell. Ehhez használhatjuk a queryContext () funkcionalitás. A queryContext () metódus létrehoz egy kontextust a térképbejegyzéssel való munkához.
Először hozzunk létre egy multimap-ot, és adjunk hozzá néhány értéket:
Set averageValue = IntStream.of (1, 2) .boxed (). Collect (Collectors.toSet ()); KrónikaTérkép multiMap = ChronicleMap .of (Integer.class, (Class) (Class) Set.class) .name ("multi-map") .entries (50) .avigationValue (averageValue) .create (); Set set1 = új HashSet (); set1.add (1); set1.add (2); multiMap.put (1, set1); Set set2 = új HashSet (); set2.add (3); multiMap.put (2, set2);
Ha több bejegyzéssel akarunk dolgozni, azokat be kell zárnunk, hogy elkerüljük az egyidejű frissítés következtében előforduló következetlenségeket:
próbáld meg (ExternalMapQueryContext var13 -> fistContext = multiMap.queryContext (1)) {try (ExternalMapQueryContext) var13 -> secondContext = multiMap.queryContext (2)) {fistContext.updateLock (). lock (); secondContext.updateLock (). lock (); MapEntry firstEntry = fistContext.entry (); Set firstSet = firstEntry.value (). Get (); firstSet.remove (2); MapEntry secondEntry = secondContext.entry (); Set secondSet = secondEntry.value (). Get (); secondSet.add (4); firstEntry.doReplaceValue (fistContext.wrapValueAsData (firstSet)); secondEntry.doReplaceValue (secondContext.wrapValueAsData (secondSet)); }} végül {assertThat (multiMap.get (1) .size (), is (equalTo (1))); assertThat (multiMap.get (2) .size (), is (egyenlőTo (2))); }
8. A krónika térkép bezárása
Most, hogy elkészültünk a térképeinkkel, hívjuk a Bezárás() módszer a térképobjektumainkon a halom nélküli memória és az ahhoz kapcsolódó erőforrások felszabadítására:
persistedCountryMap.close (); inMemoryCountryMap.close (); multiMap.close ();
Itt egy dolgot érdemes szem előtt tartani, hogy az összes térképműveletet be kell fejezni a térkép bezárása előtt. Ellenkező esetben a JVM váratlanul összeomolhat.
9. Következtetés
Ebben az oktatóanyagban megtanultuk, hogyan kell egy krónika térképet használni a kulcs-érték párok tárolásához és visszakereséséhez. Annak ellenére, hogy a közösségi verzió elérhető az alapvető funkciók többségével, a kereskedelmi verzió rendelkezik néhány fejlett funkcióval, például az adatreplikációval több szerveren keresztül és távoli hívásokkal.
Az itt tárgyalt összes példa megtalálható a Github projektben.