$30 off During Our Annual Pro Sale. View Details »

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. Redis
    What? Why? When? How?
    segunda-feira, 27 de agosto de 12

    View Slide

  2. 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

    View Slide

  3. Redis
    • Memcached
    segunda-feira, 27 de agosto de 12

    View Slide

  4. Obrigado
    segunda-feira, 27 de agosto de 12

    View Slide

  5. Dafuck Redis?
    What
    segunda-feira, 27 de agosto de 12

    View Slide

  6. Dafuck Redis?
    • Remote Dictionary Server
    What
    segunda-feira, 27 de agosto de 12

    View Slide

  7. Dafuck Redis?
    • Remote Dictionary Server
    • Armazenamento chave-valor
    What
    segunda-feira, 27 de agosto de 12

    View Slide

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

    View Slide

  9. 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

    View Slide

  10. 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

    View Slide

  11. 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

    View Slide

  12. 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

    View Slide

  13. Um canivete suíço
    What
    segunda-feira, 27 de agosto de 12

    View Slide

  14. 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

    View Slide

  15. Breve histórico
    • Breve mesmo...
    What
    segunda-feira, 27 de agosto de 12

    View Slide

  16. 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

    View Slide

  17. Agenda!
    • Como funciona
    • Tipos de dados
    • Utilidade
    • PHP
    • Úteis
    What
    segunda-feira, 27 de agosto de 12

    View Slide

  18. Inicio de tudo!
    $ git clone git://github.com/antirez/redis
    $ cd redis
    $ make
    $ ./redis-server
    What
    segunda-feira, 27 de agosto de 12

    View Slide

  19. What
    segunda-feira, 27 de agosto de 12

    View Slide

  20. 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

    View Slide

  21. Tipos de dados
    What
    segunda-feira, 27 de agosto de 12

    View Slide

  22. 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

    View Slide

  23. Os tipos de dados propriamente ditos!!!
    What
    segunda-feira, 27 de agosto de 12

    View Slide

  24. Strings
    SET name Kinn
    SET age 23
    MGET name age
    > Kinn
    >23
    GETSET name Kinncj
    > Kinn
    What
    segunda-feira, 27 de agosto de 12

    View Slide

  25. Strings
    SETEX age 3 20
    GET age
    > 20
    // .. 3 segundos após
    GET age
    > null
    What
    segunda-feira, 27 de agosto de 12

    View Slide

  26. Inteiros
    INCR count
    > 1
    INCR count
    > 2
    INCRBY count 3
    > 5
    What
    segunda-feira, 27 de agosto de 12

    View Slide

  27. 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

    View Slide

  28. 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

    View Slide

  29. 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

    View Slide

  30. 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

    View Slide

  31. 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

    View Slide

  32. Exemplo
    Listas
    array(‘foo’, ‘bar’);
    Conjuntos
    suffle(array(‘foo’, ‘bar’));
    Conjuntos sortidos
    ksort(array(3 => ‘foo’, 1 => ‘bar’));
    What
    segunda-feira, 27 de agosto de 12

    View Slide

  33. Os tipos básicos de cada
    linguagem existem no redis
    Why
    segunda-feira, 27 de agosto de 12

    View Slide

  34. Processe dados no redis ao
    invés do PHP
    Why
    segunda-feira, 27 de agosto de 12

    View Slide

  35. “SQL” no redis
    Why
    segunda-feira, 27 de agosto de 12

    View Slide

  36. 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

    View Slide

  37. Pub/Sub
    Why
    segunda-feira, 27 de agosto de 12

    View Slide

  38. Pub/Sub
    • Redis faz BroadCast!!!!!!
    Why
    segunda-feira, 27 de agosto de 12

    View Slide

  39. Pub/Sub
    SUBSCRIBE mensagem
    SUBSCRIBE chan1 chan2 chan3
    PUBLISH mensagem “Ola Mundo”
    PSUBSCRIBE chat.*
    Why
    segunda-feira, 27 de agosto de 12

    View Slide

  40. Goodies
    Why
    segunda-feira, 27 de agosto de 12

    View Slide

  41. Goodies
    • Replicação Master/Slave
    • Transações: MULTI / EXEC / DISCARD
    Why
    segunda-feira, 27 de agosto de 12

    View Slide

  42. Future Goodies
    Why
    segunda-feira, 27 de agosto de 12

    View Slide

  43. Future Goodies
    • Lua Scripting: EVAL
    Why
    segunda-feira, 27 de agosto de 12

    View Slide

  44. Why
    Future Goodies : Cluster
    segunda-feira, 27 de agosto de 12

    View Slide

  45. • Redis Cluster ( Tão atrasado quanto o
    PHP 6 )
    Why
    Future Goodies : Cluster
    segunda-feira, 27 de agosto de 12

    View Slide

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

    View Slide

  47. Velocidade
    Why
    Future Goodies : Cluster
    segunda-feira, 27 de agosto de 12

    View Slide

  48. Redis é rápido
    Why
    Future Goodies : Cluster
    segunda-feira, 27 de agosto de 12

    View Slide

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

    View Slide

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

    View Slide

  51. Esperar pelo cluster Redis?
    Se você puder... o Cluster é parece ser
    ótimo
    Why
    Future Goodies : Cluster
    segunda-feira, 27 de agosto de 12

    View Slide

  52. Goodie!
    Armazena em memória.
    Backup em disco.
    Why
    segunda-feira, 27 de agosto de 12

    View Slide

  53. 2 centavos
    Armazene em disco.
    Carregue hot-data na memória.
    When
    segunda-feira, 27 de agosto de 12

    View Slide

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

    View Slide

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

    View Slide

  56. BULLSHIT
    When
    segunda-feira, 27 de agosto de 12

    View Slide

  57. 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

    View Slide

  58. Uso
    Então para que realmente ele é bom?
    When
    segunda-feira, 27 de agosto de 12

    View Slide

  59. Uso
    • Armazenamento de sessões
    • Cache
    • Qualquer outra coisa que o
    memcached faça
    When
    segunda-feira, 27 de agosto de 12

    View Slide

  60. 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

    View Slide

  61. Uso
    • Cache: Site de noticias
    Cacheando resultados genéricos:
    SETEX :content 600
    When
    segunda-feira, 27 de agosto de 12

    View Slide

  62. 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

    View Slide

  63. 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

    View Slide

  64. Aplicações
    • Github
    • Flickr
    • PHPad ;)
    When
    segunda-feira, 27 de agosto de 12

    View Slide

  65. E o PHP?
    Entra aonde?
    How
    segunda-feira, 27 de agosto de 12

    View Slide

  66. PHP + Redis
    Extensão phpredis
    http://github.com/nicolasff/phpredis
    How
    segunda-feira, 27 de agosto de 12

    View Slide

  67. phpredis
    • Session handler
    • up to date
    How
    segunda-feira, 27 de agosto de 12

    View Slide

  68. 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

    View Slide

  69. PHP + Redis
    Extensão phpiredis
    http://github.com/seppo0010/phpiredis
    How
    segunda-feira, 27 de agosto de 12

    View Slide

  70. phpiredis
    • Parsing de protocolo
    • Baixo nível
    How
    segunda-feira, 27 de agosto de 12

    View Slide

  71. 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

    View Slide

  72. PHP + Redis
    Extensão Predis
    http://github.com/nrk/predis
    How
    segunda-feira, 27 de agosto de 12

    View Slide

  73. Predis
    • Master/Slave auto select
    • Pode fazer uso do phpiredis para
    parsing
    • Symfony bundle
    How
    segunda-feira, 27 de agosto de 12

    View Slide

  74. PHP + Redis
    Doctrine cache layer
    How
    segunda-feira, 27 de agosto de 12

    View Slide

  75. Doctrine
    • Cache de query results diretamente
    no redis.
    How
    segunda-feira, 27 de agosto de 12

    View Slide

  76. Redis
    • É rápido!
    • É divertido!
    • Try-it try.redis-db.com
    How
    segunda-feira, 27 de agosto de 12

    View Slide

  77. Obrigado
    @kinncj
    [email protected]
    How
    segunda-feira, 27 de agosto de 12

    View Slide