A mai gyorsan változó szoftverfejlesztési világban a teljesítmény és a skálázhatóság kulcsfontosságú. Ahogy az alkalmazások egyre komplexebbé válnak, és egyre nagyobb adatmennyiséget kell kezelniük, úgy nő a gyors, hatékony és rugalmas adatkezelési megoldások iránti igény. Itt lép színre a Redis.
A Redis (Remote Dictionary Server) egy nyílt forráskódú, memóriában tárolt, kulcs-érték alapú adattároló, amely adatszerkezet-szerverként is funkcionál. Ez azt jelenti, hogy nem csupán egyszerű stringeket képes tárolni, hanem számos komplexebb adatszerkezetet, mint például listákat, halmazokat, hash-eket vagy rendezett halmazokat is, mindezt villámgyors sebességgel. A Redis széles körben használt gyorsítótárként, üzenetsor-kezelőként, valós idejű analitikához, munkamenet-kezeléshez és még sok másra. Képességei miatt vált nélkülözhetetlen eszközzé a modern fejlesztői eszköztárban.
Ahhoz, hogy teljes mértékben kihasználhassuk a Redis erejét, elengedhetetlen ismerni a legalapvetőbb és leggyakrabban használt parancsait. Ez a cikk egy átfogó útmutatót nyújt a legfontosabb Redis parancsokhoz, amelyeket minden fejlesztőnek ismernie kell, adatszerkezetekre bontva, példákkal és gyakorlati felhasználási javaslatokkal.
A Redis alapjai: Kulcsok és Adatszerkezetek
Minden adatot a Redisben egy kulccsal (key) azonosítunk. Ezek a kulcsok binárisan biztonságosak, ami azt jelenti, hogy bármilyen string (akár bináris adat) lehet kulcs vagy érték. A Redis ereje abban rejlik, hogy nem csupán egyszerű kulcs-érték párokat, hanem komplexebb adatszerkezeteket is képes kezelni, mint például:
- Stringek (Strings): Egyszerű szöveges vagy bináris értékek.
 - Listák (Lists): Rendezett gyűjtemények, elemek hozzáadása és kivétele a lista elejéről vagy végéről.
 - Hash-ek (Hashes): Objektumok tárolására alkalmas kulcs-érték párok gyűjteménye.
 - Halmazok (Sets): Rendezettlen, egyedi elemekből álló gyűjtemények.
 - Rendezett Halmazok (Sorted Sets): Halmazok, ahol minden elemhez egy lebegőpontos szám (score) tartozik, ami alapján rendezve van.
 
