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.