Sprievodca po Redise s Redissonom

1. Prehľad

Redisson je klientom Redis pre Javu. V tomto článku preskúmame niektoré z jeho funkcií a ukážeme, ako by to mohlo uľahčiť vytváranie distribuovaných obchodných aplikácií.

Redisson predstavuje dátovú mriežku v pamäti ktorá ponúka distribuované objekty Java a služby podporované spoločnosťou Redis. Jeho distribuovaný dátový model v pamäti umožňuje zdieľanie doménových objektov a služieb medzi aplikáciami a servermi.

V tomto článku uvidíme, ako bude hotové nastavenie Redissonu, pochopenie jeho fungovania a preskúmanie niektorých Redissonových objektov a služieb.

2. Maven závislosti

Začnime importom Redisson do nášho projektu pridaním sekcie nižšie do nášho pom.xml:

 org.redisson redisson 3.13.1 

Najnovšiu verziu tejto závislosti nájdete tu.

3. Konfigurácia

Než začneme, musíme sa ubezpečiť, že máme nainštalovanú a spustenú najnovšiu verziu nastavenia Redis. Ak nemáte Redis a používate Linux alebo Macintosh, môžete si ho podľa nastavenia tu nastaviť. Ak ste používateľom systému Windows, môžete Redis nastaviť pomocou tohto neoficiálneho portu.

Musíme nakonfigurovať Redisson na pripojenie k Redis. Redisson podporuje pripojenia k nasledujúcim konfiguráciám Redis:

  • Jeden uzol
  • Master s podriadenými uzlami
  • Sentinelové uzly
  • Klastrované uzly
  • Replikované uzly

Redisson podporuje Amazon Web Services (AWS) ElastiCache Cluster a Azure Redis Cache pre klastrované a replikované uzly.

Pripojme sa k inštancii Redis s jedným uzlom. Táto inštancia je spustená lokálne na predvolenom porte 6379:

Klient RedissonClient = Redisson.create ();

Môžete odovzdať rôzne konfigurácie Redisson objektu vytvoriť metóda. Môže to byť konfigurácia, ktorá umožní pripojenie k inému portu alebo pripojenie klastra Redis. Toto konfigurácia môže byť v kóde Java alebo načítaná z externého konfiguračného súboru.

3.1. Konfigurácia Java

Poďme nakonfigurovať Redisson v kóde Java:

Config config = nový Config (); config.useSingleServer () .setAddress ("redis: //127.0.0.1: 6379"); RedissonClient client = Redisson.create (config);

My zadajte konfiguráciu Redisson v inštancii a Konfig objekt a potom ju odovzdať vytvoriť metóda. Vyššie sme zadali Redissonu, že sa chceme pripojiť k jednej inštancii uzla Redis. K tomu sme použili Konfig objektu useSingleServer metóda. Týmto sa vráti odkaz na a SingleServerConfig objekt.

The SingleServerConfig objekt má nastavenia, ktoré Redisson používa na pripojenie k inštancii jedného uzla Redis. Tu používame jeho setAddress metóda konfigurácie adresa nastavenie. Toto nastavuje adresu uzla, ku ktorému sa pripájame. Niektoré ďalšie nastavenia zahŕňajú retryAttempts, spojenie vypršalo a meno klienta. Tieto nastavenia sa konfigurujú pomocou zodpovedajúcich metód nastavenia.

Môžeme nakonfigurovať Redisson pre rôzne konfigurácie Redis podobným spôsobom pomocou Konfig nasledujúce metódy objektu:

  • useSingleServer - pre inštanciu jedného uzla. Tu získate nastavenia jedného uzla
  • useMasterSlaveServers - pre majstra s podradenými uzlami. Tu získate nastavenia uzlov typu master-slave
  • useSentinelServers - pre sentinelové uzly. Tu získate nastavenia sentinelového uzla
  • useClusterServers - pre zoskupené uzly. Tu získate nastavenia zoskupených uzlov
  • useReplicatedServers - pre replikované uzly. Tu získate nastavenia replikovaných uzlov

3.2. Konfigurácia súboru

Redisson môže načítať konfigurácie z externého formátu JSON alebo YAML súbory:

Config config = Config.fromJSON (nový súbor ("singleNodeConfig.json")); RedissonClient client = Redisson.create (config);

