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.


$config[zx-auto] not found$config[zx-overlay] not found