Trgovina ključnih vrijednosti s mapom kronika

1. Pregled

U ovom uputstvu vidjet ćemo kako možemo koristiti Kroničnu kartu za pohranu parova ključ / vrijednost. Također ćemo stvoriti kratke primjere kako bismo demonstrirali njegovo ponašanje i upotrebu.

2. Što je kronična karta?

Slijedom dokumentacije, "Chronicle Map je superbrza memorijska memorija koja ne blokira ključeve i vrijednosti, dizajnirana je za aplikacije s malim kašnjenjem i / ili više procesa".

Ukratko, to je spremište ključeva i vrijednosti. Za pravilno funkcioniranje mape nije potrebna velika količina RAM-a. Može rasti na temelju dostupnog kapaciteta diska. Nadalje, podržava replikaciju podataka u postavljanju višestrukog glavnog poslužitelja.

Pogledajmo sada kako to možemo postaviti i raditi.

3. Ovisnost Mavena

Da bismo započeli, trebamo dodati ovisnost karte kronika u naš projekt:

 net.openhft kronika-karta 3.17.2 

4. Vrste kronične karte

Zemljovid možemo stvoriti na dva načina: ili kao memorijsku ili kao trajnu kartu.

Pogledajmo obje ove detaljno.

4.1. Karta u memoriji

Kronična karta u memoriji je spremište mapa koje se kreira u fizičkoj memoriji poslužitelja. To znači dostupan je samo u okviru JVM postupka u kojem se kreira spremište karata.

Pogledajmo brzi primjer:

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

Radi jednostavnosti izrađujemo mapu koja pohranjuje 50 ID-ova zemalja i njihova imena. Kao što možemo vidjeti u isječku koda, stvaranje je prilično jednostavno, osim za Prosječna vrijednost() konfiguracija. Ovo govori karti da konfigurira prosječni broj bajtova koje uzimaju vrijednosti unosa u mapu.

Drugim riječima, prilikom izrade karte, Kronična karta određuje prosječni broj bajtova koji uzima serializirani oblik vrijednosti. To čini serializacijom zadane prosječne vrijednosti pomoću konfiguriranih maršalera vrijednosti. Zatim će dodijeliti utvrđeni broj bajtova za vrijednost svakog unosa karte.

Jedna stvar koju moramo imati na umu kada je u pitanju karta u memoriji jest da su podaci dostupni samo kad je JVM postupak živ. Knjižnica će obrisati podatke kad se postupak završi.

4.2. Ustrajna karta

Za razliku od mape u memoriji, implementacija će spremiti trajnu mapu na disk. Pogledajmo sada kako možemo stvoriti trajnu mapu:

ChronicleMap persistentCountryMap = ChronicleMap .of (LongValue.class, CharSequence.class) .name ("map-country"). Entries (50) .averageValue ("America") .createPersistedTo (nova datoteka (System.getProperty ("user.home) ") +" /country-details.dat "));

Ovo će stvoriti datoteku pod nazivom zemlja-detalji.dat u navedenoj mapi. Ako je ova datoteka već dostupna u navedenom putu, tada će implementacija graditelja otvoriti vezu do postojeće pohrane podataka iz ovog JVM postupka.

Upornu mapu možemo iskoristiti u slučajevima kada to želimo:

  • preživjeti izvan procesa stvaratelja; na primjer, za podršku preraspodjeli aplikacija
  • učiniti ga globalnim na serveru; na primjer, za podršku višestrukom istodobnom pristupu procesa
  • ponašati se kao spremište podataka koje ćemo spremiti na disk

5. Konfiguracija veličine

Obavezno je konfigurirati prosječnu vrijednost i prosječni ključ tijekom stvaranja Kronične karte, osim u slučaju kada je naš tip ključ / vrijednost ili primitivan u okvir ili sučelje vrijednosti. U našem primjeru ne konfiguriramo prosječni ključ od tipa ključa LongValue je sučelje vrijednosti.

Sada, da vidimo koje su mogućnosti za konfiguriranje prosječnog broja bajtova ključ / vrijednost:

  • Prosječna vrijednost() - Vrijednost od koje se određuje prosječni broj bajtova koji se dodjeljuju za vrijednost unosa karte
  • averageValueSize () - Prosječni broj bajtova koji se dodjeljuju za vrijednost unosa na karti
  • constantValueSizeBySample () - Broj bajtova koji će se dodijeliti za vrijednost unosa karte kada je veličina vrijednosti uvijek ista
  • prosjekKljuč () - Ključ iz kojeg se određuje prosječni broj bajtova koji će se dodijeliti ključu unosa karte
  • averageKeySize () - Prosječni broj bajtova koji će se dodijeliti ključu unosa na karti
  • constantKeySizeBySample () - Broj bajtova koji će se dodijeliti ključu unosa na karti kada je veličina ključa uvijek ista

6. Vrste ključeva i vrijednosti

Postoje određeni standardi kojih se moramo pridržavati prilikom stvaranja Kronične karte, posebno kada definiramo ključ i vrijednost. Karta najbolje funkcionira kada kreiramo ključ i vrijednost pomoću preporučenih vrsta.

