Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

[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. About • Software Engineer: Dafiti • Developer: About 10 •

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

    ... lista e executa operações • Um servidor de estrutura de dados
  3. 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
  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 • Um bus de evento sem bloqueio
  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 • Uma memória compartilhada acessível via rede
  6. 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
  7. Breve histórico • Criado por Salvatore Sanfilippo ( antirez )

    • Primeiro release: Março/2009 • “Adquirido” pela VMWare em Março de 2010 • Open Source ( BSD )
  8. 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
  9. Tipos de dados • Binary-safe strings ( até 10GB )

    • listas • conjuntos • Conjuntos sortidos • (Cada chave possuí uma pontuação) • hashes • Canais pub/sub
  10. Comandos da base de dados • SELECT • MOVE •

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

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

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

    FLUSHDB • FLUSHALL • SHUTDOWN • SLAVEOF • DBSIZE • INFO • MONITOR • SAVE / BGSAVE • LASTSAVE • BGREWRITEAOF Útil para debugging e monitoramento
  14. 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]
  15. 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
  16. Strings SET name Kinn SET age 23 MGET name age

    > Kinn >23 GETSET name Kinncj > Kinn
  17. Strings SETEX age 3 20 GET age > 20 //

    .. 3 segundos após GET age > null
  18. Listas RPUSH admins Kinn > 1 RPUSH admins Manolo >

    2 LINDEX admins 0 > Kinn LLEN admins > 2 RPOP admins > Manolo
  19. 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
  20. Conjuntos sortidos ZADD highscores 2930 Kinn ZADD highscores 1500 Manolo

    ZREVRANGE highscores 0 10 WITHSCORES > Kinn > 2930 > Manolo > 1500
  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
  22. Future Goodies : Cluster Esperar pelo cluster Redis? Se você

    puder... o Cluster é parece ser ótimo
  23. Uso • WEB SCALE • THE CLOUD • NOSQL •

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

    ELASTIC • HORIZONTAL SCALING • VERTICAL TOO
  25. Caia na real Se você precisa escalar, sua base de

    dados não vai magicamente fazer isso por você
  26. Uso • Cache: Site de noticias • Leituras caras •

    Mudança rápida de páginas • Tracking dinâmico do que o usuário está fazendo
  27. Uso • Lista de jobs BRPOP fila LPUSH fila “descrição

    do job” ex: Lib resque do GitHub https://github.com/defunkt/resque/
  28. Aplicações • Ajax pooling • Serviço de compartilhamento de diretório

    ( GitHub) • CSRF tokens • Tokens temporários de OAuth • Cache • Chat
  29. 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’);
  30. 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’);
  31. Predis • Master/Slave auto select • Pode fazer uso do

    phpiredis para parsing • Symfony bundle
  32. 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]