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

[PHPMSCONF2012] Redis - Um banco chave valor

75eedc3e323654f396a318feea82d603?s=47 kinncj
August 18, 2012

[PHPMSCONF2012] Redis - Um banco chave valor

Palestra ministrada no PHPMS CONF 2012

75eedc3e323654f396a318feea82d603?s=128

kinncj

August 18, 2012
Tweet

Transcript

  1. Redis A Key-Value datastore

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

    php.net, MeeGo, phpsp, fedora project, NoSQL BR, * • Zend Certified Engineer, Husband and Daddy
  3. Dafuck Redis?

  4. Dafuck Redis? • Remote Dictionary Server

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

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

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

    ... lista e executa operações • Um servidor de estrutura de dados
  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
  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
  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
  11. Um canivete suíço

  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
  13. Breve histórico • Breve mesmo...

  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 )
  15. Agenda

  16. Agenda?

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

  18. Agenda! • Como funciona • Comandos • Tipos de dados

    • Utilidade • PHP • Úteis
  19. Inicio de tudo! $ git clone git://github.com/antirez/redis $ cd redis

    $ make $ ./redis-server
  20. None
  21. 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
  22. Tipos de dados

  23. Tipos de dados • Binary-safe strings ( até 10GB )

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

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

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

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

    FLUSHDB • FLUSHALL • SHUTDOWN • SLAVEOF • DBSIZE • INFO • MONITOR • SAVE / BGSAVE • LASTSAVE • BGREWRITEAOF Útil para debugging e monitoramento
  28. 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]
  29. 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
  30. Os tipos de dados!!!

  31. Strings SET name Kinn SET age 23 MGET name age

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

    .. 3 segundos após GET age > null
  33. Inteiros INCR count > 1 INCR count > 2 INCRBY

    count 3 > 5
  34. Hashes HMSET user name Kinn email kinncj@php.net HGET user email

    > kinncj@php.net HKEYS user > name > email HGETALL user > name > Kinn > email > kinncj@php.net
  35. Listas RPUSH admins Kinn > 1 RPUSH admins Manolo >

    2 LINDEX admins 0 > Kinn LLEN admins > 2 RPOP admins > Manolo
  36. 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
  37. Conjuntos SADD page:6:visitors 253 SADD page:6:visitors 923 SADD page:6:visitors 13

    SINTER page:3:visitors page:6:visitors > 253
  38. Conjuntos sortidos ZADD highscores 2930 Kinn ZADD highscores 1500 Manolo

    ZREVRANGE highscores 0 10 WITHSCORES > Kinn > 2930 > Manolo > 1500
  39. Exemplo Listas array(‘foo’, ‘bar’); Conjuntos suffle(array(‘foo’, ‘bar’)); Conjuntos sortidos ksort(array(3

    => ‘foo’, 1 => ‘bar’));
  40. Os tipos básicos de cada linguagem existem no redis

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

  42. 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
  43. Pub/Sub

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

  45. Pub/Sub SUBSCRIBE mensagem SUBSCRIBE chan1 chan2 chan3 PUBLISH mensagem “Ola

    Mundo” PSUBSCRIBE chat.*
  46. Goodies

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

    DISCARD
  48. Future Goodies

  49. Future Goodies • Lua Scripting: EVAL

  50. Future Goodies : Cluster

  51. Future Goodies : Cluster • Redis Cluster ( Tão atrasado

    quanto o PHP 6 )
  52. Future Goodies : Cluster Velocidade Redis é rápido É muito

    improvável que CPU seja gargalo
  53. Future Goodies : Cluster Velocidade

  54. Future Goodies : Cluster Redis é rápido

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

    gargalo
  56. Future Goodies : Cluster O que você faz quando está

    sem RAM?
  57. Future Goodies : Cluster Esperar pelo cluster Redis? Se você

    puder... o Cluster é parece ser ótimo
  58. 2 centavos Armazene em disco. Carregue hot-data na memória.

  59. Uso • WEB SCALE • THE CLOUD • NOSQL •

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

    ELASTIC • HORIZONTAL SCALING • VERTICAL TOO
  61. BULLSHIT

  62. Caia na real Se você precisa escalar, sua base de

    dados não vai magicamente fazer isso por você
  63. Uso Então para que realmente ele é bom?

  64. Uso • Armazenamento de sessões • Cache • Qualquer outra

    coisa que o memcached faça
  65. Uso • Cache: Site de noticias • Leituras caras •

    Mudança rápida de páginas • Tracking dinâmico do que o usuário está fazendo
  66. Uso • Cache: Site de noticias Cacheando resultados genéricos: SETEX

    <id da página>:content 600 <dados>
  67. Uso • Lista de jobs BRPOP fila LPUSH fila “descrição

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

    ( GitHub) • CSRF tokens • Tokens temporários de OAuth • Cache • Chat
  69. E o PHP? Entra aonde?

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

  71. phpredis • Session handler • up to date

  72. 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’);
  73. PHP + Redis Extensão phpiredis http://github.com/seppo0010/phpiredis

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

  75. 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’);
  76. PHP + Redis Extensão Predis http://github.com/nrk/predis

  77. Predis • Master/Slave auto select • Pode fazer uso do

    phpiredis para parsing • Symfony bundle
  78. PHP + Redis Doctrine cache layer

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

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

  81. 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 kinncj@php.net