Útmutató Redishez Redissonnal

1. Áttekintés

A Redisson egy Redis kliens a Java számára. Ebben a cikkben megvizsgáljuk néhány jellemzőjét, és bemutatjuk, hogyan segíthetné elő az elosztott üzleti alkalmazások felépítését.

A Redisson a memóriában lévő adatrácsot alkotja amely elosztott Java objektumokat és szolgáltatásokat kínál Redis támogatásával. Elosztott memóriájú adatmodellje lehetővé teszi a tartományi objektumok és szolgáltatások megosztását alkalmazások és szerverek között.

Ebben a cikkben hamarosan látni fogjuk a Redisson beállítását, megértjük annak működését, és felfedezhetjük a Redisson néhány tárgyát és szolgáltatását.

2. Maven-függőségek

Kezdjük az importálással Redisson projektünkhöz az alábbi szakasz hozzáadásával a projektünkhöz pom.xml:

 org.redisson redisson 3.13.1 

A függőség legújabb verziója itt található.

3. Konfiguráció

Mielőtt elkezdenénk, meg kell győződnünk arról, hogy rendelkezünk a Redis legfrissebb verziójával és telepítésével. Ha még nem rendelkezik Redis-szel, és Linuxot vagy Macintosh-t használ, az itt található információkat követheti a beállításhoz. Ha Ön Windows-felhasználó, akkor a nem hivatalos port segítségével beállíthatja a Redist.

Be kell állítanunk a Redissont, hogy csatlakozzon a Redishez. A Redisson támogatja a kapcsolatokat a következő Redis-konfigurációkkal:

  • Egyetlen csomópont
  • Mester rabszolga csomópontokkal
  • Sentinel bólint
  • Fürtözött csomópontok
  • Replikált csomópontok

A Redisson támogatja az Amazon Web Services (AWS) ElastiCache fürtöt és az Azure Redis gyorsítótárat fürtözött és replikált csomópontokhoz.

Csatlakozzunk a Redis egyetlen csomópontú példányához. Ez a példány helyben fut az alapértelmezett 6379-es porton:

RedissonClient kliens = Redisson.create ();

Különböző konfigurációkat adhat át a Redisson objektumé teremt módszer. Ez lehet konfiguráció, hogy egy másik porthoz csatlakozzon, vagy esetleg egy Redis-fürthöz. Ez A konfiguráció lehet Java-kód, vagy külső konfigurációs fájlból tölthető be.

3.1. Java konfiguráció

Konfiguráljuk a Redissont Java-kódban:

Config config = új Config (); config.useSingleServer () .setAddress ("redis: //127.0.0.1: 6379"); RedissonClient kliens = Redisson.create (config);

Mi adja meg a Redisson-konfigurációkat a Konfig tárgy majd adja át a teremt módszer. A fentiekben megadtuk Redisson-nek, hogy a Redis egyetlen csomópontú példányához szeretnénk csatlakozni. Ehhez a Konfig objektumé useSingleServer módszer. Ez egy hivatkozást ad vissza a SingleServerConfig tárgy.

A SingleServerConfig Az objektumnak vannak olyan beállításai, amelyeket a Redisson a Redis egyetlen csomópont-példányához való kapcsolódáshoz használ. Itt használjuk setAddress metódus a cím beállítás. Ez állítja be annak a csomópontnak a címét, amelyhez kapcsolódunk. Néhány egyéb beállítás tartalmazza a próbálkozzon újra, kapcsolat időtúllépés és Ügyfél Neve. Ezek a beállítások a megfelelő beállító módszerekkel konfigurálhatók.

A Redissont a Redis különböző konfigurációihoz hasonló módon konfigurálhatjuk a Konfig objektum következő módszerei:

  • useSingleServer - egycsomópontos példányhoz. Itt szerezheti be az egy csomópont beállításait
  • useMasterSlaveServers - rabszolgacsomópontú mester számára. Itt szerezheti be a master-slave csomópont beállításait
  • useSentinelServers - őrcsomópontokra. Itt kaphatja meg az őrszem csomópont beállításait
  • useClusterServers - fürtözött csomópontokhoz. Itt fürtözött csomópontbeállításokat kaphat
  • useReplicatedServers - replikált csomópontokhoz. Itt kaphatja meg a replikált csomópont-beállításokat

