Redis na prática    O ruim, o bom e o sensacional                   
Benchmark    3 processos / 20 mil inserções / 60 mil selects ordenados / 60 mil counts    > time ./manage.py benchmark --d...
Benchmark    Nunca confie no Benchmark dos outros!                      
ExemplosTornar-se fãCrawler de vídeoResponder QuizRanking do Quiz                    
Exemplos 1: Tornar-se FãMuitas consolidações a cada novo fãRapidez para não bloquear processos                   
Consolidações                     tasks                   NewFanTask    TaskManager    NewFanTask       gunicorn          ...
Fila para consolidações    redis> rpush tasks oi    redis> rpush tasks tudo    redis> rpush tasks bem    redis> lpop tasks...
Cuidado: Fila virando Pilha    redis> rpush tasks oi    redis> rpush tasks tudo    redis> rpush tasks bem    redis> rpop t...
Abstraindo a fila    class RedisQueue(object):      def __init__(self,key,client=client):        self.key = key        sel...
Porque não?    Resque / Pyres    Redis Pub/Sub                      
Exemplo 2: Crawler de vídeo    Dois milhões de músicas    Restrição da API do Youtube    Busca de vídeos no browser    Pro...
SortedSetredis> zincrby crawler-video 1 video1redis> zincrby crawler-video 1 video1redis> zincrby crawler-video 1 video2re...
Abstraindo SortedSetclass RedisSortedSet(object):    def __init__(self,key,client=client):      self.key = key      self.c...
Exemplo 3: Responder Quiz    Gravar se acertou ou não    Impedir responder mesma pergunta                      
Utilizando Setsdef responder(self, quiz, resposta):  respondidas = RedisSet(”quiz-respondidos-%s” % self.id, client=redis)...
Hashredis> hset estados-capitais amazonas manausredis> hset estados-capitais bahia salvadorredis> hgetall estados-capitais...
Utilizando Hashdef responder(self, quiz, resposta):  respondidos = RedisHash(”quiz-respondidos-%s” % self.id, client=redis...
Exemplo 4: Ranking do Quiz    Sugestões?                  
Exemplo 4: Ranking do Quiz    Sugestões?    SortedSet?                  
Exemplo 4: Ranking do Quiz    Ranking dos amigos?    1 ranking por usuário    Atualizar rankings a cada resposta?         ...
Fila e SortedSetAo responder um quiz:redis> rpush tasks rankings-quiz-usuario-xCron:redis> lpop tasks"rankings-quiz-usuari...
Muito complexo?    Porque não MySql?                     
Cansei de exemplos    Vamos falar de OCLs                      
OCLs: Multi / Execredis> multiredis> zadd ranking-usuario-x 2 usuario-xredis> zadd ranking-usuario-a 2 usuario-xredis> zad...
OCLs: Multi / Execredis> multiredis> hsetnx respostas-usuario-id quiz-1 1redis> rpush tasks rankings-quiz-usuario-xredis> ...
OCLs: Master / Slave> sudo vim /etc/redis/redis-slave.confport 6380slaveof 127.0.0.1 6739> sudo redis-server /etc/redis/re...
OCLs: Master / Slave    > redis-cli    redis 127.0.0.1:6379> set x b    > redis-cli -h 127.0.0.1 -p 6380    redis 127.0.0....
OCLs: Script em lua    Redis 2.6:    redis> eval "return {ARGV[1]}" valor    Ainda não usei, por isso não vou falar nada. ...
Conclusão    Performático    Escalável    Divertido    No entando...    + Complexo que Sql e Mongo                      
Mais informaçõeshttp://redis.io/commandshttp://rediscookbook.org                     
Mantenha contatotimotta@gmail.com@timottahttp://programandosemcafeina.blogspot.com                      
Upcoming SlideShare
Loading in …5
×

Redis na Prática

1,558 views

Published on

Slides da palestra sobre Redis apresentada no Dev in Santos. Modifiquei apenas o "classe A" para "sensacional" e corrigi o código do slide "Utilizando sets".

Palestra também apresentada no NoSqlBahia e no TDC 2012

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,558
On SlideShare
0
From Embeds
0
Number of Embeds
139
Actions
Shares
0
Downloads
20
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Redis na Prática

  1. 1. Redis na prática O ruim, o bom e o sensacional   
  2. 2. Benchmark 3 processos / 20 mil inserções / 60 mil selects ordenados / 60 mil counts > time ./manage.py benchmark --db=redis real 2m32.417s user 2m27.341s sys 0m3.112s > time ./manage.py benchmark --db=mysql real 16m25.251s user 0m46.115s sys 0m4.628s > time ./manage.py benchmark --db=mongodb ^C KeyboardInterrupt real 38m28.659s user 0m59.056s sys 0m2.628s   
  3. 3. Benchmark Nunca confie no Benchmark dos outros!   
  4. 4. ExemplosTornar-se fãCrawler de vídeoResponder QuizRanking do Quiz   
  5. 5. Exemplos 1: Tornar-se FãMuitas consolidações a cada novo fãRapidez para não bloquear processos   
  6. 6. Consolidações tasks NewFanTask TaskManager NewFanTask gunicorn NewFanTask ArtistTaskGroup   
  7. 7. Fila para consolidações redis> rpush tasks oi redis> rpush tasks tudo redis> rpush tasks bem redis> lpop tasks "oi" redis> lpop tasks "tudo" redis> lpop tasks "bem" redis> lpop tasks (nil)   
  8. 8. Cuidado: Fila virando Pilha redis> rpush tasks oi redis> rpush tasks tudo redis> rpush tasks bem redis> rpop tasks "bem" redis> rpop tasks "tudo" redis> rpop tasks "oi" redis> rpop tasks (nil)   
  9. 9. Abstraindo a fila class RedisQueue(object): def __init__(self,key,client=client): self.key = key self.client = client def push(self,obj): value = ujson.encode(obj) self.client.rpush(self.key, value) def pop(self): value = self.client.lpop(self.key) return self.from_json(value)   
  10. 10. Porque não? Resque / Pyres Redis Pub/Sub   
  11. 11. Exemplo 2: Crawler de vídeo Dois milhões de músicas Restrição da API do Youtube Busca de vídeos no browser Processamento no server Prioridade pros mais acessados   
  12. 12. SortedSetredis> zincrby crawler-video 1 video1redis> zincrby crawler-video 1 video1redis> zincrby crawler-video 1 video2redis> zincrby crawler-video 8 video3redis> zrevrange crawler-video 0 -11) "video3" 2) "video1" 3) "video2"redis> zrevrank crawler-video video3(integer) 0   
  13. 13. Abstraindo SortedSetclass RedisSortedSet(object): def __init__(self,key,client=client): self.key = key self.client = client def incr(self,value,amount=1): return self.client.zincrby(self.key, value, amount) def bests(self,max=0): return self.client.zrevrange(self.key, 0, max-1)   
  14. 14. Exemplo 3: Responder Quiz Gravar se acertou ou não Impedir responder mesma pergunta   
  15. 15. Utilizando Setsdef responder(self, quiz, resposta): respondidas = RedisSet(”quiz-respondidos-%s” % self.id, client=redis) if respondidas.add(quiz.id): if quiz.opcao_correta(resposta): acertadas = RedisSet(”quiz-acertadas-%s” % self.id, client=redis) acertadas.add(quiz.id)redis> sadd quiz-respondidos-x 1(integer) 1redis> sadd quiz-acertadas-x 1(integer) 1redis> sadd quiz-respondidos-x 1(integer) 0   
  16. 16. Hashredis> hset estados-capitais amazonas manausredis> hset estados-capitais bahia salvadorredis> hgetall estados-capitais1) "amazonas" 2) "manaus" 3) "bahia" 4) "salvador"redis> hset estados-capitais amazonas belemredis> hgetall estados-capitais1) "amazonas" 2) "belem" 3) "bahia" 4) "salvador"redis> hsetnx estados-capitais bahia reciferedis> hgetall estados-capitais1) "amazonas" 2) "belem" 3) "bahia" 4) "salvador"   
  17. 17. Utilizando Hashdef responder(self, quiz, resposta): respondidos = RedisHash(”quiz-respondidos-%s” % self.id, client=redis) acertou = 1 if quiz.opcao_correta(resposta) else 0 respondidos.set_if_new(quiz.id, acertou)redis> hsetnx quiz-respondidos-x 20 0(integer) 1redis> hsetnx quiz-respondidos-x 20 1(integer) 0   
  18. 18. Exemplo 4: Ranking do Quiz Sugestões?   
  19. 19. Exemplo 4: Ranking do Quiz Sugestões? SortedSet?   
  20. 20. Exemplo 4: Ranking do Quiz Ranking dos amigos? 1 ranking por usuário Atualizar rankings a cada resposta?   
  21. 21. Fila e SortedSetAo responder um quiz:redis> rpush tasks rankings-quiz-usuario-xCron:redis> lpop tasks"rankings-quiz-usuario-x"redis> smembers amigos-usuario-x1) "a" 2) "b" 3) "c"redis> hval respostas-usuario-x1) "1" 2) "1" 3) "0"redis> zadd ranking-usuario-x 2 usuario-xredis> zadd ranking-usuario-a 2 usuario-xredis> zadd ranking-usuario-b 2 usuario-xredis> zadd ranking-usuario-c 2 usuario-x   
  22. 22. Muito complexo? Porque não MySql?   
  23. 23. Cansei de exemplos Vamos falar de OCLs   
  24. 24. OCLs: Multi / Execredis> multiredis> zadd ranking-usuario-x 2 usuario-xredis> zadd ranking-usuario-a 2 usuario-xredis> zadd ranking-usuario-b 2 usuario-xredis> zadd ranking-usuario-c 2 usuario-xredis> execredis = Redis(**confs).pipeline()for id in [id, ”a”,”b”,”c”]: sorted_set = RedisSortedSet(”ranking-usuario-%s” % id, client=redis) sorted_set.add(”usuario-x”,amount=2)redis.execute()   
  25. 25. OCLs: Multi / Execredis> multiredis> hsetnx respostas-usuario-id quiz-1 1redis> rpush tasks rankings-quiz-usuario-xredis> execacertou = 1 if pergunta.certa == resposta else 0redis = Redis(**confs).pipeline()hash = RedisHash(”respostas-usuario-%s” % usuario.id, client=redis)hash.set_if_new(”quiz-” % pergunta.id, acertou):if acertou: queue = RedisQueue(”tasks”, client=redis) queue.push(”ranking-quiz-usuario-%s” % usuario.id)redis.execute()   
  26. 26. OCLs: Master / Slave> sudo vim /etc/redis/redis-slave.confport 6380slaveof 127.0.0.1 6739> sudo redis-server /etc/redis/redis-slave.conf> redis-cliredis> monitorOK1335985598.138718 "monitor"1335986003.209676 "SYNC"   
  27. 27. OCLs: Master / Slave > redis-cli redis 127.0.0.1:6379> set x b > redis-cli -h 127.0.0.1 -p 6380 redis 127.0.0.1:6380> monitor OK 1335986423.169745 "monitor" 1335986441.430632 "PING" 1335986441.430632 "PING" 1335986462.113501 "set" "x" "b" 1335986471.500976 "PING"   
  28. 28. OCLs: Script em lua Redis 2.6: redis> eval "return {ARGV[1]}" valor Ainda não usei, por isso não vou falar nada.   
  29. 29. Conclusão Performático Escalável Divertido No entando... + Complexo que Sql e Mongo   
  30. 30. Mais informaçõeshttp://redis.io/commandshttp://rediscookbook.org   
  31. 31. Mantenha contatotimotta@gmail.com@timottahttp://programandosemcafeina.blogspot.com   

×