Bevezetés a Jedisbe - a Java Redis kliens könyvtárba

1. Áttekintés

Ez a cikk az bevezetés Jedisbe, egy ügyfélkönyvtár a Java-ban a Redis számára - a népszerű memóriában lévő adatszerkezeti tár, amely a lemezen is fennmaradhat. Kulcstár alapú adatstruktúra vezérli az adatok megőrzését, és adatbázisként, gyorsítótárként, üzenetközvetítőként stb. Használható.

Először meg fogjuk magyarázni, hogy a Jedis milyen helyzetekben hasznos és miről szól.

A következő szakaszokban a különféle adatszerkezetekkel foglalkozunk, és elmagyarázzuk a tranzakciókat, a folyamatokat és a közzététel / feliratkozás funkciót. Végül a kapcsolat-pooling és a Redis Cluster segítségével fejezzük be.

2. Miért pont Jedis?

Redis felsorolja a legismertebb kliens könyvtárakat a hivatalos webhelyükön. A Jedisnek többféle alternatívája van, de jelenleg csak kettő érdemes ajánlási csillagukra, a saláta és a Redisson.

Ennek a két kliensnek vannak olyan egyedi jellemzői, mint a szálbiztonság, az átlátszó újracsatlakozás kezelése és az aszinkron API, amelyek mindegyikének hiányzik a Jedis.

Ugyanakkor kicsi és lényegesen gyorsabb, mint a másik kettő. Ezenkívül ez a Spring Framework fejlesztői által választott ügyfélkönyvtár, és mindhárom legnagyobb közösséggel rendelkezik.

3. Maven-függőségek

Kezdjük azzal, hogy deklaráljuk az egyetlen függőséget, amelyre szükségünk lesz pom.xml:

 redis.kliensek jedis 2.8.1 

Ha a könyvtár legújabb verzióját keresi, nézze meg ezt az oldalt.

4. Redis telepítés

Telepítenie és indítania kell a Redis egyik legújabb verzióját. Jelenleg a legújabb stabil verziót futtatjuk (3.2.1), de a 3.x utáni verzióknak rendben kell lenniük.

Itt talál további információt a Redis for Linux és Macintosh programról, ezek nagyon hasonló alapvető telepítési lépéseket tartalmaznak. A Windows hivatalosan nem támogatott, de ez a port jól karbantartott.

Ezt követően közvetlenül belemerülhetünk és csatlakozhatunk hozzá a Java kódunkból:

Jedis jedis = új Jedis ();

Az alapértelmezett konstruktor remekül fog működni, hacsak nem a nem alapértelmezett porton vagy egy távoli gépen indította el a szolgáltatást. Ebben az esetben helyesen konfigurálhatja azt, ha a helyes értékeket paraméterként adja át a konstruktornak.

5. Redis adatstruktúrák

A natív műveleti parancsok többsége támogatott, és megfelelő módon általában ugyanaz a metódusnév.

5.1. Húrok

A karakterláncok a Redis-érték legalapvetőbb fajtái, amelyek akkor hasznosak, ha egyszerű kulcsérték-adattípusokat kell fenntartani:

jedis.set ("események / város / Róma", "32,15,223,828"); String cachedResponse = jedis.get ("események / város / Róma");

A változó cachedResponse meg fogja tartani az értéket 32,15,223,828. A később tárgyalt lejárati támogatással együtt villámgyorsan és egyszerűen használható gyorsítótár-rétegként működhet a webalkalmazáshoz érkezett HTTP-kérésekhez és egyéb gyorsítótárazási követelményekhez.

5.2. Listák

A Redis Lists egyszerűen karakterláncok listája, beszúrási sorrend szerint rendezve, és ideális eszközzé teszi például üzenetsorok megvalósítását:

jedis.lpush ("sor # feladatok", "firstTask"); jedis.lpush ("sor # feladatok", "secondTask"); Karaktersorozat = jedis.rpop ("sor # feladatok");

A változó feladat meg fogja tartani az értéket firstTask. Ne feledje, hogy bármely objektumot sorosíthat, és megtarthatja karakterláncként, így a sorban lévő üzenetek szükség esetén összetettebb adatokat is hordozhatnak.

5.3. Készletek

A Redis Sets egy sorozatlan string-gyűjtemény, amely hasznos lehet, ha ki akarja zárni az ismételt tagokat:

jedis.sadd ("becenevek", "becenév # 1"); jedis.sadd ("becenevek", "2. becenév"); jedis.sadd ("becenevek", "becenév # 1"); Állítsa be a beceneveket = jedis.smembers ("becenevek"); logikai érték létezik = jedis.sismember ("becenevek", "becenév # 1");

Java készlet beceneveket mérete 2 lesz, a második összeadása becenév # 1 figyelmen kívül hagyták. Továbbá a létezik változó értéke: igaz, a módszer, a metódus sismember lehetővé teszi, hogy gyorsan ellenőrizze egy adott tag létezését.