The Konfig objektu odJSON metóda môže načítať konfigurácie z reťazca, súboru, vstupného toku alebo adresy URL.

Tu je ukážka konfigurácie v singleNodeConfig.json spis:

{"singleServerConfig": {"idleConnectionTimeout": 10000, "connectTimeout": 10 000, "timeout": 3000, "retryAttempts": 3, "retryInterval": 1500, "heslo": null, "subscriptionsPerConnection": 5, "clientName" ": null," address ":" redis: //127.0.0.1: 6379 "," subscriptionConnectionMinimumIdleSize ": 1," subscriptionConnectionPoolSize ": 50," connectionMinimumIdleSize ": 10," connectionPoolSize ": 64," databáza ": 0, "dnsMonitoringInterval": 5000}, "vlákna": 0, "nettyThreads": 0, "kodek": null}

Tu je zodpovedajúci konfiguračný súbor YAML:

singleServerConfig: idleConnectionTimeout: 10 000 connectTimeout: 10 000 timeout: 3000 retryAttempts: 3 retryInterval: 1500 heslo: null subscriptionsPerConnection: 5 clientName: null address: "redis: //127.0.0.1: 6379" subscriptionConnectionMinimumIdleSize: 50 connectionConnection: 1 subscriptionConnection: 64 databáza: 0 dnsMonitoringInterval: 5 000 vlákien: 0 nettyThreads: 0 kodek:! {} 

Môžeme nakonfigurovať ďalšie konfigurácie Redis zo súboru podobným spôsobom pomocou nastavení vlastných tejto konfigurácii. Pre vašu informáciu, tu sú ich formáty súborov JSON a YAML:

  • Jeden uzol - formát
  • Master s podradenými uzlami - formát
  • Uzly hliadky - formát
  • Klastrované uzly - formát
  • Replikované uzly - formát

Na uloženie konfigurácie Java do formátu JSON alebo YAML môžeme použiť toJSON alebo toYAML metódy Konfig objekt:

Config config = nový Config (); // ... konfigurujeme tu viac nastavení v Java String jsonFormat = config.toJSON (); Reťazec yamlFormat = config.toYAML ();

Teraz, keď vieme, ako nakonfigurovať Redisson, sa pozrime na to, ako Redisson vykonáva operácie.

4. Prevádzka

Redisson podporuje synchrónne, asynchrónne a reaktívne rozhrania. Operácie nad nimi rozhrania sú bezpečné pre vlákna.

Všetky entity (objekty, zbierky, zámky a služby) vygenerované a RedissonClient majú synchrónne a asynchrónne metódy. Synchrónne metódy majú asynchrónne varianty. Tieto metódy majú obyčajne rovnaký názov metódy ako ich synchrónne varianty pripojené k výrazu „Async“. Pozrime sa na synchrónnu metódu RAtomicLong objekt:

Klient RedissonClient = Redisson.create (); RAtomicLong myLong = client.getAtomicLong ('myLong'); 

Asynchrónny variant synchrónneho porovnaj a nastav metóda by bola:

RFuture isSet = myLong.compareAndSetAsync (6, 27);

Asynchrónny variant metódy vracia znak RFuture objekt. Môžeme nastaviť poslucháčov na tento objekt, aby vrátili výsledok, keď bude k dispozícii:

isSet.handle ((výsledok, výnimka) -> {// tu spracujeme výsledok alebo výnimku.});

Na generovanie reaktívnych objektov by sme potrebovali použiť RedissonReactiveClient:

RedissonReactiveClient client = Redisson.createReactive (); RAtomicLongReactive myLong = client.getAtomicLong ("myLong"); Publisher isSetPublisher = myLong.compareAndSet (5, 28);

Táto metóda vracia reaktívne objekty na základe štandardu Reactive Streams pre Java 9.

Poďme preskúmať niektoré z distribuovaných objektov, ktoré poskytuje Redisson.

5. Predmety

Jednotlivé prípady a Objekt Redisson je serializovaný a uložený v ktoromkoľvek z dostupných uzlov Redis podporujúcich Redisson. Tieto objekty môžu byť distribuované v klastri na viacerých uzloch a je k nim možné získať prístup prostredníctvom jednej aplikácie alebo viacerých aplikácií / serverov.

Tieto distribuované objekty sa riadia špecifikáciami z java.util.concurrent.atomic balík. Podporujú bezrámikové, vláknové bezpečné a atómové operácie s objektmi uloženými v Redise. Konzistencia údajov medzi aplikáciami / servermi je zabezpečená, pretože hodnoty sa neaktualizujú, kým iná aplikácia číta objekt.

Objekty Redisson sú viazané na kľúče Redis. Tieto kľúče môžeme spravovať prostredníctvom RKeys rozhranie. A potom pomocou týchto klávesov pristupujeme k našim objektom Redisson.

Existuje niekoľko možností, ktoré môžeme použiť na získanie kľúčov Redis.

Môžeme jednoducho získať všetky kľúče:

RKeys keys = client.getKeys ();

Prípadne môžeme extrahovať iba mená:

Iterovateľné allKeys = keys.getKeys ();

A nakoniec sme schopní získať kľúče vyhovujúce vzoru:

Iterovateľné keysByPattern = keys.getKeysByPattern ('kľúč *')

Rozhranie RKeys tiež umožňuje mazanie kľúčov, mazanie kľúčov podľa vzoru a ďalšie užitočné operácie založené na kľúčoch, ktoré by sme mohli použiť na správu našich kľúčov a objektov.

Medzi distribuované objekty poskytované spoločnosťou Redisson patria:

  • ObjectHolder
  • BinaryStreamHolder
  • GeospatialHolder
  • BitSet
  • AtomicLong
  • AtomicDouble
  • Téma
  • BloomFilter
  • HyperLogLog

Pozrime sa na tri z týchto objektov: ObjectHolder, AtomicLong, a Téma.

5.1. Držiak predmetov

Zastúpená RBucket triedy môže tento objekt obsahovať akýkoľvek typ objektu. Tento objekt má maximálnu veľkosť 512 MB:

RBucket bucket = client.getBucket ("účtovná kniha"); bucket.set (new Ledger ()); Ledger ledger = bucket.get ();

The RBucket objekt môže vykonávať atómové operácie ako napr porovnaj AndSet agetAndSet na predmetoch, ktoré drží.

5.2. AtomicLong

Zastúpená RAtomicLong triedy sa tento objekt veľmi podobá java.util.concurrent.atomic.AtomicLong triedy a predstavuje a dlho hodnota, ktorú je možné atómovo aktualizovať:

RAtomicLong atomicLong = client.getAtomicLong ("myAtomicLong"); atomicLong.set (5); atomicLong.incrementAndGet ();

5.3. Téma

The Téma objekt podporuje mechanizmus Redis „publikovanie a prihlásenie na odber“. Ak si chcete vypočuť zverejnené správy, postupujte takto:

RTopic subscribeTopic = client.getTopic ("baeldung"); subscribeTopic.addListener (CustomMessage.class, (kanál, customMessage) -> future.complete (customMessage.getMessage ()));

Nad Téma je registrovaný na počúvanie správ z kanálu „baeldung“. Potom do témy pridáme poslucháča, ktorý bude spracovávať prichádzajúce správy z tohto kanála. Na kanál môžeme pridať viacerých poslucháčov.

Publikujme správy na kanál „baeldung“:

RTopic publishTopic = client.getTopic ("baeldung"); long clientsReceivedMessage = publishTopic.publish (nová CustomMessage ("Toto je správa"));

To by mohlo byť zverejnené z inej aplikácie alebo servera. The CustomMessage objekt dostane poslucháč a spracuje sa tak, ako je definované v onMessage metóda.

Tu sa môžeme dozvedieť viac o ďalších Redissonových objektoch.

6. Zbierky

S kolekciami Redisson manipulujeme rovnakým spôsobom ako s objektmi.

Distribuované zbierky poskytované spoločnosťou Redisson zahŕňajú:

  • Mapa
  • Multimap
  • Nastaviť
  • Zoradené
  • ScoredSortedSet
  • LexZoradené
  • Zoznam
  • Fronta
  • Deque
  • BlockingQueue
  • BoundedBlockingQueue
  • BlockingDeque
  • BlockingFairQueue
  • Oneskorená fronta
  • PriorityQueue
  • PriorityDeque

Pozrime sa na tri z týchto kolekcií: Mapa, Nastaviť, a Zoznam.

6.1. Mapa

Mapy založené na Redissone implementujú java.util.concurrent.ConcurrentMap a java.util.Map rozhrania. Redisson má štyri implementácie máp. Toto sú RMap, RMapCache, RLocalCachedMap a RClusteredMap.

Vytvorme mapu s Redissonom:

RMap map = client.getMap ("účtovná kniha"); Ledger newLedger = map.put ("123", new Ledger ()); mapa

RMapCache podporuje vysťahovanie záznamu na mape. RLocalCachedMap umožňuje lokálne ukladanie záznamov do mapy. RClusteredMap umožňuje rozdelenie údajov z jednej mapy medzi hlavné uzly klastra Redis.

Tu sa môžeme dozvedieť viac o mapách Redisson.

6.2. Nastaviť

Redisson založený Nastaviť realizuje java.util.Set rozhranie.

Redisson má tri Nastaviť implementácie, RSet, RSetCachea RClusteredSet s podobnou funkčnosťou ako ich náprotivky na mape.

Vytvorme a Nastaviť s Redissonom:

RSet ledgerSet = client.getSet ("ledgerSet"); ledgerSet.add (nový Ledger ());

Tu sa môžeme dozvedieť viac o Redissonových množinách.

6.3. Zoznam

Na základe Redissonu Zoznamy implementovať java.util.List rozhranie.

Vytvorme a Zoznam s Redissonom:

RList ledgerList = client.getList ("ledgerList"); ledgerList.add (nová Ledger ());

Tu sa môžeme dozvedieť viac o ďalších zbierkach Redisson.

7. Zámky a synchronizátory

Redissona distribuované zámky umožňujú synchronizáciu vlákien medzi aplikáciami / servermi. Zoznam zámkov a synchronizátorov spoločnosti Redisson obsahuje:

  • Zamknúť
  • FairLock
  • MultiLock
  • ReadWriteLock
  • Semafor
  • PermitExpirableSemaphore
  • CountDownLatch

Poďme sa na to pozrieť Zamknúť a MultiLock.

7.1. Zamknúť

Redissona Zamknúť náradie java.util.concurrent.locks.Lock rozhranie.

Implementujme zámok, ktorý predstavuje RLock trieda:

RLock lock = client.getLock ("zámok"); lock.lock (); // vykonať nejaké dlhé operácie ... lock.unlock ();

7.2. MultiLock

Redissona RedissonMultiLock skupiny viac RLock objekty a zaobchádza s nimi ako s jedným zámkom:

RLock lock1 = clientInstance1.getLock ("lock1"); RLock lock2 = clientInstance2.getLock ("lock2"); RLock lock3 = clientInstance3.getLock ("lock3"); Zámok RedissonMultiLock = nový RedissonMultiLock (zámok1, zámok2, zámok3); lock.lock (); // vykonať dlhotrvajúcu operáciu ... lock.unlock ();

Tu sa môžeme dozvedieť viac o ďalších zámkoch.

8. Služby

Redisson vystavuje 4 typy distribuovaných služieb. Sú to: Vzdialená služba, Služba živých objektov, Exekútorská služba a Plánovaná služba exekútora. Pozrime sa na Vzdialenú službu a Službu živých objektov.

8.1. Vzdialená služba

Táto služba poskytuje Vzdialené vyvolanie metódy Java uľahčené Redisom. Vzdialená služba Redisson sa skladá z implementácie na strane servera (inštancia pracovníka) a na strane klienta. Implementácia na strane servera vykonáva vzdialenú metódu vyvolanú klientom. Hovory zo vzdialenej služby môžu byť synchrónne alebo asynchrónne.

Na strane servera sa registruje rozhranie pre vzdialené volanie:

RRemoteService remoteService = client.getRemoteService (); LedgerServiceImpl ledgerServiceImpl = nový LedgerServiceImpl (); remoteService.register (LedgerServiceInterface.class, ledgerServiceImpl);

Na strane klienta sa volá metóda registrovaného vzdialeného rozhrania:

RRemoteService remoteService = client.getRemoteService (); LedgerServiceInterface ledgerService = remoteService.get (LedgerServiceInterface.class); Zoznam položiek = ledgerService.getEntries (10);

Tu sa môžeme dozvedieť viac informácií o vzdialených službách.

8.2. Služba živých objektov

Redisson Live Objects rozširujú koncept štandardných objektov Java, ku ktorým bolo možné pristupovať iba z jedného JVM vylepšené objekty Java, ktoré by mohli byť zdieľané medzi rôznymi JVM na rôznych strojoch. To sa dosiahne mapovaním polí objektu na hash Redis. Toto mapovanie sa vykonáva pomocou triedy proxy skonštruovanej za behu. Získavače a nastavovače poľa sú mapované na príkazy Redis hget / hset.

Redisson Live Objects podporuje prístup k atómovému poľu ako výsledok Redisovej povahy s jedným vláknom.

Vytvorenie živého objektu je jednoduché:

@ REntity verejná trieda LedgerLiveObject {@RId súkromné ​​meno reťazca; // zakladatelia a zakladatelia ...}

Anotujeme našu triedu @ REntity a jedinečné alebo identifikačné pole s @RId. Keď to urobíme, môžeme použiť náš živý objekt v našej aplikácii:

Služba RLiveObjectService = client.getLiveObjectService (); LedgerLiveObject ledger = nový LedgerLiveObject (); ledger.setName ("ledger1"); ledger = service.persist (ledger);

Náš živý objekt vytvárame ako štandardné objekty Java pomocou Nový kľúčové slovo. Potom použijeme inštanciu RLiveObjectService uložiť objekt do Redis pomocou jeho pretrvávať metóda.

Ak bol objekt predtým pretrvávajúci na Redis, môžeme ho načítať:

LedgerLiveObject returnLedger = service.get (LedgerLiveObject.class, "ledger1");

Používame RLiveObjectService aby sme dostali náš živý objekt pomocou poľa anotovaného s @RId.

Tu nájdeme viac podrobností o Redisson Live Objects a sú tu popísané ďalšie služby Redisson.

9. Pipelineovanie

Redisson podporuje pipeline. Viacero operácií je možné dávkovať ako jednu atómovú operáciu. Toto uľahčuje RBatch trieda. Viaceré príkazy sú agregované oproti RBatch inštancia objektu pred ich vykonaním:

Dávka RBatch = client.createBatch (); batch.getMap ("ledgerMap"). fastPutAsync ("1", "2"); batch.getMap ("ledgerMap"). putAsync ("2", "5"); BatchResult batchResult = batch.execute ();

10. Skriptovanie

Redisson podporuje skriptovanie LUA. Môžeme spustiť LUA skripty proti Redisovi:

client.getBucket ("foo"). set ("bar"); Výsledok reťazca = client.getScript (). Eval (Mode.READ_ONLY, "return redis.call ('get', 'foo')", RScript.ReturnType.VALUE);

11. Nízkoúrovňový klient

Je možné, že by sme mohli chcieť vykonať operácie Redis, ktoré Redisson ešte nepodporuje. Redisson poskytuje klienta na nízkej úrovni, ktorý umožňuje vykonávanie natívnych príkazov Redis:

RedisClientConfig redisClientConfig = nový RedisClientConfig (); redisClientConfig.setAddress ("localhost", 6379); RedisClient client = RedisClient.create (redisClientConfig); RedisConnection conn = client.connect (); conn.sync (StringCodec.INSTANCE, RedisCommands.SET, "test", 0); conn.closeAsync (); client.shutdown ();

Nízkoúrovňový klient podporuje aj asynchrónne operácie.

12. Záver

Tento článok predstavil Redisson a niektoré z funkcií, ktoré ho robia ideálnym pre vývoj distribuovaných aplikácií. Preskúmali sme jeho distribuované objekty, zbierky, zámky a služby. Preskúmali sme tiež niektoré z jeho ďalších funkcií, ako je pipeline, skriptovanie a jeho nízkoúrovňový klient.

Redisson tiež poskytuje integráciu s inými rámcami ako napríklad JCache API, Spring Cache, Hibernate Cache a Spring Sessions. Tu sa môžeme dozvedieť viac o jeho integrácii s inými rámcami.

Ukážky kódu nájdete v projekte GitHub.


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