3.2. Fájl konfigurálása

A Redisson külső JSON-ból vagy YAML-ből töltheti be a konfigurációkat fájlok:

Config config = Config.fromJSON (új fájl ("singleNodeConfig.json")); RedissonClient kliens = Redisson.create (config);

A Konfig objektumé tólJSON metódus betöltheti a konfigurációkat egy karakterláncból, fájlból, bemeneti adatfolyamból vagy URL-ből.

Itt található a minta konfigurációja a singleNodeConfig.json fájl:

{"singleServerConfig": {"idleConnectionTimeout": 10000, "connectTimeout": 10000, "timeout": 3000, "retryAtt próbálkozások": 3, "retryInterval": 1500, "password": null, "subscriptionsPerConnection": 5, "clientName ": null," address ":" redis: //127.0.0.1: 6379 "," subscriptionConnectionMinimumIdleSize ": 1," subscriptionConnectionPoolSize ": 50," connectionMinimumIdleSize ": 10," connectionPoolSize ": 64," adatbázis ": 0, "dnsMonitoringInterval": 5000}, "szálak": 0, "nettyThreads": 0, "kodek": null}

Itt van egy megfelelő YAML konfigurációs fájl:

singleServerConfig: idleConnectionTimeout: 10000 connectTimeout: 10000 timeout: 3000 újra 64 adatbázis: 0 dnsMonitoringInterval: 5000 szál: 0 nettyThreads: 0 kodek:! {} 

Konfigurálhatunk más Redis-konfigurációkat is egy fájlból hasonló módon, az adott konfigurációra jellemző beállításokkal. Tájékoztatásul, itt vannak a JSON és YAML fájlformátumok:

  • Egy csomópont - formátum
  • Mester szolga csomópontokkal - formátum
  • Sentinel csomópontok - formátum
  • Fürtözött csomópontok - formátum
  • Replikált csomópontok - formátum

A Java konfiguráció JSON vagy YAML formátumba történő mentéséhez használhatjuk a toJSON vagy toYAML módszerei Konfig tárgy:

Config config = új Config (); // ... itt több beállítást konfigurálunk a Java karakterláncban: jsonFormat = config.toJSON (); String yamlFormat = config.toYAML ();

Most, hogy tudjuk, hogyan kell konfigurálni a Redissont, nézzük meg, hogyan hajtja végre a Redisson a műveleteket.

4. Működés

A Redisson támogatja a szinkron, aszinkron és reaktív interfészeket. Műveletek ezek felett az interfészek menetesek.

Minden entitás (objektumok, gyűjtemények, zárak és szolgáltatások), amelyeket a RedissonClient szinkron és aszinkron módszerekkel rendelkeznek. A szinkron módszerek aszinkron változatokat hordoznak. Ezek a módszerek általában ugyanazt a metódusnevet viselik, mint az „Async” mellékelt szinkronváltozataik. Vizsgáljuk meg a RAtomicLong tárgy:

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

A szinkron aszinkron változata CompareAndSet módszer a következő lenne:

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

A módszer aszinkron változata egy RFuture tárgy. Beállíthatjuk, hogy a hallgatók visszakapják az eredményt, amikor elérhetővé válik:

