Korištenje Guavinog MapMaker-a

1. Uvod

Kartograf je graditeljska klasa u Guavi koja olakšava stvaranje karata zaštićenih nitima.

Java već podržava WeakHashMap za korištenje tipki Slabe reference. Ali, nema gotovog rješenja koje bi isto koristilo za vrijednosti. Srećom, Kartograf pruža jednostavne metode graditelja koje treba koristiti Slaba referenca i za ključeve i za vrijednosti.

U ovom uputstvu, da vidimo kako Kartograf olakšava izradu više karata i upotrebu slabih referenci.

2. Ovisnost Mavena

Prije svega, dodajmo ovisnost Google Guava, koja je dostupna na Maven Central:

 com.google.guava guava 29,0-jre 

3. Primjer keširanja

Razmotrimo jednostavan scenarij poslužitelja koji održava nekoliko predmemorija za korisnike: predmemorija sesije i predmemorija profila.

Predmemorija sesije kratko traje, a njezini unosi postaju nevaljani nakon što korisnik više nije aktivan. Tako predmemorija može ukloniti unos za korisnika nakon što se korisnički objekt prikupi smeće.

Predmemorija profila, međutim, može imati veće vrijeme trajanja (TTL). Unosi u predmemoriju profila postaju nevaljani samo kada korisnik ažurira svoj profil.

U ovom slučaju, predmemorija može ukloniti unos samo kada se objekt profila prikuplja smeće.

3.1. Strukture podataka

Stvorimo klase koje će predstavljati te entitete.

Prvo ćemo započeti s korisnikom:

korisnik javne klase {private long id; privatni naziv niza; javni korisnik (dugi id, naziv niza) {this.id = id; this.name = ime; } public long getId () {return id; } javni String getName () {return ime; }}

Zatim sesija:

javna klasa Sjednica {private long id; javna sjednica (dugi id) {this.id = id; } public long getId () {return id; }} 

I na kraju profil:

Profil javne klase {private long id; tip privatnog niza; javni profil (dugi id, vrsta niza) {this.id = id; this.type = type; } public long getId () {return id; } javni String getName () {return type; }}

3.2. Izrada predmemorija

Stvorimo instancu Istodobna karta za predmemoriju sesije pomoću makeMap metoda:

ConcurrentMap sessionCache = novi MapMaker (). MakeMap ();

Vraćena karta ne dopušta null vrijednosti i za ključ i za vrijednost.

Ajmo sada stvoriti još jedan primjerak Istodobna karta za predmemoriju profila:

ConcurrentMap profileCache = novi MapMaker (). MakeMap ();

Primijetite da nismo naveli početni kapacitet predmemorija. Tako,Kartograf prema zadanim postavkama kreira kartu kapaciteta 16.

Ako želimo, možemo izmijeniti kapacitet pomoću početni kapacitet metoda:

ConcurrentMap profileCache = novi MapMaker (). InitiCapacity (100) .makeMap ();

3.3. Promjena razine istodobnosti

Kartograf setovi zadana vrijednost za razinu istodobnosti na 4. Međutim sessionCache treba podržati veći broj istodobnih ažuriranja bez ikakvih prepirki u niti.

Evo, istodobnostLevel u pomoć dolazi metoda graditelja:

ConcurrentMap sessionCache = novi MapMaker (). ConcurrencyLevel (10) .makeMap ();

3.4. Korištenje slabih referenci

Karte koje smo gore stvorili koriste snažne reference i za ključeve i za vrijednosti. Dakle, unosi ostaju na karti čak i ako su ključevi i vrijednosti prikupljeni smećem. Umjesto toga trebali bismo koristiti slabe reference.

A sessionCache unos je nevaljan nakon što se ključ (korisnički objekt) prikuplja smeće. Dakle, poslužimo se slabim referencama za tipke:

ConcurrentMap sessionCache = novi MapMaker (). SlabKeys (). MakeMap ();

Za predmemorija profila, možemo koristiti slabe reference za vrijednosti:

ConcurrentMap profileCache = novi MapMaker (). SlabValues ​​(). MakeMap ();

Kad se ove reference prikupljaju smeće, Guava to jamči unosi neće biti uključeni u bilo koju narednu operaciju čitanja ili pisanja na karti. Međutim veličina() metoda ponekad može biti nedosljedna i može ih uključivati unosi.

4. Kartograf Unutarnji dijelovi

Kartograf stvara a ConcurrentHashMap prema zadanim postavkama ako slabe reference nisu omogućene. Provjere jednakosti događaju se uobičajenom metodom jednakosti.

Ako omogućimo slabe reference, onda Kartograf stvara prilagođenu kartu predstavljeni skupom hash tablica iznutra. Također dijeli slične karakteristike performansi kao i ConcurrentHashMap.

Međutim, važna razlika sa WeakHashMap jest da se provjere jednakosti događaju putem identiteta (== i identityHashCode) usporedbe.

5. Zaključak

U ovom kratkom članku naučili smo kako koristiti Kartograf klase za stvaranje mape zaštićene nitima. Također smo vidjeli kako prilagoditi kartu tako da koristi slabe reference.

Kao i uvijek, puni izvorni kôd članka dostupan je na GitHub-u.


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