Redis: Uma visão geral

      Junior Ribeiro




        V Pylestras
whoami
                          Desenvolvedor/Líder Técnico em
                          projetos voltados para Gestão de
                          Conteúdo e Portais

Bacharel em Sistemas de Informação – FIC

Twitter: fjunior87
Linkedin: br.linkedin.com/in/fribeiro
Blog: http://xicojunior.wordpress.com
Email: fjunior87@gmail.com
Redis
•   Criado por Salvatore Sanfilippo(@antirez)
•   Primeira Release em março de 2009
•   Patrocinado pela VM Ware
•   Atualmente na versão 2.4.17
Redis
• REmote DIctionary Server
• Key-Value Store - Dicionário(hash) Remoto
• Suporta outras estruturas de dados
  – List, set, hash, ordered set
• DataStructure Server
• Publish/Subscribe
• Expires
Redis
  • Em memória... Muito, muito rápido!!!!
         – Mas persiste os dados em disco – Snapshoting
         – Requer bastante RAM dependendo da quantidade
           de dados
  • Non-Blocking I/O
  • Single-Threaded
  • 100.000+ operações de leitura e
    escrita/segundo[1]
[1]http://simonwillison.net/static/2010/redis-tutorial/
Redis
Redis
• Por onde iniciar?
  – http://try.redis-db.com/
• Instalação
  – Download e unzip
  – Iniciar o server: ./redis-server ou redis-
    server.exe(WIN)
  – Iniciar o client: ./redis-cli ou redis-cli.exe(Win)
• Muito simples!!!
Chaves e Valores
• Chaves são utilizadas para identificar dados no
  Redis(String)
  – Ex: server:name, user:1
• Valores estão associados com as chaves
  – String, Integer, Estrutura de Dado
  – JSON, XML, whatever...
  – Strings são byte arrays
Chaves e Valores
• Associando valores a chaves


set server:name myhostname

set user:1
  „{“nome”:”junior”,”username”:”fjunior87”}‟
Chaves e Valores
• Obtendo o valor de uma chave

get server:name

get user:1
Comandos
•   GET               •   TYPE
•   SET               •   EXISTS
•   SETNX             •   DEL
•   GETSET            •   EXPIRE
•   MGET
                      •   EXPIREAT
•   MSET
                      •   TTL
•   INCR/INCRBY
•   DECR/DECRBY
Comandos
setnx foo bar //OK!
setnx foo bar2 //NoK!


//setar varias chaves
mset   dia 06 mes 10 ano 2012


//obter varias chaves
mget dia mes ano
Comandos
//setar novo valor e obter o antigo
set var valor
getset var novovalor //retorna
  „valor‟


//Contador
incr user:ids
decr user:1:convites
Comandos
//checando o tipo da chave
type ano


//deletando uma chave
del   ano


//checando existencia de um chave
exists   blah
Caching
• Redis como um Cache store
  – EXPIRE, EXPIREAT, TTL

SET last_page <html></html>
EXPIRE last_page 60
TTL last_page
Caching
• SETEX

 setex   last_page 60 <html></html>
 ttl last_page
Listas

•   LPUSH/RPUSH
•   LLEN
•   LPOP/RPOP
•   LRANGE
•   LINDEX
•   LTRIM
Listas
//adicionando elementos ao inicio
lpush linguagem python

//adicionando ao final
rpush linguagem java
rpush linguagem ruby

//obtendo todos os elementos
lrange linguagem 0 -1
Lista
//removendo do inicio
lpop linguagem


//removendo do fim
rpop linguagem


//trim
ltrim linguagem 0 1
Lista
//Uma fila simples - FIFO
lpush fila primeiro
lpush fila segundo
lpush fila terceiro

rpop fila //primeiro
rpop fila //segundo
Set
• Conjunto de Strings
• Não ordenados
• Sem duplicatas
Set
•   sadd
•   smembers
•   Scard
•   Spop
•   srandmember
•   sismember
•   srem
Set
//adicionando amigos
sadd friends:junior fabio
sadd friends:junior manolo   doe

spop friends:junior
srandmember friends:junior

//checando se amigo
sismemeber friends:junior fabio
Set
//removendo amigo
srem friends:junior manolo

//checando qtde de amigos
Scard friends:manolo
SET
• SUNION/SUNIONSTORE
• SDIFF/SDIFFSTORE
• SINTER/SINTERSTORE

• Podem ser aplicadas mais de 2 chaves nas
  operações
Set
//Amigos em comum
sinter friends:junior      friends:manolo


//armazenar o resultado em outra chave
sinterstore chave_destino friends:junior
  friends:manolo