isSet.handle ((eredmény, kivétel) -> {// itt kezeli az eredményt vagy kivételt.});

Reaktív objektumok előállításához a RedissonReactiveClient:

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

Ez a módszer a reaktív objektumokat adja vissza a Java 9 Reactive Streams Standard alapján.

Fedezzük fel a Redisson által biztosított elosztott objektumokat.

5. Tárgyak

A A Redisson objektum sorosítva van, és a Redissont támogató Redis csomópontok bármelyikében tárolódik. Ezek az objektumok egy fürtben oszthatók el több csomóponton, és egyetlen alkalmazással vagy több alkalmazással / kiszolgálóval érhetők el.

Ezek az elosztott objektumok követik a java.util.concurrent.atomic csomag. Támogatják a Redis-ben tárolt objektumok zárolás nélküli, szálbiztos és atomi műveleteit. Az alkalmazások / kiszolgálók közötti adatkonzisztencia biztosított, mivel az értékek nem frissülnek, miközben egy másik alkalmazás az objektumot olvassa.

A Redisson objektumok a Redis kulcsokhoz vannak kötve. Ezeket a kulcsokat a RKeys felület. Ezután ezeken a billentyűkön keresztül elérhetjük Redisson-objektumainkat.

Számos lehetőséget használhatunk a Redis kulcsok megszerzésére.

Egyszerűen megszerezhetjük az összes kulcsot:

RKeys kulcsok = client.getKeys ();

Alternatív megoldásként csak a neveket vonhatjuk ki:

Iterálható allKeys = keys.getKeys ();

És végül elérhetjük, hogy a kulcsok megfeleljenek egy mintának:

Iterálható kulcsokByPattern = keys.getKeysByPattern ('kulcs *')

Az RKeys interfész lehetővé teszi a kulcsok törlését, a minták szerinti törlést és más hasznos kulcsalapú műveleteket is, amelyeket felhasználhatnánk a kulcsok és objektumok kezelésére.

A Redisson által biztosított terjesztett objektumok a következők:

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

Vessünk egy pillantást az alábbi három objektumra: ObjectHolder, AtomicLong, és Téma.

5.1. Tárgytartó

Képviseli a RBucket osztályban, ez az objektum bármilyen típusú objektumot tartalmazhat. Az objektum maximális mérete 512 MB:

RBucket vödör = client.getBucket ("főkönyv"); bucket.set (new Ledger ()); Ledger ledger = vödör.get ();

A RBucket objektum végezhet atomi műveleteket, mint pl hasonlítsa összeAndSet ésgetAndSet a rajta lévő tárgyakon.

5.2. AtomicLong

Képviseli a RAtomicLong osztályban ez az objektum nagyon hasonlít a java.util.concurrent.atomic.AtomicLong osztály és képviseli a hosszú atomilag frissíthető érték:

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

5.3. Téma

A Téma objektum támogatja a Redis „közzététel és feliratkozás” mechanizmusát. A közzétett üzenetek meghallgatása:

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

Fent a Téma regisztrálva van a „baeldung” csatornáról érkező üzenetek meghallgatásához. Ezután hozzáadunk egy hallgatót a témához, hogy kezelje az adott csatornáról érkező üzeneteket. Több hallgatót felvehetünk egy csatornára.

Tegyünk közzé üzeneteket a „baeldung” csatornán:

RTopic publishTopic = client.getTopic ("baeldung"); long clientsReceivedMessage = publishTopic.publish (új CustomMessage ("Ez egy üzenet"));

Ezt közzé lehet tenni egy másik alkalmazásból vagy szerverről. A CustomMessage objektumot a hallgató megkapja, és a onMessage módszer.

Itt többet megtudhatunk más Redisson-objektumokról.

6. Gyűjtemények

A Redisson kollekciókat ugyanúgy kezeljük, mint a tárgyakat.

A Redisson által biztosított terjesztett gyűjtemények a következőket tartalmazzák:

  • Térkép
  • Multimap
  • Készlet
  • SortedSet
  • ScoredSortedSet
  • LexSortedSet
  • Lista
  • Sor
  • Deque
  • BlockingQueue
  • BoundedBlockingQueue
  • BlockingDeque
  • BlockingFairQueue
  • DelayedQueue
  • PriorityQueue
  • PriorityDeque

Vessünk egy pillantást a következő három gyűjteményre: Térkép, Set, és Lista.

6.1. Térkép

Redisson alapú térképek valósítják meg a java.util.concurrent.ConcurrentMap és java.util.Térkép interfészek. Redisson négy térképmegvalósítással rendelkezik. Ezek RMap, RMapCache, RLocalCachedMap és RClusteredMap.

Hozzunk létre egy térképet a Redisson segítségével:

RMap map = client.getMap ("főkönyv"); Ledger newLedger = map.put ("123", új Ledger ()); térkép

RMapCache támogatja a térképbejegyzés kilakoltatását. RLocalCachedMap lehetővé teszi a térképbejegyzések helyi gyorsítótárba helyezését. RClusteredMap lehetővé teszi, hogy egyetlen térkép adatait fel lehessen osztani a Redis-fürt fő csomópontjai között.

Itt többet megtudhatunk a Redisson-térképekről.

6.2. Készlet

Redisson alapú Készlet végrehajtja a java.util.Set felület.

Redissonnek három van Készlet megvalósítások, RSet, RSetCache, és RClusteredSet hasonló funkcionalitással, mint a térképi társaik.

Hozzunk létre egy Készlet Redissonnal:

RSet ledgerSet = client.getSet ("főkönyvkészlet"); ledgerSet.add (new Ledger ());

Itt többet megtudhatunk a Redisson-készletekről.

6.3. Lista

Redisson-alapú Listák végre a java.util.List felület.

Hozzunk létre egy Lista Redissonnal:

RList ledgerList = client.getList ("főkönyv"); ledgerList.add (új Ledger ());

A Redisson egyéb gyűjteményeiről itt tudhat meg többet.

7. Zárak és szinkronizátorok

Redisson-é az elosztott zárak lehetővé teszik a szálak szinkronizálását alkalmazások / szerverek között. Redisson zárak és szinkronizálók listája a következőket tartalmazza:

  • Zár
  • FairLock
  • MultiLock
  • ReadWriteLock
  • Szemafor
  • PermitExpirableSemaphore
  • CountDownLatch

Vessünk egy pillantást Zár és MultiLock.

7.1. Zár

Redisson-é Zár megvalósítja java.util.concurrent.locks.Lock felület.

Vezessünk be egy zárat, amelyet a RLock osztály:

RLock lock = client.getLock ("zár"); lock.lock (); // végezzen néhány hosszú műveletet ... lock.unlock ();

7.2. MultiLock

Redisson-é RedissonMultiLock többszörös csoportok RLock tárgyakat, és egyetlen zárként kezeli őket:

RLock lock1 = clientInstance1.getLock ("lock1"); RLock lock2 = clientInstance2.getLock ("lock2"); RLock lock3 = clientInstance3.getLock ("lock3"); RedissonMultiLock lock = új RedissonMultiLock (lock1, lock2, lock3); lock.lock (); // hosszú futási művelet végrehajtása ... lock.unlock ();

Itt többet tudhat meg más zárakról.

8. Szolgáltatások

Redisson négyféle elosztott szolgáltatást tár fel. Ezek: Távoli szolgáltatás, Élő objektum szolgáltatás, Végrehajtó szolgálat és Ütemezett végrehajtó szolgálat. Nézzük meg a Távoli szolgáltatást és az Élő objektum szolgáltatást.

8.1. Távoli szolgáltatás

Ez a szolgáltatás biztosítja Java távoli módszer meghívását Redis segíti. A Redisson távoli szolgáltatás egy kiszolgálóoldali (dolgozói példány) és kliensoldali megvalósításból áll. A kiszolgálóoldali megvalósítás az ügyfél által meghívott távoli metódust hajtja végre. A távoli szolgáltatásból érkező hívások lehetnek szinkronosak vagy aszinkronak.

A kiszolgáló oldala regisztrálja az interfészt a távoli meghíváshoz:

RRemoteService remoteService = client.getRemoteService (); LedgerServiceImpl ledgerServiceImpl = új LedgerServiceImpl (); remoteService.register (LedgerServiceInterface.class, ledgerServiceImpl);

Az ügyféloldal meghívja a regisztrált távoli interfész metódusát:

RRemoteService remoteService = client.getRemoteService (); LedgerServiceInterface ledgerService = remoteService.get (LedgerServiceInterface.class); Lista bejegyzések = ledgerService.getEntries (10);

Itt többet megtudhatunk a távoli szolgáltatásokról.

8.2. Élő objektum szolgáltatás

A Redisson Live Objects kiterjeszti a standard Java objektumok fogalmát, amelyekhez csak egyetlen JVM-től lehet hozzáférni továbbfejlesztett Java objektumok, amelyeket meg lehet osztani a különböző JVM-ek között, különböző gépeken. Ez úgy valósul meg, hogy az objektum mezőit egy Redis hash-hoz hozzárendeli. Ez a leképezés futásidejűleg felépített proxy osztályon keresztül történik. A terepi getterek és beállítók a Redis hget / hset parancsokra vannak leképezve.

A Redisson Live Objects támogatja az atommező hozzáférést Redis egyszálú jellege miatt.

Élő objektum létrehozása egyszerű:

@REntity public class LedgerLiveObject {@RId privát karakterlánc neve; // szerelők és beállítók ...}

Jelöljük az osztályunkat azzal @REntity és egy egyedi vagy azonosító mező a @RId. Miután ezt megtettük, használhatjuk az élő objektumunkat az alkalmazásunkban:

RLiveObjectService service = client.getLiveObjectService (); LedgerLiveObject főkönyv = new LedgerLiveObject (); ledger.setName ("főkönyv1"); főkönyv = service.persist (főkönyv);

Live Object-jünket a standard Java objektumokhoz hasonlóan hozzuk létre a új kulcsszó. Ezután használjuk a RLiveObjectService hogy az objektumot Redis-re mentse annak használatával kitartani módszer.

Ha az objektum korábban már fennmaradt a Redis számára, akkor lekérhetjük az objektumot:

LedgerLiveObject returnLedger = service.get (LedgerLiveObject.class, "főkönyv1");

Használjuk a RLiveObjectService hogy megkapjuk a Live Object-t a (z) mezővel annotált mező használatával @RId.

Itt többet találhatunk a Redisson Live Objects-ről, és itt leírjuk a Redisson egyéb szolgáltatásait.

9. Csővezeték

Redisson támogatja a csővezeték-vezetést. Több művelet köthető össze egyetlen atomi műveletként. Ezt elősegíti a RBatch osztály. Több parancsot összesítenek egy an ellen RBatch objektumpéldány a végrehajtás előtt:

RBatch batch = kliens.createBatch (); batch.getMap ("főkönyv"). fastPutAsync ("1", "2"); batch.getMap ("főkönyvMap"). putAsync ("2", "5"); BatchResult batchResult = batch.execute ();

10. Szkriptelés

Redisson támogatja az LUA szkriptelését. Végrehajthatjuk az LUA szkriptjeit Redis ellen:

client.getBucket ("foo"). set ("bar"); Karakterlánc eredménye = client.getScript (). Eval (Mode.READ_ONLY, "return redis.call ('get', 'foo')", RScript.ReturnType.VALUE);

11. Alacsony szintű kliens

Lehetséges, hogy olyan Redis műveleteket szeretnénk végrehajtani, amelyeket a Redisson még nem támogat. A Redisson egy alacsony szintű klienst biztosít, amely lehetővé teszi a natív Redis parancsok végrehajtását:

RedisClientConfig redisClientConfig = új RedisClientConfig (); redisClientConfig.setAddress ("localhost", 6379); RedisClient kliens = RedisClient.create (redisClientConfig); RedisConnection conn = kliens.connect (); conn.sync (StringCodec.INSTANCE, RedisCommands.SET, "teszt", 0); conn.closeAsync (); kliens.leállítás ();

Az alacsony szintű kliens az aszinkron műveleteket is támogatja.

12. Következtetés

Ez a cikk bemutatta a Redissont és néhány olyan funkciót, amelyek ideálisak az elosztott alkalmazások fejlesztéséhez. Felfedeztük az elosztott tárgyakat, gyűjteményeket, zárakat és szolgáltatásokat. Megvizsgáltuk néhány egyéb funkcióját is, mint például a pipelining, a scripting és az alacsony szintű kliens.

A Redisson integrációt biztosít más keretekkel is mint például a JCache API, a Tavaszi gyorsítótár, a Hibernált gyorsítótár és a Tavaszi munkamenetek. Itt többet megtudhat más keretekkel való integrációjáról.

Kódmintákat a GitHub projektben találhat.