Evo nekoliko preporučenih vrsta:

  • Vrijednost sučelja
  • Bilo koja klasa koja provodi Provodivo sučelje iz Chronicle Bytesa
  • Bilo koja klasa koja provodi BytesMarshallable sučelje iz Chronicle Bytes-a; klasa implementacije trebala bi imati javni no-arg konstruktor
  • bajt[] i ByteBuffer
  • CharSequence, Niz, i StringBuilder
  • Cijeli broj, Dugo, i Dvostruko
  • Bilo koja klasa koja provodi java.io.Externalizable; klasa implementacije trebala bi imati javni no-arg konstruktor
  • Bilo koja vrsta implementacije java.io.Serializable, uključujući primitivne tipove u okvirima (osim onih gore navedenih) i tipove polja
  • Bilo koja druga vrsta, ako su ponuđeni prilagođeni serializatori

7. Ispitivanje kronične mape

Chronicle Map podržava upite s jednim ključem, kao i upite s više ključeva.

7.1. Upiti s jednim ključem

Upiti s jednim ključem su operacije koje se bave jednim ključem. Kronična karta podržava sve operacije s Jave Karta sučelje i Istodobna karta sučelje:

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

Uz uobičajene operacije dobivanja i stavljanja, Kronična karta dodaje posebnu operaciju, getUsing (), koji smanjuje trag memorije tijekom dohvaćanja i obrade unosa. Pogledajmo ovo na djelu:

Ključ LongValue = Values.newHeapInstance (LongValue.class); StringBuilder country = novi StringBuilder (); key.setValue (1); persistedCountryMap.getUsing (ključ, država); assertThat (country.toString (), je (jednakTo ("Rumunjska"))); key.setValue (2); persistedCountryMap.getUsing (ključ, država); assertThat (country.toString (), je (jednakTo ("Indija")));

Ovdje smo koristili isto StringBuilder objekt za dohvaćanje vrijednosti različitih ključeva prosljeđivanjem na getUsing () metoda. U osnovi koristi isti objekt za dohvaćanje različitih unosa. U našem slučaju, getUsing () metoda je ekvivalentna:

country.setLength (0); country.append (persistentCountryMap.get (ključ));

7.2. Upiti s više ključeva

Možda postoje slučajevi upotrebe u kojima trebamo raditi s više ključeva istovremeno. Za to možemo koristiti queryContext () funkcionalnost. The queryContext () metoda stvorit će kontekst za rad s unosom karte.

Prvo napravimo multimapu i dodajte joj neke vrijednosti:

Postavi prosječnu vrijednost = IntStream.of (1, 2) .boxed (). Collect (Collectors.toSet ()); Kronična karta multiMap = ChronicleMap .of (Integer.class, (Class) (Class) Set.class) .name ("multi-map") .entries (50) .averageValue (averageValue) .create (); Postavi set1 = novi HashSet (); set1.add (1); set1.add (2); multiMap.put (1, set1); Postavi set2 = novi HashSet (); set2.add (3); multiMap.put (2, set2);

Da bismo radili s više unosa, moramo ih zaključati kako bismo spriječili nedosljednost koja se može dogoditi zbog istodobnog ažuriranja:

probajte (ExternalMapQueryContext var13 -> fistContext = multiMap.queryContext (1)) {try (ExternalMapQueryContext var13 -> secondContext = multiMap.queryContext (2)) {fistContext.updateLock (). lock (); secondContext.updateLock (). lock (); MapEntry firstEntry = fistContext.entry (); Postavi firstSet = firstEntry.value (). Get (); firstSet.remove (2); MapEntry secondEntry = secondContext.entry (); Postavi secondSet = secondEntry.value (). Get (); secondSet.add (4); firstEntry.doReplaceValue (fistContext.wrapValueAsData (firstSet)); secondEntry.doReplaceValue (secondContext.wrapValueAsData (secondSet)); }} konačno {assertThat (multiMap.get (1) .size (), is (jednakTo (1))); assertThat (multiMap.get (2) .size (), je (jednakTo (2))); }

8. Zatvaranje Kronične karte

Sad kad smo završili s radom s našim kartama, nazovimo Zatvoriti() metoda na našim objektima mape za oslobađanje memorije izvan hrpe i resursa povezanih s njom:

persistentCountryMap.close (); inMemoryCountryMap.close (); multiMap.close ();

Ovdje treba imati na umu da se sve operacije na karti moraju dovršiti prije zatvaranja karte. U suprotnom, JVM se može neočekivano srušiti.

9. Zaključak

U ovom smo tutorijalu naučili kako koristiti Kroničnu kartu za pohranu i dohvaćanje parova ključ / vrijednost. Iako je verzija zajednice dostupna s većinom osnovnih funkcionalnosti, komercijalna verzija ima neke napredne značajke poput replikacije podataka na više poslužitelja i udaljenih poziva.

Svi primjeri o kojima smo ovdje razgovarali mogu se naći u projektu Github.


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