5.4. Hashes

Redis Hashes térképez Húr mezők és Húr értékek:

jedis.hset ("user # 1", "name", "Peter"); jedis.hset ("1. felhasználó", "munka", "politikus"); Karakterlánc neve = jedis.hget ("felhasználó # 1", "név"); Térképmezők = jedis.hgetAll ("user # 1"); Karaktersorozat = mezők.get ("job");

Mint láthatja, a kivonatok nagyon kényelmes adattípusok, ha az objektum tulajdonságait egyenként akarja elérni, mivel nem kell az egész objektumot letölteni.

5.5. Válogatott készletek

A rendezett halmazok olyanok, mint egy halmaz, ahol minden tag társított rangsorral rendelkezik, amelyet a rendezéshez használnak:

Térkép pontszámok = új HashMap (); scores.put ("PlayerOne", 3000,0); scores.put ("PlayerTwo", 1500.0); scores.put ("PlayerThree", 8200,0); scores.entrySet (). forEach (playerScore -> {jedis.zadd (kulcs, playerScore.getValue (), playerScore.getKey ());}); Vonós játékos = jedis.zrevrange ("rangsor", 0, 1) .iterátor (). Következő (); hosszú rang = jedis.zrevrank ("rangsor", "PlayerOne");

A változó játékos meg fogja tartani az értéket PlayerThree mert behívjuk a legjobb 1 játékost, és ő az, akinek a legmagasabb a pontszáma. A rang változó értéke 1 lesz, mert PlayerOne a rangsorban a második, a rangsor pedig nulla alapú.

6. Tranzakciók

A tranzakciók garantálják az atomosságot és a menetbiztonsági műveleteket, ami azt jelenti, hogy a többi ügyfél kéréseit soha nem kezeljük egyszerre a Redis tranzakciók során:

Karakterlánc barátokPrefix = "friends #"; Karakterlánc userOneId = "4352523"; String userTwoId = "5552321"; Tranzakció t = jedis.multi (); t.sadd (friendsPrefix + userOneId, userTwoId); t.sadd (friendsPrefix + userTwoId, userOneId); t.exec ();

Akár azt is, hogy a tranzakció sikere egy adott kulcstól függ, azáltal, hogy közvetlenül megnézi azt, mielõtt példányosítja a kulcsot Tranzakció:

jedis.watch ("friends # törölve #" + userOneId);

Ha a kulcs értéke a tranzakció végrehajtása előtt megváltozik, a tranzakció nem lesz sikeresen befejezve.

7. Csővezeték

Ha több parancsot kell küldenünk, akkor egy kérésbe csomagolhatjuk őket, és a csővezetékek használatával menthetjük a csatlakozási költségeket, ez lényegében hálózatoptimalizálás. Amíg a műveletek egymástól függetlenek, kihasználhatjuk ezt a technikát:

Karakterlánc userOneId = "4352523"; String userTwoId = "4849888"; Csővezeték p = jedis.vezetékes (); p.sadd ("keresett #" + userOneId, "párizs"); p.zadd ("rangsor", 126, userOneId); p.zadd ("rangsor", 325, userTwoId); Válasz pipExists = p.sismember ("keresett #" + userOneId, "párizs"); Válasz pipeRanking = p.zrange ("rangsor", 0, -1); p.sync (); Karakterlánc létezik = pipeExists.get (); Rangsor beállítása = pipeRanking.get ();

Figyeljük meg, hogy nem kapunk közvetlen hozzáférést a parancsválaszokhoz, ehelyett kapunk egy Válasz példány, ahonnan kérhetjük az alapul szolgáló választ a folyamat szinkronizálása után.

8. Közzététel / Feliratkozás

Használhatjuk a Redis üzenetküldő közvetítő funkcióját üzenetek küldésére rendszerünk különböző összetevői között. Győződjön meg arról, hogy az előfizetői és a kiadói szálak nem ugyanazt a Jedis-kapcsolatot használják.

8.1. Előfizető

Feliratkozás és egy csatornára küldött üzenetek meghallgatása:

