Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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,756 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
  • Be the first to comment

  • Be the first to like this

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   

×