Obchod s kľúčovými hodnotami s mapou kroniky

1. Prehľad

V tomto výučbe sa dozvieme, ako môžeme použiť mapu kroník na ukladanie párov kľúč - hodnota. Budeme tiež vytvárať krátke príklady na demonštráciu jeho správania a použitia.

2. Čo je mapa kroniky?

Podľa dokumentácie „Chronicle Map je superrýchly obchod v pamäti, ktorý neblokuje kľúč a hodnotu, navrhnutý pre aplikácie s nízkou latenciou a / alebo pre viac procesov.“

Stručne povedané, je to hromadný obchod s kľúčmi a hodnotami. Mapa pre svoju správnu funkciu nevyžaduje veľké množstvo pamäte RAM. Môže rásť na základe dostupnej kapacity disku. Ďalej podporuje replikáciu údajov v nastavení servera s viacerými hlavnými servermi.

Pozrime sa teraz, ako to môžeme nastaviť a pracovať.

3. Maven závislosť

Na začiatok budeme musieť do nášho projektu pridať závislosť mapy kroník:

 net.openhft kronika-mapa 3.17.2 

4. Druhy mapy kroniky

Mapu môžeme vytvoriť dvoma spôsobmi: buď ako mapu v pamäti, alebo ako trvalú mapu.

Pozrime sa na obe tieto veci podrobne.

4.1. Mapa v pamäti

Mapa kroniky v pamäti je úložisko máp, ktoré sa vytvára vo fyzickej pamäti servera. To znamená je prístupná iba v rámci procesu JVM, v ktorom je vytvorený obchod s mapami.

Pozrime sa na krátky príklad:

ChronicleMap inMemoryCountryMap = ChronicleMap .of (LongValue.class, CharSequence.class) .name ("country-map") .entries (50) .averageValue ("America") .create ();

Kvôli jednoduchosti vytvárame mapu, ktorá obsahuje 50 identifikátorov krajín a ich názvy. Ako vidíme na útržku kódu, tvorba je až na priemerná hodnota() konfigurácia. Toto informuje mapu, aby konfigurovala priemerný počet bajtov prijatých hodnotami vstupu do mapy.

Inými slovami, pri vytváraní mapy určuje Kronická mapa priemerný počet bajtov prijatých serializovanou formou hodnôt. Robí to tak, že serializuje danú priemernú hodnotu pomocou konfigurátorov hodnotových hodnôt. Potom pridelí určený počet bajtov pre hodnotu každého záznamu mapy.

Jedna vec, ktorú si musíme uvedomiť, pokiaľ ide o mapu v pamäti, je, že údaje sú prístupné iba vtedy, keď je proces JVM živý. Knižnica vymaže údaje po ukončení procesu.

4.2. Trvalá mapa

Na rozdiel od mapy v pamäti implementácia uloží pretrvávajúcu mapu na disk. Pozrime sa teraz, ako môžeme vytvoriť pretrvávajúcu mapu:

ChronicleMap persistedCountryMap = ChronicleMap .of (LongValue.class, CharSequence.class) .name ("country-map") .entries (50) .averageValue ("America") .createPersistedTo (nový súbor (System.getProperty ("user.home) ") +" /country-details.dat "));

Týmto sa vytvorí súbor s názvom country-details.dat v zadanom priečinku. Ak je tento súbor už k dispozícii v zadanej ceste, potom implementácia nástroja Builder otvorí odkaz na existujúce úložisko údajov z tohto procesu JVM.

Trvalú mapu môžeme využiť v prípadoch, keď to chceme:

  • prežiť nad rámec procesu tvorcu; napríklad na podporu horúceho presunu aplikácií
  • urobiť z neho globálny server; napríklad na podporu viacnásobného súbežného prístupu k procesu
  • funguje ako dátový sklad, ktorý uložíme na disk

5. Konfigurácia veľkosti

Pri vytváraní Chronicle Map je povinné konfigurovať priemernú hodnotu a priemerný kľúč, s výnimkou prípadu, keď náš typ kľúča / hodnoty je buď krabicový primitív alebo hodnotové rozhranie. V našom príklade nekonfigurujeme priemerný kľúč od typu kľúča LongValue je hodnotové rozhranie.

Teraz sa pozrime, aké sú možnosti konfigurácie priemerného počtu bajtov kľúč / hodnota:

  • priemerná hodnota() - Hodnota, od ktorej sa určuje priemerný počet bajtov, ktoré sa majú prideliť pre hodnotu záznamu mapy
  • averageValueSize () - Priemerný počet bajtov, ktoré sa majú prideliť pre hodnotu záznamu na mape
  • constantValueSizeBySample () - Počet bajtov, ktoré sa majú prideliť pre hodnotu záznamu v mape, keď je veľkosť hodnoty vždy rovnaká
  • averageKey () - Kľúč, z ktorého sa určuje priemerný počet bajtov, ktoré sa majú prideliť pre kľúč záznamu na mape
  • averageKeySize () - Priemerný počet bajtov, ktoré sa majú prideliť pre kľúč záznamu na mape
  • constantKeySizeBySample () - Počet bajtov, ktoré sa majú prideliť kľúču záznamu na mape, keď je veľkosť kľúča vždy rovnaká

6. Kľúčové a hodnotové typy

Existujú určité štandardy, ktoré musíme dodržiavať pri vytváraní Kronickej mapy, najmä pri definovaní kľúča a hodnoty. Mapa funguje najlepšie, keď kľúč a hodnotu vytvárame pomocou odporúčaných typov.