Set
//amigos do manolo que não são amigos do jr
SDIFF friends:manolo       friends:junior


//todos os amigos do manolo e junior
SUNION friends:manolo       friends:junior
Sorted Set
•   zset
•   Similar ao SET
•   Cada elemento possui um score
•   Podemos consultar pelo score ou intervalo de
    scores em qualquer direção (bottom/top)
Sorted Set
•   ZADD
•   ZREM
•   ZCARD
•   ZSCORE
•   ZINCRBY
•   ZRANK
•   ZREVRANK
Sorted Set
zadd   urna:1   0   tiririca
zadd   urna:1   0   maluf


//numero de votos do candidato
zscore urna:1 maluf


//votando num candidato
zincrby   urna:1    1 tiririca
Sorted Set

• ZRANGE
• ZREVRANGE
• ZRANGEBYSCORE

• [WITHSCORES]
Sorted Set
//obter os 3 menos votados
ZRANGE urna:1     0   2


//obter os 3 menos votados com score
ZRANGE urna:1     0   2 WITHSCORES


//obter os 3 mais votados
ZREVRANGE urna:1      0 2 WITHSCORES
Sorted Set
//candidatos com numero de votos entre 20 e
  50
zrangebyscore   urna:1   20 50
zrangebyscore   urna:1   20 50   WITHSCORES
Sorted Sets
• zunionstore
• zinterstore

• Aggregate sum|max|min
Sorted Set
//total de votos dos candidatos
zunionstore   urnatotal 2 urna:1 urna:2
zrevrange urnatotal 0 -1 withscores
Hash
• Como o nome já diz
• Fields
• Ideal para armazenar objetos
  – Mais flexibilidade do que objetos serializados
  – Podendo obter/atualizar valores de campos
    específicos
Hash
•   HSET/HGET
•   HMSET
•   HKEYS
•   HGETALL
•   HINCRBY
•   HDEL
Hash
//Armazenando um usuario
hset user:1      nome junior
hset user:1      username fjunior87


//setando varios fields
hmset   user:1   password 1234   idade   25
Hashes
//obtendo o nome
hget user:1       nome


//obtendo mais de um campo
hmget user:1       idade password


//obtendo todos
hgetall   user:1
Pipeline
• A cada comando o cliente aguarda a resposta
    sadd users junior
    sadd users manolo
    smembers users
• Acima temos 3 trips
• RTT – Round Trip Time
• Redis suporta pipelining
• Vários comandos enviados sem esperar por suas
  respostas – batch de comandos
• Minimiza overhead de rede
Pipeline
• Exemplo usando a biblioteca redis-py

r=redis.Redis()
pipe=r.pipe ()
for i in range(10000):
  pipe.ping()
pipe.execute()
Transaction
• Permitem a execução de um grupo de
  comandos de forma atômica
• 2 garantias
  – Comandos executados sequencialmente sem
    interferência
  – Tudo ou nada – Ou todos são executados ou
    nenhum
Transaction
• MULTI
• EXEC
Transaction
r = redis.Redis()
pipe = r.pipeline(transaction=True)
next_id = pipe.incr("user:ids")
pipe.hset("user:%s"%next_id,"nome","junior")
pipe.execute()
Publish/Subscribe
• Redis suporta publish/subscribe
publish
subscribe
psubscribe
unsubscribe
punsubscribe
Publish/Subscribe
//em uma janela redis-cli
subscribe     warnings


//em outra janela
publish warnings       “o sistema miou!”
Publish/Subscribe
//subscribe com padrão
psubscribe warnings:*


//subscribe multiplos channels
subscribe    channel1 channel2 ...
Casos de Uso
• Contador
  – Quando bloquear um IP
  – Page Views

  – Podemos utilizar o comando INCR
  incr   acess:127.0.0.1:06-10-2012

  url = md5(url)
  incr views:url:06-10-2012
  Incr views:06-10-2012
Casos de Uso
• Sessões Web
  – Redis para armazenar os dados de sessão

  hset session:as242dsd user fjunior87
    displayname junior
  Expire session:as242dsd 1800


  – django-redis-sessions
Casos de Uso
• Caching
  – Podendo ser usado da mesma forma que o
    memcache

  – django-redis-cache
Casos de Uso
• Message Queue
  – LPUSH – RPOP
  – BRPOP – BLPOP

  – Resque - ruby
  – RestMQ – Pytho n(Twisted, Cyclone)
Referências
• http://simonwillison.net/static/2010/redis-
  tutorial/
• http://highscalability.com/blog/2011/7/6/11-
  common-web-use-cases-solved-in-redis.html
• http://www.paperplanes.de/2010/2/16/a_coll
  ection_of_redis_use_cases.html