Most nézzük meg részletesebben ezeket az adatszerkezeteket és a hozzájuk tartozó parancsokat.
1. String (Karakterlánc) Parancsok
A stringek a Redis legegyszerűbb adattípusai, egy kulcshoz egy string érték tartozik. Akár 512 MB méretű is lehet egy string. Ideálisak gyorsítótárazáshoz, számlálókhoz vagy munkamenet-azonosítókhoz.
SET key value: Beállítja a megadott kulcs értékét. Ha a kulcs már létezik, felülírja azt.SET mykey "Hello Redis"GET key: Lekéri a megadott kulcs értékét.GET mykey # "Hello Redis"DEL key [key ...]: Töröl egy vagy több kulcsot. Ez a parancs minden adattípusra érvényes.DEL mykeyINCR key: Atomikus módon növeli a kulcs értékét 1-gyel. Csak egész számokat tartalmazó stringeken működik.SET counter 0 INCR counter # 1 INCR counter # 2DECR key: Atomikus módon csökkenti a kulcs értékét 1-gyel.DECR counter # 1INCRBY key increment: Növeli a kulcs értékét a megadottincrementértékkel.INCRBY counter 5 # 6APPEND key value: Hozzáfüzi azvalue-t a kulcs aktuális értékéhez.SET mykey "Hello" APPEND mykey " World" # "Hello World"GETRANGE key start end: Lekéri a string egy részét a megadott indexek között.GETRANGE mykey 0 4 # "Hello"SETEX key seconds value: Beállítja a kulcs értékét és egyidejűleg lejárati időt (TTL) ad hozzá másodpercekben. Kiváló gyorsítótárazáshoz.SETEX cache:item:123 60 "cached_data" # A kulcs 60 másodperc múlva lejárMSET key1 value1 [key2 value2 ...]: Több kulcs-érték pár beállítása egyszerre.MSET user:1:name "Alice" user:1:email "[email protected]"MGET key1 [key2 ...]: Több kulcs értékének lekérése egyszerre.MGET user:1:name user:1:email # ["Alice", "[email protected]"]
2. List (Lista) Parancsok
A listák rendezett string gyűjtemények. Kettős láncolt listaként vannak implementálva, ami lehetővé teszi a gyors hozzáadást és eltávolítást mind a lista elejéről, mind a végéről. Ideálisak üzenetsorok, feladatlisták vagy a legutóbbi elemek tárolására.
LPUSH key value [value ...]: Egy vagy több elemet ad hozzá a lista elejéhez (bal oldal).LPUSH mylist "task1" "task2" # A lista most: ["task2", "task1"]RPUSH key value [value ...]: Egy vagy több elemet ad hozzá a lista végéhez (jobb oldal).RPUSH mylist "task3" # A lista most: ["task2", "task1", "task3"]LPOP key: Eltávolítja és visszaadja a lista első elemét. Stack-ként való használathoz (LIFO).LPOP mylist # "task2" # A lista most: ["task1", "task3"]RPOP key: Eltávolítja és visszaadja a lista utolsó elemét. Queue-ként való használathoz (FIFO).RPOP mylist # "task3" # A lista most: ["task1"]LRANGE key start stop: Lekéri a lista elemeinek egy tartományát. Az0az első elem,-1az utolsó.RPUSH recent:posts "Post A" "Post B" "Post C" LRANGE recent:posts 0 -1 # ["Post A", "Post B", "Post C"] LRANGE recent:posts 0 1 # ["Post A", "Post B"]LLEN key: Visszaadja a lista hosszát.LLEN recent:posts # 3LINDEX key index: Visszaadja a listaindexpozícióján lévő elemét.LINDEX recent:posts 1 # "Post B"LTRIM key start stop: Csak a megadott tartományban lévő elemeket tartja meg, a többit törli. Gyakran használják korlátozott méretű listák fenntartására (pl. a 10 legutóbbi elem).LPUSH logs "log_entry_1" "log_entry_2" "log_entry_3" LTRIM logs 0 1 # Csak az első két elemet tartja meg LRANGE logs 0 -1 # ["log_entry_3", "log_entry_2"]
3. Hash (Hashmap/Objektum) Parancsok
A hash-ek tökéletesek objektumok, például felhasználói profilok vagy termékadatok tárolására. Egy hash egy kulcs-érték párok gyűjteménye, ahol minden kulcs egy mezőnek (field) felel meg, és az értéke ennek a mezőnek a string értéke. Képzeljünk el egy JSON objektumot.
HSET key field value [field value ...]: Beállít egy vagy több mező-érték párt a hash-ben.HSET user:100 name "John Doe" email "[email protected]" age 30HGET key field: Lekéri a megadott mező értékét a hash-ből.HGET user:100 name # "John Doe"HGETALL key: Lekéri az összes mezőt és értékét a hash-ből.HGETALL user:100 # 1) "name" # 2) "John Doe" # 3) "email" # 4) "[email protected]" # 5) "age" # 6) "30"HMGET key field1 [field2 ...]: Lekér több mező értékét a hash-ből.HMGET user:100 name email # ["John Doe", "[email protected]"]HDEL key field [field ...]: Töröl egy vagy több mezőt a hash-ből.HDEL user:100 ageHEXISTS key field: Ellenőrzi, hogy egy mező létezik-e a hash-ben.HEXISTS user:100 name # 1 (true) HEXISTS user:100 password # 0 (false)HKEYS key: Lekéri a hash összes mezőnevét.HKEYS user:100 # ["name", "email"]HVALS key: Lekéri a hash összes értékét.HVALS user:100 # ["John Doe", "[email protected]"]
4. Set (Halmaz) Parancsok
A halmazok rendezetlen gyűjtemények, amelyek egyedi string elemeket tartalmaznak. Ideálisak egyedi azonosítók tárolására, címkék kezelésére, vagy közös elemek keresésére több halmaz között.
SADD key member [member ...]: Egy vagy több elemet ad hozzá a halmazhoz. Ha egy elem már létezik, figyelmen kívül hagyja.SADD tags:article:1 "redis" "database" "nosql" "redis" # A halmaz most: {"redis", "database", "nosql"}SMEMBERS key: Lekéri a halmaz összes elemét.SMEMBERS tags:article:1 # {"redis", "database", "nosql"} (a sorrend nem garantált)SISMEMBER key member: Ellenőrzi, hogy egy adott elem tagja-e a halmaznak.SISMEMBER tags:article:1 "redis" # 1 (true) SISMEMBER tags:article:1 "cache" # 0 (false)SREM key member [member ...]: Eltávolít egy vagy több elemet a halmazból.SREM tags:article:1 "database"SCARD key: Visszaadja a halmaz elemeinek számát.SCARD tags:article:1 # 2SUNION key1 [key2 ...]: Visszaadja az összes halmaz egyesítését (union).SADD set1 "A" "B" SADD set2 "B" "C" SUNION set1 set2 # {"A", "B", "C"}SINTER key1 [key2 ...]: Visszaadja az összes halmaz metszetét (intersection).SINTER set1 set2 # {"B"}SDIFF key1 [key2 ...]: Visszaadja az első halmaz és a többi halmaz különbségét (difference).SDIFF set1 set2 # {"A"}
5. Sorted Set (Rendezett Halmaz) Parancsok
A rendezett halmazok a halmazokhoz hasonlóan egyedi string elemeket tárolnak, de minden elemhez tartozik egy lebegőpontos szám (score). Ezek az elemek a score alapján vannak rendezve, így ideálisak ranglisták, pontszámok vagy időbélyegek kezelésére.
ZADD key score member [score member ...]: Hozzáad egy vagy több elemet a rendezett halmazhoz, a hozzájuk tartozó score-ral.ZADD leaderboard 100 "PlayerA" 150 "PlayerB" 75 "PlayerC"ZRANGE key start stop [WITHSCORES]: Lekéri az elemeket a megadott index tartományból, növekvő score sorrendben. AWITHSCORESopcióval a score-okat is visszaadja.ZRANGE leaderboard 0 -1 WITHSCORES # 1) "PlayerC" # 2) "75" # 3) "PlayerA" # 4) "100" # 5) "PlayerB" # 6) "150"ZREVRANGE key start stop [WITHSCORES]: Ugyanaz, mint aZRANGE, de csökkenő score sorrendben. Kiváló ranglistákhoz.ZREVRANGE leaderboard 0 1 WITHSCORES # Az első két helyezett # 1) "PlayerB" # 2) "150" # 3) "PlayerA" # 4) "100"ZRANGEBYSCORE key min max [WITHSCORES]: Lekéri az elemeket a megadott score tartományból.ZRANGEBYSCORE leaderboard 100 200 WITHSCORES # PlayerA és PlayerBZSCORE key member: Lekéri egy adott tag score-ját.ZSCORE leaderboard "PlayerA" # "100"ZREM key member [member ...]: Eltávolít egy vagy több tagot a rendezett halmazból.ZREM leaderboard "PlayerC"ZINCRBY key increment member: Növeli egy tag score-ját a megadott értékkel.ZINCRBY leaderboard 50 "PlayerA" # PlayerA score-ja 150 lesz
Általános Kulcskezelési és Rendszer Parancsok
Ezek a parancsok az adatszerkezettől függetlenül működnek, és a kulcsok, valamint a Redis szerver általános kezelésére szolgálnak.
EXPIRE key seconds: Beállít egy lejárati időt (TTL) egy kulcsra másodpercekben. A kulcs automatikusan törlődik a megadott idő elteltével.SET cache:data "valuable_info" EXPIRE cache:data 3600 # 1 óra múlva lejárTTL key: Visszaadja a kulcs hátralévő lejárati idejét másodpercekben.TTL cache:data # pl. 3590PERSIST key: Eltávolítja a lejárati időt egy kulcsról, így az nem jár le automatikusan.PERSIST cache:dataTYPE key: Visszaadja egy kulcs adattípusát (pl.string,list,hash,set,zset,noneha nem létezik).TYPE mykey # "string"EXISTS key [key ...]: Ellenőrzi, hogy egy vagy több kulcs létezik-e.EXISTS mykey # 1 (true)KEYS pattern: Visszaadja az összes olyan kulcsot, amely megfelel a megadott mintának.KEYS user:* # Óvatosan használd éles környezetben, mert nagy adatbázis esetén blokkolhatja a szervert!
Pub/Sub (Publish/Subscribe)
A Redis beépített Publish/Subscribe (Pub/Sub) mechanizmusával valós idejű üzenetküldő rendszereket építhetünk ki. A kliensek feliratkozhatnak (SUBSCRIBE) csatornákra, és üzeneteket küldhetnek (PUBLISH) ezekre a csatornákra. Ideális chatekhez, értesítésekhez vagy esemény-streameléshez.
PUBLISH channel message: Üzenetet küld egy adott csatornára.PUBLISH chat:general "Hello everyone!"SUBSCRIBE channel [channel ...]: Feliratkozik egy vagy több csatornára. Egy külön kliens kapcsolat szükséges a feliratkozáshoz, mivel az blokkoló művelet.SUBSCRIBE chat:general system:alerts
Tranzakciók a Redisben (MULTI, EXEC, DISCARD)
A Redis támogatja a tranzakciókat, amelyek lehetővé teszik több parancs atomikus végrehajtását. Ez azt jelenti, hogy az összes parancs egyetlen lépésben, megszakítás nélkül fut le, garantálva az adatok konzisztenciáját.
MULTI: Elindít egy tranzakciót. Az ezután küldött parancsok sorba kerülnek, de nem futnak le azonnal.MULTIEXEC: Végrehajtja a sorba állított parancsokat.SET user:200:posts 0 INCR user:200:posts RPUSH user:200:activity "post_created" EXEC # Mindkét parancs atomikusan fut leDISCARD: Megszakítja a tranzakciót, törli az összes sorba állított parancsot.DISCARDWATCH key [key ...]: Optimista zárolás biztosítására szolgál. Figyeli a megadott kulcsok változásait aMULTIparancs előtt. Ha aWATCH-olt kulcsok bármelyike megváltozik azWATCHés azEXECközött, a tranzakció meghiúsul.WATCH mykey GET mykey MULTI SET mykey "newvalue" EXEC # Csak akkor fut le, ha a mykey nem változott WATCH óta
Redis a Gyakorlatban: Jó Tanácsok és Haladó Funkciók
A fenti parancsok ismerete elengedhetetlen, de a Redis valódi ereje a megfelelő használatában és a haladó funkciók kiaknázásában rejlik.
- Adattípus választás: Mindig a feladathoz legmegfelelőbb adatszerkezetet válaszd. Egy számlálóhoz stringet, egy felhasználói profilhoz hash-t, egy ranglistához rendezett halmazt használj. A helyes választás drámaian javítja a teljesítményt és csökkenti a memóriahasználatot.
 - Memória-optimalizálás: A Redis memóriában tárolja az adatokat, ezért fontos odafigyelni a memóriahasználatra. Használj rövid kulcsneveket és értékeket, ahol lehetséges. A 