Jedis jSubscriber = új Jedis (); jSubscriber.subscribe (new JedisPubSub () {@Orride public void onMessage (String channel, String message) {// kezelni az üzenetet}}, "channel");

A Feliratkozás blokkolási módszer, le kell iratkoznia a JedisPubSub kifejezetten. Felülírtuk a onMessage módszerrel, de sokkal több hasznos módszer áll rendelkezésre a felülírásra.

8.2. Kiadó

Ezután egyszerűen küldjön üzeneteket ugyanarra a csatornára a kiadó szálából:

Jedis jPublisher = új Jedis (); jPublisher.publish ("csatorna", "tesztüzenet");

9. Kapcsolat-pooling

Fontos tudni, hogy a Jedis-példánnyal való kapcsolatunk naiv. Valódi helyzetben nem szeretne egyetlen példányt használni több szálon futó környezetben, mivel egyetlen példány nem biztonságos a szálak számára.

Szerencsére könnyen létrehozhatunk egy kapcsolatkészletet a Redis-szel, hogy igény szerint újrafelhasználhassuk. Ez a készlet biztonságos és megbízható, mindaddig, amíg visszaadja az erőforrást a készletbe, ha végzett vele.

Hozzuk létre a JedisPool:

végleges JedisPoolConfig poolConfig = buildPoolConfig (); JedisPool jedisPool = új JedisPool (poolConfig, "localhost"); privát JedisPoolConfig buildPoolConfig () {final JedisPoolConfig poolConfig = new JedisPoolConfig (); poolConfig.setMaxTotal (128); poolConfig.setMaxIdle (128); poolConfig.setMinIdle (16); poolConfig.setTestOnBorrow (true); poolConfig.setTestOnReturn (true); poolConfig.setTestWhileIdle (true); poolConfig.setMinEvictableIdleTimeMillis (Duration.ofSeconds (60) .toMillis ()); poolConfig.setTimeBetweenEvictionRunsMillis (Duration.ofSeconds (30) .toMillis ()); poolConfig.setNumTestsPerEvictionRun (3); poolConfig.setBlockWhenExhausted (true); return poolConfig; }

Mivel a készlet példány szálbiztonságos, statikusan tárolhatja valahol, de ügyelnie kell a készlet megsemmisítésére, hogy elkerülje a szivárgást az alkalmazás leállításakor.

Most szükség esetén használhatjuk medencéinket az alkalmazás bárhonnan:

try (Jedis jedis = jedisPool.getResource ()) {// műveleteket végez a jedis erőforrással}

A Java try-with-resources utasítást használtuk, hogy elkerüljük a Jedis erőforrás manuális bezárását, de ha nem tudja használni ezt az utasítást, akkor manuálisan is bezárhatja az erőforrást a végül kikötés.

Győződjön meg róla, hogy olyan készletet használ, amely az alkalmazásunkban le van írva, ha nem akar csúnya többszálas problémával szembesülni. Nyilvánvalóan játszhat a pool konfigurációs paramétereivel, hogy a rendszer legjobb beállításaihoz igazítsa.

10. Redis Cluster

Ez a Redis megvalósítás könnyű skálázhatóságot és magas rendelkezésre állást kínál. Javasoljuk, hogy olvassa el a hivatalos specifikációt, ha még nem ismeri. A Redis-fürt beállítására nem térünk ki, mivel ez kissé kívül esik a cikk terjedelmében, de ezzel nem kell problémát okoznia, ha elkészült a dokumentációjával.

Ha ez készen áll, elkezdhetjük használni az alkalmazásunkból:

try (JedisCluster jedisCluster = new JedisCluster (new HostAndPort ("localhost", 6379))) {// használja a jedisCluster erőforrást, mintha normál Jedis erőforrás lenne} fogás (IOException e) {}

Csak a gazdagép és a port részleteit kell megadnunk az egyik fő példányunkból, az automatikusan felfedezi a fürt többi példányát.

Ez minden bizonnyal nagyon erős tulajdonság, de nem ezüst golyó. A Redis Cluster használatakor nem hajthat végre tranzakciókat, és nem használhat csővezetékeket, amelyek két fontos tulajdonság, amelyekre számos alkalmazás támaszkodik az adatok integritásának biztosításában.

A tranzakciók le vannak tiltva, mert fürtözött környezetben a kulcsok több példányban is megmaradnak. A műveletek atomossága és a szálbiztonság nem garantálható azoknál a műveleteknél, amelyek parancs végrehajtását tartalmazzák különböző esetekben.

Néhány fejlett kulcs létrehozási stratégia biztosítja, hogy az Ön számára érdekes adatok ugyanabban a példányban való kitartása így is megmaradjon. Elméletileg ennek lehetővé kell tennie a tranzakciók sikeres végrehajtását a Redis Klaszter egyik mögöttes Jedis-példányának felhasználásával.

Sajnos jelenleg nem tudja megtudni, hogy egy adott kulcs melyik Redis példányt menti a Jedis használatával (amelyet a Redis ténylegesen natív módon támogat), így nem tudja, melyik példányból kell végrehajtania a tranzakciós műveletet. Ha ez érdekli, további információt itt talál.

11. Következtetés

A Redis szolgáltatásainak túlnyomó többsége már elérhető a Jedisben, és fejlesztése jó ütemben halad előre.

Lehetővé teszi, hogy az erőteljes memóriatároló motort nagyon kicsi gondokkal integrálja az alkalmazásába, csak ne felejtse el létrehozni a kapcsolatkészletet a szálbiztonsági problémák elkerülése érdekében.

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