Tu sú niektoré z odporúčaných typov:

  • Hodnota rozhrania
  • Akákoľvek trieda implementujúca Bytable rozhranie z Kroniky bajtov
  • Akákoľvek trieda implementujúca BajtyMarshallable rozhranie z Kroniky bajtov; implementačná trieda by mala mať verejný konštruktor no-arg
  • byte [] a ByteBuffer
  • CharSequence, Stringa StringBuilder
  • Celé číslo, Dlhéa Dvojitý
  • Akákoľvek trieda implementujúca java.io.Externalizable; implementačná trieda by mala mať verejný konštruktor no-arg
  • Implementácia ľubovoľného typu java.io. Serializovateľné, vrátane primitívnych typov v krabici (okrem tých, ktoré sú uvedené vyššie) a typov polí
  • Akýkoľvek iný typ, ak sú k dispozícii vlastné serializátory

7. Dotaz na mapu kroniky

Kronická mapa podporuje dotazy s jedným aj viacerými kľúčmi.

7.1. Jednokľúčové dotazy

Dotazy s jedným kľúčom sú operácie, ktoré sa zaoberajú jedným kľúčom. ChronicleMap podporuje všetky operácie z Java Mapa rozhranie a ConcurrentMap rozhranie:

LongValue qatarKey = Values.newHeapInstance (LongValue.class); qatarKey.setValue (1); inMemoryCountryMap.put (qatarKey, "Katar"); // ... CharSequence country = inMemoryCountryMap.get (kľúč);

Okrem bežných operácií get and put, ChronicleMap pridáva špeciálnu operáciu, getUsing (), čo znižuje pamäťovú stopu pri načítaní a spracovaní záznamu. Uvidíme v akcii:

Kľúč LongValue = Values.newHeapInstance (LongValue.class); StringBuilder country = new StringBuilder (); key.setValue (1); persistedCountryMap.getUsing (kľúč, krajina); assertThat (country.toString (), is (equalTo ("Rumunsko"))); key.setValue (2); persistedCountryMap.getUsing (kľúč, krajina); assertThat (country.toString (), je (rovná sa („India“)));

Tu sme použili to isté StringBuilder objekt na načítanie hodnôt rôznych kľúčov jeho odovzdaním do getUsing () metóda. V podstate opakovane používa rovnaký objekt na načítanie rôznych záznamov. V našom prípade getUsing () metóda je ekvivalentná:

country.setLength (0); country.append (persistedCountryMap.get (kľúč));

7.2. Multikľúčové dotazy

Môžu sa vyskytnúť prípady použitia, keď musíme narábať s viacerými kľúčmi súčasne. Na tento účel môžeme použiť queryContext () funkčnosť. The queryContext () metóda vytvorí kontext pre prácu so záznamom na mape.

Najskôr vytvorme multimapu a pridajme k nej nejaké hodnoty:

Nastaviť averageValue = IntStream.of (1, 2) .boxed (). Collect (Collectors.toSet ()); ChronicleMap multiMap = ChronicleMap .of (Integer.class, (trieda) (Class) Set.class) .name ("multi-map") .entries (50) .averageValue (averageValue) .create (); Set set1 = new HashSet (); set1.add (1); set1.add (2); multiMap.put (1, množina1); Set set2 = new HashSet (); set2.add (3); multiMap.put (2, množina2);

Ak chcete pracovať s viacerými položkami, musíme tieto položky uzamknúť, aby sa zabránilo nekonzistencii, ktorá sa môže vyskytnúť v dôsledku súbežnej aktualizácie:

skúste (ExternalMapQueryContext var13 -> fistContext = multiMap.queryContext (1)) {try (ExternalMapQueryContext var13 -> secondContext = multiMap.queryContext (2)) {fistContext.updateLock (). lock (); secondContext.updateLock (). lock (); MapEntry firstEntry = fistContext.entry (); Nastaviť firstSet = firstEntry.value (). Get (); firstSet.remove (2); MapEntry secondEntry = secondContext.entry (); Nastaviť secondSet = secondEntry.value (). Get (); secondSet.add (4); firstEntry.doReplaceValue (fistContext.wrapValueAsData (firstSet)); secondEntry.doReplaceValue (secondContext.wrapValueAsData (secondSet)); }} nakoniec {assertThat (multiMap.get (1) .size (), je (rovnáTo (1))); assertThat (multiMap.get (2) .size (), je (equalTo (2))); }

8. Zatvorenie mapy kroniky

Teraz, keď sme dokončili prácu s našimi mapami, nazvime to Zavrieť() metóda na našich mapových objektoch na uvoľnenie medzipalubnej pamäte a prostriedkov s ňou spojených:

persistedCountryMap.close (); inMemoryCountryMap.close (); multiMap.close ();

Tu treba pamätať na jednu vec, že ​​pred zatvorením mapy musia byť dokončené všetky operácie s mapou. V opačnom prípade by mohlo dôjsť k neočakávanému zlyhaniu JVM.

9. Záver

V tomto tutoriáli sme sa naučili, ako používať Mapu kroník na ukladanie a načítanie párov kľúč - hodnota. Aj keď je komunitná verzia k dispozícii s väčšinou základných funkcií, komerčná verzia má niektoré pokročilé funkcie, ako je replikácia údajov na viacerých serveroch a vzdialené volania.

Všetky príklady, o ktorých sme tu hovorili, nájdete v rámci projektu Github.


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