MEMORY USAGEparancs segít a memóriafogyasztás elemzésében. - Perzisztencia: A Redis adatokat képes a lemezre írni (RDB snapshotting és AOF – Append Only File), így az adatok megmaradnak a szerver újraindítása után is. Éles környezetben ez alapvető a megbízhatóság érdekében.
 - Pipelining: Több parancsot küldhetsz a Redis szervernek egyetlen hálózati oda-vissza út (round-trip) során. Ez jelentősen csökkentheti a hálózati késleltetést, és növelheti az átviteli sebességet, különösen sok kis parancs esetén.
# A kliens oldalon: pipeline.SET("key1", "value1") pipeline.GET("key2") pipeline.INCR("counter") results = pipeline.execute() - Lua szkriptek: A Redis támogatja a Lua szkriptek futtatását a szerveren. Ezek a szkriptek atomikusan futnak, ami azt jelenti, hogy egyetlen szkript végrehajtása során a Redis nem hajt végre más parancsokat. Ez rendkívül hasznos komplexebb, több lépésből álló műveletek atomikus végrehajtásához.
 - Redis Cluster: Nagyméretű, skálázható alkalmazásokhoz a Redis Cluster biztosítja az adatok automatikus felosztását több Redis példány között (sharding) és a magas rendelkezésre állást.
 - Tranzakciók és 
WATCH: AWATCHparancs, kombinálva aMULTIésEXECparancsokkal, lehetővé teszi az optimista zárolást, ami kritikus a konzisztens adatok fenntartásához versengő környezetekben. 
Összegzés
A Redis egy rendkívül sokoldalú és nagy teljesítményű eszköz, amely modern alkalmazások széles skálájának gerincét képezi. A fenti parancsok megismerése és megértése alapvető lépés a Redis mesterévé váláshoz. Legyen szó gyorsítótárazásról, valós idejű kommunikációról, adatsorok kezeléséről vagy komplex adatszerkezetek tárolásáról, a Redis a megfelelő parancsokkal a kezedben képes lesz felgyorsítani és leegyszerűsíteni a fejlesztési folyamatokat.
Ne félj kísérletezni! Indíts el egy helyi Redis szervert, és próbáld ki a parancsokat a redis-cli segítségével. Ez a legjobb módja annak, hogy mélyebben megértsd a működését és felfedezd a benne rejlő potenciált. A Redis-zel a kezedben olyan alkalmazásokat építhetsz, amelyek nem csak funkcionálisak, hanem villámgyorsak és rendkívül hatékonyak is.
Leave a Reply