A Redisről, illetve röviden a NoSQL buzzról, és a key-value adatbázisokról is szó esett a prezentációmban, melynek írásos változata itt olvasható: http://webakademia.hu/2009/10/redis-a-memcached-gyilkos/
Miről lesz szó?
NoSQL törekvés
Mi az a key-value adatbázis?
Redis - a memória alapú adatbázis
NoSQL
A “NoSQL” 2009-es buzzword
A “cloud” témakör hozta meg az
igényt: a relációs adatbázisok
segítségével nehézkesen elérhető a
kívánt horizontális skálázhatóság
Leginkább key-value adattárolás, az
SQL komplexitása felesleges lehet
NoSQL
Népszerű, ismert, és kevésbé ismert projektek:
Google BigTable, Amazon Dynamo
Cassandra, Chordless, CouchDB, HBase, Hypertable,
Keyspace, MongoDB, Neo4j, Memcache, Riak, Redis,
Project Voldemort, Sherpa, SimpleDB, GigaSpaces
A legnagyobbak már évek óta használják ezeket -
az irány kipróbált és tesztelt
Key-value adattárolás
adatbázis[“kulcs”] = “érték”;
az egyik legegyszerűbb adatmode), a
programozási nyelvekben hash,
asszociatív tömb, szótár néven fut
nagyon régi a történet, de
reneszánszát éli
a tudatosabb, céleszközökkel dolgozó,
nagy látogatottságot kiszolgáló
oldalak igényeként merül fel
Redis
Alapvetően egy kulcs-érték alapú, az adatokat
memóriában tároló adatbázisszerver
http://code.google.com/p/redis/
Leginkább a Memcachedhez lehet hasonlítani,
de szignifikáns különbségek vannak
Tulajdonságok
Hipergyors fejlesztés: pár hónap alatt 1.0-s kiadás
Nagyon jó dokumentáció
Ke)emes közösség (levlista)
Jó nyelvi támogatottság (PHP, Ruby, Python, Java...)
Tulajdonságok
nagyon gyors kiszolgálás:
másodpercenként 100.000 írás, 80.000 olvasás
(hivatalosan, de ennek többszöröse is lehet)
atomi, összetett műveletek: listák, halmazok támogatása
perzisztens tárolás: adatbázis kiírása lemezre jól
hangolhatóan
Egyszerűség
nem igényel különösebb konfigurációt, gyorsan
kipróbálható, átlátható, telnettel lehet hozzá csatlakozni
nincsenek bonyolult parancsok, nagyon könnyen és
gyorsan tanulható
Alapműveletek
SET kulcs érték, SETNX kulcs érték
GET kulcs, MGET kulcs1 kulcs2 kulcs3
EXISTS kulcs
INCR kulcs, DECR kulcs
INCRBY kulcs szám, DECRBY kulcs szám
DEL kulcs
Listaműveletek
RPUSH kulcs érték, LPUSH kulcs érték
elem beszúrása a “kulcs” lista elejére, végére
LLEN kulcs
LRANGE kulcs kezdet vég
lista egy részének lekérdezése
LTRIM kulcs kezdet vég
Listaműveletek
LINDEX kulcs index
a “kulcs” lista egy elemének lekérdezése
LSET kulcs index érték
adott indexű elem felülírása
LREM kulcs darab érték
adott értékű elemek eltávolítása a listából
LPOP kulcs, RPOP kulcs
Halmazműveletek
SADD kulcs érték, SREM kulcs érték, SPOP kulcs
SMEMBERS kulcs
SMOVE kulcs1 kulcs2 érték
SCARD kulcs
elemek száma az adott halmazban
SISMEBER kulcs érték
Rendezés
listával és halmazzal is működik
SORT kulcs
SORT kulcs DESC
SORT kulcs LIMIT 0 10 ALPHA DESC
SORT kulcs BY weight_*
SORT kulcs BY weight_* GET object_*
veszi kulcs lista elemeit (pl. azonosítók: 1,2,3), lekéri weight_1,
weight_2, weight_3 értékeket és rendezi azokat, majd az így kapott
sorrend alapján visszaadja object_3, object_2, object_1 elemeket
Redis 1.1: hamarosan
Egész számok bináris tárolása
EXPIREAT kulcs unixtime
MSET kulcs1 érték1 kulcs2 érték2 kulcs3 érték3...
MSETNX kulcs1 érték1 kulcs2 érték2 kulcs3 érték3...
LMOVE kulcs1 kulcs2
Redis 1.1: hamarosan
ZADD kulcs súly érték
ZREM kulcs érték
ZCARD kulcs
ZRANGE kulcs kezdet vég
ZREVRANGE kulcs kezdet vég
ZRANGEBYSCORE kulcs súlykezdet súlyvég
ZSCORE kulcs érték
Mentés
konfig fájlban hangolható:
x másodpercenként
x írás művelet után
pl beá)ítható: alapból percenként, de ha volt 1000
művelet, akkor azután is
SAVE, BGSAVE, LASTSAVE műveletek
Replikáció
Több adatbázist képes összeszinkronizálni:
MASTER-SLAVE mode)
Egy slave masterként is tud viselkedni, láncok, gráfok
építhetőek fel
Az egyik lehetőség több processzoros környezet hatékony
kihasználására
Backup
a teljes adatbázis perzisztens része egy darab fájl
bináris memórialenyomat, másra nem használható
leá)ás nélkül backpuolható, mivel az adatbázis mentése
atomi művelet (rename művelet)
Egyebek
egyszerű, saját szöveges protoko)
példakódként egy egyszerű Twitter klón forrása is
elérhető, kipróbálható
több adatbázist (névteret) is támogat, bár nem igazán
kényelmesen, érdemes inkább külön szervereket indítani
Redis 1.2: a jövőben
Egyszerű Redis Cluster
Hozzáfűzés alapú log
Hash adattípus
Adatbázis JSON dumpja
Redis 1.x: távoli jövő
Különféle optimalizációk
SORT algoritmusának javítása
LOCK, TRYLOCK és UNLOCK
BITMAP / BYTEARRAY típus
Out of memory
Ha az adatbázis nem fér be a memóriába, akkor:
ne használjunk Redist...
félig cache szerűen használjuk
Twitter klón
Felhasználók üzenőfalja, az egyes felhasználók azok
üzeneteit láthatják, akiket követnek
A key-value adatbázis egészen más gondolkodásmódot
igényel, mint a hagyományos relációs mode)
Ki ismeri a normál formákat?
Twitter klón
Felhasználó létrehozása:
INCR global:nextUserId (visszakapunk egy számot)
SET uid:1000:username felhasználónév
SET uid:1000:password jelszó
Twitter klón
De hogyan tudom meg, hogy egy adott felhasználónévhez
milyen felhasználó azonosító tartozik?
SET username:felhasználónév:uid 1000
Twitter klón
A követők adminisztrációjához felhasználónként két halmaz:
uid:1000:fo)owers
uid:1000:fo)owing
1000-es felhasználó követi 1001-et:
SADD uid:1001:fo)owers 1000
SADD uid:1000:fo)owing 1001
Twitter klón
1000-es felhasználó üzenetet ír:
INCR global:nextPostId
SET global:posts:123456789 szöveg
LPUSH uid:1000:posts 123456789
LTRIM uid:1000:posts 0 1000