Remote Dictionary Server
REDIS
Què és REDIS ?
NoSQL en memòria
cache → primària
ANSI C
2009 Antirez
v2.8
craiglist, digg, stackoverflow, flickr, blizzard...
Alternatives
Beneficis
Velocitat !
" data served from memory, disk used for storage "
Altres beneficis
Tipus de dades
Operacions atòmiques
Comunitat creixent
Suport per a molts llenguatges
Tipus de dades
Strings
SET & GET
redis> SET mykey "Hello"
OK
redis> GET mykey
"Hello"
Altres comandes: EXISTS, APPEND, STRLEN
SET & GET
redis> SET mykey "Hello" OK redis> GET mykey
"Hello"
Altres comandes: EXISTS, APPEND, STRLEN
Hashes
HSET & HGET
redis> HSET myhash field1 "foo"
(integer) 1
redis> HGET myhash field1
"foo"
HVALS
redis> HSET myhash field1 "Hola"
(integer) 1
redis> HSET myhash field2 "Món"
(integer) 1
redis> HVALS myhash
1) "Hola"
2) "Món"
Altres comandes: HKEYS, HLEN, HEXISTS, HDEL
HSET & HGET
redis> HSET myhash field1 "foo"
(integer) 1
redis> HGET myhash field1
"foo"
HVALS
redis> HSET myhash field1 "Hola"
(integer) 1
redis> HSET myhash field2 "Món"
(integer) 1
redis> HVALS myhash
1) "Hola"
2) "Món"
Altres comandes: HKEYS, HLEN, HEXISTS, HDEL
Lists
LPUSH & LRANGE & LPOP
redis> LPUSH mylist "world" //mylist = ["world"]
(integer) 1
redis> LPUSH mylist "hello" //mylist =["hello","world"]
(integer) 2
redis> LRANGE mylist 0 -1
1) "hello"
2) "world"
redis> LPOP mylist "hello"
redis> LRANGE mylist 0 -1
1) "world"
Altres comandes: RPUSH,
RPOP, LLEN, LINSERT
LPUSH & LRANGE & LPOP
redis> LPUSH mylist "world" //mylist = ["world"]
(integer) 1
redis> LPUSH mylist "hello" //mylist =["hello","world"]
(integer) 2
redis> LRANGE mylist 0 -1
1) "hello"
2) "world"
redis> LPOP mylist "hello"
redis> LRANGE mylist 0 -1
1) "world"
Altres comandes: RPUSH,
RPOP, LLEN, LINSERT
Sets
SADD & SPOP & SMEMBERS
SDIFF
key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
redis> SDIFF key1 key2 key3 //{a,b,c,d} - "c" = {a,b,d} - "a" = {b,d}
1) "b"
2) "d"
Altres comandes: SUNION, SINTER, SCARD, SMOVE
SADD & SPOP & SMEMBERS
SDIFF
key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
redis> SDIFF key1 key2 key3 //{a,b,c,d} - "c" = {a,b,d} - "a" = {b,d}
1) "b"
2) "d"
Altres comandes: SUNION, SINTER, SCARD, SMOVE
Sorted Sets
Member Score
ZADD & ZRANGE
redis> ZADD myzset 1 "blau"
(integer) 1
redis> ZADD myzset 1 "vermell"
(integer) 1
redis> ZADD myzset 2 "groc"
(integer) 1
redis> ZADD myzset 3 "groc"
(integer) 0
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "blau"
2) "1"
3) "vermell"
4) "1"
5) "groc"
6) "3"
Altres comandes: ZINCRBY, ZRANGEBYSCORE
Administració
Instal·lació i configuració
Instal·lació
Configuració: redis.conf
Memòria
Snapshotting
Replicació
Seguretat
Eines
Redis Commander
Redsmin
Comandes de Servidor
CONFIG GET * | SAVE/BGSAVE | PING |
SHUTDOWN | INFO | SELECT |
CLIENT LIST | CLIENT KILL | FLUSHDB |
SLAVEOF | MONITOR | KEYS in* |
Replicació
Slaves = Master
escalar lectura
redundància de dades
síncrona desde v2.8
Persistència
RDB | AOF
RDB snapshots
- dump.rdb
-
configurables ex: save 60 1000
- disaster recoveries
Recomanacions
- RDB o RDB+AOF
- cron horari i diari + transfer diari
Seguretat
Redis is designed to be accessed by trusted clients inside trusted environments ..
L'aplicació s'encarrega de la seguretat
+
Seguretat de la pròpia xarxa: Firewall
Altres ...
Pipelining de comandes
Mass-Insertion
Sharding
Scripting amb LUA
Propera versió : 3.0.0 amb clustering
Un cas pràctic ...
l'API Externa
Si fos una BD relacional ...
Modelat
Pla | HashMap |
Client | HashMap |
Aplicació | HashMap |
Aplicacions d'un client | List |
Dominis d'una aplicació | List |
Subscripcions d'aplicacions a plans | HashMap |
Consums de les aplicacions | Sorted Set |
L'API fa Servir JEDIS
Inserció de dades
Pla
r.hmset('pla:1', {'nom':'Lliure xema', 'api':'xema','quota':'1000'}) r.hmset('pla:2', {'nom':'Basic xema', 'api':'xema','quota':'30000'})
Client
r.hmset('client:00000001', {'nom':'empresa 1', 'email':'contacte@empresa1.com'})
Aplicació
r.hmset('aplicacio:11111111', {'nom':'Nom aplicació 1','sak':'101010101010', 'client':'00000001', 'alta':'1377986400000', 'baixa':'1914444000000'})
Aplicacions d'un client
r.rpush('client:00000001:aplicacions','11111111','22222222')
Inserció de dades
Dominis d'una aplicació
r.rpush('aplicacio:11111111:dominis','pc-epa.meteocat.com','localhost','pc-asp.meteocat.com')
Subscripcions a plans d'una aplicació
r.hmset('aplicacio:11111111:subscripcions:1', {'codipla':'4', 'alta':'1377986400000', 'baixa':'1914444000000'})
r.hmset('aplicacio:11111111:subscripcions:2', {'codipla':'8', 'alta':'1377986400000', 'baixa':'1914444000000'})
I els Consums?
amb Conjunts Ordenats
Conjunts Ordenats a l'API
Score/Value
Value
= Timestamp identificatiu de mes
Inicialització
zadd aplicacio:11111111:consums:pla:3 0 1377986400000 //01-09-13 0:0h
Increment del Score
ZINCRBY aplicacio:11111111:consums:pla:3 1 1377986400000
Passat un temps...
conjunt = {1050 1377986400000, 1823 1380578400000, ...}
Gràcies!
REDIS
By Emilio Ponce
REDIS
Introducció a REDIS
- 758