Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Redis – What, Why, When, How?

kinncj
August 28, 2012

Redis – What, Why, When, How?

Palestra apresentada no PHPUB (evento mensal de PHP do grupo PHPSP) do mês de agosto de 2012

kinncj

August 28, 2012
Tweet

More Decks by kinncj

Other Decks in Technology

Transcript

  1. About • Software Engineer: Dafiti • Developer: About 10 •

    php.net, MeeGo, phpsp, fedora project, NoSQL BR, * • Zend Certified Engineer, Husband and Daddy segunda-feira, 27 de agosto de 12
  2. Dafuck Redis? • Remote Dictionary Server • Armazenamento chave-valor •

    ... lista e executa operações What segunda-feira, 27 de agosto de 12
  3. Dafuck Redis? • Remote Dictionary Server • Armazenamento chave-valor •

    ... lista e executa operações • Um servidor de estrutura de dados What segunda-feira, 27 de agosto de 12
  4. Dafuck Redis? • Remote Dictionary Server • Armazenamento chave-valor •

    ... lista e executa operações • Um servidor de estrutura de dados • ... tem pub/sub e notificações What segunda-feira, 27 de agosto de 12
  5. Dafuck Redis? • Remote Dictionary Server • Armazenamento chave-valor •

    ... lista e executa operações • Um servidor de estrutura de dados • ... tem pub/sub e notificações • Um bus de evento sem bloqueio What segunda-feira, 27 de agosto de 12
  6. Dafuck Redis? • Remote Dictionary Server • Armazenamento chave-valor •

    ... lista e executa operações • Um servidor de estrutura de dados • ... tem pub/sub e notificações • Um bus de evento sem bloqueio • Uma memória compartilhada acessível via rede What segunda-feira, 27 de agosto de 12
  7. Seja o que for... • Mothafuckamente rápido! • Non-blocking I/O,

    um único segmento • 100,000+ escrita/leitura por segundo • Pequeno: ~16,000 linhas de código C • Escala para “baixo”: Amigável até mesmo com um simples VPS • Faz um novo tipo de recurso - em particular para escritas pesadas - viável para pequenas aplicações • Complementa sua camada de armazenamento What segunda-feira, 27 de agosto de 12
  8. Breve histórico • Criado por Salvatore Sanfilippo ( antirez )

    • Primeiro release: Março/2009 • “Adquirido” pela VMWare em Março de 2010 • Open Source ( BSD ) What segunda-feira, 27 de agosto de 12
  9. Agenda! • Como funciona • Tipos de dados • Utilidade

    • PHP • Úteis What segunda-feira, 27 de agosto de 12
  10. Inicio de tudo! $ git clone git://github.com/antirez/redis $ cd redis

    $ make $ ./redis-server What segunda-feira, 27 de agosto de 12
  11. Chaves • Chaves não devem conter espaços em branco! •

    ( essa restrição foi removida na versão 1.2) • Chaves curtas performam melhor • Convenção comum: tipo-de-objeto:id:campo • user:23:username = manolo • SHA1(data) Pode ser uma chave útil também What segunda-feira, 27 de agosto de 12
  12. Tipos de dados • Binary-safe strings ( até 10GB )

    • listas • conjuntos • Conjuntos sortidos • (Cada chave possuí uma pontuação) • hashes • Canais pub/sub What segunda-feira, 27 de agosto de 12
  13. Strings SET name Kinn SET age 23 MGET name age

    > Kinn >23 GETSET name Kinncj > Kinn What segunda-feira, 27 de agosto de 12
  14. Strings SETEX age 3 20 GET age > 20 //

    .. 3 segundos após GET age > null What segunda-feira, 27 de agosto de 12
  15. Inteiros INCR count > 1 INCR count > 2 INCRBY

    count 3 > 5 What segunda-feira, 27 de agosto de 12
  16. Hashes HMSET user name Kinn email [email protected] HGET user email

    > [email protected] HKEYS user > name > email HGETALL user > name > Kinn > email > [email protected] What segunda-feira, 27 de agosto de 12
  17. Listas RPUSH admins Kinn > 1 RPUSH admins Manolo >

    2 LINDEX admins 0 > Kinn LLEN admins > 2 RPOP admins > Manolo What segunda-feira, 27 de agosto de 12
  18. Conjuntos SADD page:3:visitors 134 > 1 SADD page:3:visitors 253 >

    1 SADD page:3:visitors 253 > 0 SCARD page:3:visitors > 2 SMEMBERS page:3:visitors > 134 > 253 SISMEMBER page:3:visitors 349 > 0 What segunda-feira, 27 de agosto de 12
  19. Conjuntos SADD page:6:visitors 253 SADD page:6:visitors 923 SADD page:6:visitors 13

    SINTER page:3:visitors page:6:visitors > 253 What segunda-feira, 27 de agosto de 12
  20. Conjuntos sortidos ZADD highscores 2930 Kinn ZADD highscores 1500 Manolo

    ZREVRANGE highscores 0 10 WITHSCORES > Kinn > 2930 > Manolo > 1500 What segunda-feira, 27 de agosto de 12
  21. SORT - SQL em seu NoSQL SORT chave SORT chave

    LIMIT 0 10 DESC SORT chave ALPHA SORT page:6:visitors BY user_*->rank GET user_* DESC Why segunda-feira, 27 de agosto de 12
  22. Pub/Sub SUBSCRIBE mensagem SUBSCRIBE chan1 chan2 chan3 PUBLISH mensagem “Ola

    Mundo” PSUBSCRIBE chat.* Why segunda-feira, 27 de agosto de 12
  23. Goodies • Replicação Master/Slave • Transações: MULTI / EXEC /

    DISCARD Why segunda-feira, 27 de agosto de 12
  24. • Redis Cluster ( Tão atrasado quanto o PHP 6

    ) Why Future Goodies : Cluster segunda-feira, 27 de agosto de 12
  25. Velocidade Redis é rápido É muito improvável que CPU seja

    gargalo Why Future Goodies : Cluster segunda-feira, 27 de agosto de 12
  26. É muito improvável que CPU seja gargalo Why Future Goodies

    : Cluster segunda-feira, 27 de agosto de 12
  27. O que você faz quando está sem RAM? Why Future

    Goodies : Cluster segunda-feira, 27 de agosto de 12
  28. Esperar pelo cluster Redis? Se você puder... o Cluster é

    parece ser ótimo Why Future Goodies : Cluster segunda-feira, 27 de agosto de 12
  29. Uso • WEB SCALE • THE CLOUD • NOSQL •

    ELASTIC • HORIZONTAL SCALING • VERTICAL TOO When segunda-feira, 27 de agosto de 12
  30. Uso • WEB SCALE • THE CLOUD • NOSQL •

    ELASTIC • HORIZONTAL SCALING • VERTICAL TOO When segunda-feira, 27 de agosto de 12
  31. Caia na real Se você precisa escalar, sua base de

    dados não vai magicamente fazer isso por você When segunda-feira, 27 de agosto de 12
  32. Uso • Armazenamento de sessões • Cache • Qualquer outra

    coisa que o memcached faça When segunda-feira, 27 de agosto de 12
  33. Uso • Cache: Site de noticias • Leituras caras •

    Mudança rápida de páginas • Tracking dinâmico do que o usuário está fazendo When segunda-feira, 27 de agosto de 12
  34. Uso • Cache: Site de noticias Cacheando resultados genéricos: SETEX

    <id da página>:content 600 <dados> When segunda-feira, 27 de agosto de 12
  35. Uso • Fila BRPOP fila LPUSH fila “descrição do job”

    ex: Lib resque do GitHub https://github.com/defunkt/resque/ When segunda-feira, 27 de agosto de 12
  36. Aplicações • Ajax pooling / Long pooling • Serviço de

    compartilhamento de diretório ( GitHub) • CSRF tokens • Tokens temporários de OAuth • Cache • Chat When segunda-feira, 27 de agosto de 12
  37. phpredis $redis = new Redis(); $redis->connect(‘127.0.0.1’, 6379); $redis->watch(‘user’); $result =

    $redis->multi() ->set(‘user’, ‘manolo’) ->exec(); echo $result !== false ? ‘Success’ : ‘Shit happens’; echo $redis->get(‘user’); How segunda-feira, 27 de agosto de 12
  38. phpiredis $redis = phpiredis_connect(‘127.0.0.1’, 6379); phpiredis_command($redis, ‘WATCH user’); phpiredis_command($redis, ‘MULTI’);

    $user = “manolo”; phpiredis_command($redis, ‘SET user ‘.$user); $result = phpiredis_command($redis, ‘EXEC’); echo $result !== false ? ‘Success’ : ‘Shit happens’; echo phpiredis_command($redis, ‘GET user’); How segunda-feira, 27 de agosto de 12
  39. Predis • Master/Slave auto select • Pode fazer uso do

    phpiredis para parsing • Symfony bundle How segunda-feira, 27 de agosto de 12