• http://rediscookbook.org/
???
???
Obrigado!!

Redis

  • 1.
    Redis: Uma visãogeral Junior Ribeiro V Pylestras
  • 2.
    whoami Desenvolvedor/Líder Técnico em projetos voltados para Gestão de Conteúdo e Portais Bacharel em Sistemas de Informação – FIC Twitter: fjunior87 Linkedin: br.linkedin.com/in/fribeiro Blog: http://xicojunior.wordpress.com Email: fjunior87@gmail.com
  • 3.
    Redis • Criado por Salvatore Sanfilippo(@antirez) • Primeira Release em março de 2009 • Patrocinado pela VM Ware • Atualmente na versão 2.4.17
  • 4.
    Redis • REmote DIctionaryServer • Key-Value Store - Dicionário(hash) Remoto • Suporta outras estruturas de dados – List, set, hash, ordered set • DataStructure Server • Publish/Subscribe • Expires
  • 5.
    Redis •Em memória... Muito, muito rápido!!!! – Mas persiste os dados em disco – Snapshoting – Requer bastante RAM dependendo da quantidade de dados • Non-Blocking I/O • Single-Threaded • 100.000+ operações de leitura e escrita/segundo[1] [1]http://simonwillison.net/static/2010/redis-tutorial/
  • 6.
  • 7.
    Redis • Por ondeiniciar? – http://try.redis-db.com/ • Instalação – Download e unzip – Iniciar o server: ./redis-server ou redis- server.exe(WIN) – Iniciar o client: ./redis-cli ou redis-cli.exe(Win) • Muito simples!!!
  • 8.
    Chaves e Valores •Chaves são utilizadas para identificar dados no Redis(String) – Ex: server:name, user:1 • Valores estão associados com as chaves – String, Integer, Estrutura de Dado – JSON, XML, whatever... – Strings são byte arrays
  • 9.
    Chaves e Valores •Associando valores a chaves set server:name myhostname set user:1 „{“nome”:”junior”,”username”:”fjunior87”}‟
  • 10.
    Chaves e Valores •Obtendo o valor de uma chave get server:name get user:1
  • 11.
    Comandos • GET • TYPE • SET • EXISTS • SETNX • DEL • GETSET • EXPIRE • MGET • EXPIREAT • MSET • TTL • INCR/INCRBY • DECR/DECRBY
  • 12.
    Comandos setnx foo bar//OK! setnx foo bar2 //NoK! //setar varias chaves mset dia 06 mes 10 ano 2012 //obter varias chaves mget dia mes ano
  • 13.
    Comandos //setar novo valore obter o antigo set var valor getset var novovalor //retorna „valor‟ //Contador incr user:ids decr user:1:convites
  • 14.
    Comandos //checando o tipoda chave type ano //deletando uma chave del ano //checando existencia de um chave exists blah
  • 15.
    Caching • Redis comoum Cache store – EXPIRE, EXPIREAT, TTL SET last_page <html></html> EXPIRE last_page 60 TTL last_page
  • 16.
    Caching • SETEX setex last_page 60 <html></html> ttl last_page
  • 17.
    Listas • LPUSH/RPUSH • LLEN • LPOP/RPOP • LRANGE • LINDEX • LTRIM
  • 18.
    Listas //adicionando elementos aoinicio lpush linguagem python //adicionando ao final rpush linguagem java rpush linguagem ruby //obtendo todos os elementos lrange linguagem 0 -1
  • 19.
    Lista //removendo do inicio lpoplinguagem //removendo do fim rpop linguagem //trim ltrim linguagem 0 1
  • 20.
    Lista //Uma fila simples- FIFO lpush fila primeiro lpush fila segundo lpush fila terceiro rpop fila //primeiro rpop fila //segundo
  • 21.
    Set • Conjunto deStrings • Não ordenados • Sem duplicatas
  • 22.
    Set • sadd • smembers • Scard • Spop • srandmember • sismember • srem
  • 23.
    Set //adicionando amigos sadd friends:juniorfabio sadd friends:junior manolo doe spop friends:junior srandmember friends:junior //checando se amigo sismemeber friends:junior fabio
  • 24.
    Set //removendo amigo srem friends:juniormanolo //checando qtde de amigos Scard friends:manolo
  • 25.
    SET • SUNION/SUNIONSTORE • SDIFF/SDIFFSTORE •SINTER/SINTERSTORE • Podem ser aplicadas mais de 2 chaves nas operações
  • 26.
    Set //Amigos em comum sinterfriends:junior friends:manolo //armazenar o resultado em outra chave sinterstore chave_destino friends:junior friends:manolo
  • 27.
    Set //amigos do manoloque não são amigos do jr SDIFF friends:manolo friends:junior //todos os amigos do manolo e junior SUNION friends:manolo friends:junior
  • 28.
    Sorted Set • zset • Similar ao SET • Cada elemento possui um score • Podemos consultar pelo score ou intervalo de scores em qualquer direção (bottom/top)
  • 29.
    Sorted Set • ZADD • ZREM • ZCARD • ZSCORE • ZINCRBY • ZRANK • ZREVRANK
  • 30.
    Sorted Set zadd urna:1 0 tiririca zadd urna:1 0 maluf //numero de votos do candidato zscore urna:1 maluf //votando num candidato zincrby urna:1 1 tiririca
  • 31.
    Sorted Set • ZRANGE •ZREVRANGE • ZRANGEBYSCORE • [WITHSCORES]
  • 32.
    Sorted Set //obter os3 menos votados ZRANGE urna:1 0 2 //obter os 3 menos votados com score ZRANGE urna:1 0 2 WITHSCORES //obter os 3 mais votados ZREVRANGE urna:1 0 2 WITHSCORES
  • 33.
    Sorted Set //candidatos comnumero de votos entre 20 e 50 zrangebyscore urna:1 20 50 zrangebyscore urna:1 20 50 WITHSCORES
  • 34.
    Sorted Sets • zunionstore •zinterstore • Aggregate sum|max|min
  • 35.
    Sorted Set //total devotos dos candidatos zunionstore urnatotal 2 urna:1 urna:2 zrevrange urnatotal 0 -1 withscores
  • 36.
    Hash • Como onome já diz • Fields • Ideal para armazenar objetos – Mais flexibilidade do que objetos serializados – Podendo obter/atualizar valores de campos específicos
  • 37.
    Hash • HSET/HGET • HMSET • HKEYS • HGETALL • HINCRBY • HDEL
  • 38.
    Hash //Armazenando um usuario hsetuser:1 nome junior hset user:1 username fjunior87 //setando varios fields hmset user:1 password 1234 idade 25
  • 39.
    Hashes //obtendo o nome hgetuser:1 nome //obtendo mais de um campo hmget user:1 idade password //obtendo todos hgetall user:1
  • 40.
    Pipeline • A cadacomando o cliente aguarda a resposta sadd users junior sadd users manolo smembers users • Acima temos 3 trips • RTT – Round Trip Time • Redis suporta pipelining • Vários comandos enviados sem esperar por suas respostas – batch de comandos • Minimiza overhead de rede
  • 41.
    Pipeline • Exemplo usandoa biblioteca redis-py r=redis.Redis() pipe=r.pipe () for i in range(10000): pipe.ping() pipe.execute()
  • 42.
    Transaction • Permitem aexecução de um grupo de comandos de forma atômica • 2 garantias – Comandos executados sequencialmente sem interferência – Tudo ou nada – Ou todos são executados ou nenhum
  • 43.
  • 44.
    Transaction r = redis.Redis() pipe= r.pipeline(transaction=True) next_id = pipe.incr("user:ids") pipe.hset("user:%s"%next_id,"nome","junior") pipe.execute()
  • 45.
    Publish/Subscribe • Redis suportapublish/subscribe publish subscribe psubscribe unsubscribe punsubscribe
  • 46.
    Publish/Subscribe //em uma janelaredis-cli subscribe warnings //em outra janela publish warnings “o sistema miou!”
  • 47.
    Publish/Subscribe //subscribe com padrão psubscribewarnings:* //subscribe multiplos channels subscribe channel1 channel2 ...
  • 48.
    Casos de Uso •Contador – Quando bloquear um IP – Page Views – Podemos utilizar o comando INCR incr acess:127.0.0.1:06-10-2012 url = md5(url) incr views:url:06-10-2012 Incr views:06-10-2012
  • 49.
    Casos de Uso •Sessões Web – Redis para armazenar os dados de sessão hset session:as242dsd user fjunior87 displayname junior Expire session:as242dsd 1800 – django-redis-sessions
  • 50.
    Casos de Uso •Caching – Podendo ser usado da mesma forma que o memcache – django-redis-cache
  • 51.
    Casos de Uso •Message Queue – LPUSH – RPOP – BRPOP – BLPOP – Resque - ruby – RestMQ – Pytho n(Twisted, Cyclone)
  • 52.
    Referências • http://simonwillison.net/static/2010/redis- tutorial/ • http://highscalability.com/blog/2011/7/6/11- common-web-use-cases-solved-in-redis.html • http://www.paperplanes.de/2010/2/16/a_coll ection_of_redis_use_cases.html • http://rediscookbook.org/
  • 53.
  • 54.