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

[PHPMSCONF2012] Redis - Um banco chave valor

kinncj
August 18, 2012

[PHPMSCONF2012] Redis - Um banco chave valor

Palestra ministrada no PHPMS CONF 2012

kinncj

August 18, 2012
Tweet

More Decks by kinncj

Other Decks in Technology

Transcript

  1. Redis
    A Key-Value datastore

    View full-size slide

  2. About
    • Software Engineer: Dafiti
    • Developer: About 10
    • php.net, MeeGo, phpsp, fedora project,
    NoSQL BR, *
    • Zend Certified Engineer, Husband and
    Daddy

    View full-size slide

  3. Dafuck Redis?

    View full-size slide

  4. Dafuck Redis?
    • Remote Dictionary Server

    View full-size slide

  5. Dafuck Redis?
    • Remote Dictionary Server
    • Armazenamento chave-valor

    View full-size slide

  6. Dafuck Redis?
    • Remote Dictionary Server
    • Armazenamento chave-valor
    • ... lista e executa operações

    View full-size slide

  7. Dafuck Redis?
    • Remote Dictionary Server
    • Armazenamento chave-valor
    • ... lista e executa operações
    • Um servidor de estrutura de dados

    View full-size slide

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

    View full-size slide

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

    View full-size 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
    • Um bus de evento sem bloqueio
    • Uma memória compartilhada acessível via
    rede

    View full-size slide

  11. Um canivete suíço

    View full-size slide

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

    View full-size slide

  13. Breve histórico
    • Breve mesmo...

    View full-size slide

  14. Breve histórico
    • Criado por Salvatore Sanfilippo
    ( antirez )
    • Primeiro release: Março/2009
    • “Adquirido” pela VMWare em Março
    de 2010
    • Open Source ( BSD )

    View full-size slide

  15. é... agora que ta
    começando a parada!

    View full-size slide

  16. Agenda!
    • Como funciona
    • Comandos
    • Tipos de dados
    • Utilidade
    • PHP
    • Úteis

    View full-size slide

  17. Inicio de tudo!
    $ git clone git://github.com/antirez/redis
    $ cd redis
    $ make
    $ ./redis-server

    View full-size slide

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

    View full-size slide

  19. Tipos de dados

    View full-size slide

  20. Tipos de dados
    • Binary-safe strings ( até 10GB )
    • listas
    • conjuntos
    • Conjuntos sortidos
    • (Cada chave possuí uma pontuação)
    • hashes
    • Canais pub/sub

    View full-size slide

  21. Comandos da base de
    dados
    • SELECT
    • MOVE
    • FLUSHDB
    • FLUSHALL
    • SHUTDOWN
    • SLAVEOF
    • DBSIZE
    • INFO
    • MONITOR
    • SAVE / BGSAVE
    • LASTSAVE
    • BGREWRITEAOF

    View full-size slide

  22. Comandos da base de
    dados
    • SELECT
    • MOVE
    • FLUSHDB
    • FLUSHALL
    • SHUTDOWN
    • SLAVEOF
    • DBSIZE
    • INFO
    • MONITOR
    • SAVE / BGSAVE
    • LASTSAVE
    • BGREWRITEAOF
    16 bases
    numeradas

    View full-size slide

  23. Comandos da base de
    dados
    • SELECT
    • MOVE
    • FLUSHDB
    • FLUSHALL
    • SHUTDOWN
    • SLAVEOF
    • DBSIZE
    • INFO
    • MONITOR
    • SAVE / BGSAVE
    • LASTSAVE
    • BGREWRITEAOF
    Exclusão em
    massa

    View full-size slide

  24. Comandos da base de
    dados
    • SELECT
    • MOVE
    • FLUSHDB
    • FLUSHALL
    • SHUTDOWN
    • SLAVEOF
    • DBSIZE
    • INFO
    • MONITOR
    • SAVE / BGSAVE
    • LASTSAVE
    • BGREWRITEAOF
    Útil para
    debugging e
    monitoramento

    View full-size slide

  25. Comandos
    • SET [chave valor]
    • SETEX [chave tempo valor]
    • GET [chave]
    • MGET [chave1 chave2 ...]
    • MSET [chave1 valor1 chave2 valor2 ...]
    • INCR / INCRBY
    • DECR / DECRBY
    • APPEND [chave valor]
    • SUBSTR [chave 0 1]

    View full-size slide

  26. Comandos atomicos
    • GETSET [chave valor]
    • Seta o novo valor e retorna o anterior
    • SETNX [chave valor]
    • Falha se a chave já está setada
    • MSETNX [ c1 v1 c2 v2 c3 v3 ... ]
    • Falha se ALGUMA chave já existir

    View full-size slide

  27. Os tipos de dados!!!

    View full-size slide

  28. Strings
    SET name Kinn
    SET age 23
    MGET name age
    > Kinn
    >23
    GETSET name Kinncj
    > Kinn

    View full-size slide

  29. Strings
    SETEX age 3 20
    GET age
    > 20
    // .. 3 segundos após
    GET age
    > null

    View full-size slide

  30. Inteiros
    INCR count
    > 1
    INCR count
    > 2
    INCRBY count 3
    > 5

    View full-size slide

  31. Hashes
    HMSET user name Kinn email [email protected]
    HGET user email
    > [email protected]
    HKEYS user
    > name
    > email
    HGETALL user
    > name
    > Kinn
    > email
    > [email protected]

    View full-size slide

  32. Listas
    RPUSH admins Kinn
    > 1
    RPUSH admins Manolo
    > 2
    LINDEX admins 0
    > Kinn
    LLEN admins
    > 2
    RPOP admins
    > Manolo

    View full-size slide

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

    View full-size slide

  34. Conjuntos
    SADD page:6:visitors 253
    SADD page:6:visitors 923
    SADD page:6:visitors 13
    SINTER page:3:visitors page:6:visitors
    > 253

    View full-size slide

  35. Conjuntos sortidos
    ZADD highscores 2930 Kinn
    ZADD highscores 1500 Manolo
    ZREVRANGE highscores 0 10 WITHSCORES
    > Kinn
    > 2930
    > Manolo
    > 1500

    View full-size slide

  36. Exemplo
    Listas
    array(‘foo’, ‘bar’);
    Conjuntos
    suffle(array(‘foo’, ‘bar’));
    Conjuntos sortidos
    ksort(array(3 => ‘foo’, 1 => ‘bar’));

    View full-size slide

  37. Os tipos básicos de cada
    linguagem existem no redis

    View full-size slide

  38. Processe dados no redis ao
    invés do PHP

    View full-size slide

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

    View full-size slide

  40. Pub/Sub
    • Redis faz BroadCast!!!!!!

    View full-size slide

  41. Pub/Sub
    SUBSCRIBE mensagem
    SUBSCRIBE chan1 chan2 chan3
    PUBLISH mensagem “Ola Mundo”
    PSUBSCRIBE chat.*

    View full-size slide

  42. Goodies
    • Replicação Master/Slave
    • Transações: MULTI / EXEC / DISCARD

    View full-size slide

  43. Future Goodies

    View full-size slide

  44. Future Goodies
    • Lua Scripting: EVAL

    View full-size slide

  45. Future Goodies : Cluster

    View full-size slide

  46. Future Goodies : Cluster
    • Redis Cluster ( Tão atrasado quanto o
    PHP 6 )

    View full-size slide

  47. Future Goodies : Cluster
    Velocidade
    Redis é rápido
    É muito improvável que CPU seja gargalo

    View full-size slide

  48. Future Goodies : Cluster
    Velocidade

    View full-size slide

  49. Future Goodies : Cluster
    Redis é rápido

    View full-size slide

  50. Future Goodies : Cluster
    É muito improvável que CPU seja gargalo

    View full-size slide

  51. Future Goodies : Cluster
    O que você faz quando está sem RAM?

    View full-size slide

  52. Future Goodies : Cluster
    Esperar pelo cluster Redis?
    Se você puder... o Cluster é parece ser
    ótimo

    View full-size slide

  53. 2 centavos
    Armazene em disco.
    Carregue hot-data na memória.

    View full-size slide

  54. Uso
    • WEB SCALE
    • THE CLOUD
    • NOSQL
    • ELASTIC
    • HORIZONTAL SCALING
    • VERTICAL TOO

    View full-size slide

  55. Uso
    • WEB SCALE
    • THE CLOUD
    • NOSQL
    • ELASTIC
    • HORIZONTAL SCALING
    • VERTICAL TOO

    View full-size slide

  56. Caia na real
    Se você precisa escalar, sua base de dados
    não vai magicamente fazer isso por você

    View full-size slide

  57. Uso
    Então para que realmente ele é bom?

    View full-size slide

  58. Uso
    • Armazenamento de sessões
    • Cache
    • Qualquer outra coisa que o
    memcached faça

    View full-size slide

  59. Uso
    • Cache: Site de noticias
    • Leituras caras
    • Mudança rápida de páginas
    • Tracking dinâmico do que o usuário
    está fazendo

    View full-size slide

  60. Uso
    • Cache: Site de noticias
    Cacheando resultados genéricos:
    SETEX :content 600

    View full-size slide

  61. Uso
    • Lista de jobs
    BRPOP fila
    LPUSH fila “descrição do job”
    ex: Lib resque do GitHub https://github.com/defunkt/resque/

    View full-size slide

  62. Aplicações
    • Ajax pooling
    • Serviço de compartilhamento de
    diretório ( GitHub)
    • CSRF tokens
    • Tokens temporários de OAuth
    • Cache
    • Chat

    View full-size slide

  63. E o PHP?
    Entra aonde?

    View full-size slide

  64. PHP + Redis
    Extensão phpredis
    http://github.com/nicolasff/phpredis

    View full-size slide

  65. phpredis
    • Session handler
    • up to date

    View full-size slide

  66. 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’);

    View full-size slide

  67. PHP + Redis
    Extensão phpiredis
    http://github.com/seppo0010/phpiredis

    View full-size slide

  68. phpiredis
    • Parsing de protocolo
    • Baixo nível

    View full-size slide

  69. phpredis
    $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’);

    View full-size slide

  70. PHP + Redis
    Extensão Predis
    http://github.com/nrk/predis

    View full-size slide

  71. Predis
    • Master/Slave auto select
    • Pode fazer uso do phpiredis para
    parsing
    • Symfony bundle

    View full-size slide

  72. PHP + Redis
    Doctrine cache layer

    View full-size slide

  73. Doctrine
    • Cache de query results diretamente
    no redis.

    View full-size slide

  74. Redis
    • É rápido!
    • É divertido!
    • Try-it try.redis-db.com

    View full-size slide

  75. Obrigado
    • http://rediscookbook.org/pubsub_for_synchronous_communication.html - The chat application
    • http://redis.io/topics/twitter-clone/ - A micro-blogging application
    • http://docs.doctrine-project.org/en/latest/reference/caching.html - Doctrine cache
    • http://highscalability.com/blog/2011/7/6/11-common-web-use-cases-solved-in-redis.html - Use cases
    • http://redis.io/
    • https://github.com/kinncj/Redis---PHPMSCONF2012
    @kinncj
    [email protected]

    View full-size slide