Redis um banco chave valor

2,647 views
2,513 views

Published on

Palestra ministrada no PHPMS CONF 2012

about.me/kinncj
kinncj@php.net

Published in: Technology

Redis um banco chave valor

  1. 1. RedisA Key-Value datastore
  2. 2. About• Software Engineer: Dafiti• Developer: About 10• php.net, MeeGo, phpsp, fedora project, NoSQL BR, *• Zend Certified Engineer, Husband and Daddy
  3. 3. Dafuck Redis?
  4. 4. Dafuck Redis?• Remote Dictionary Server
  5. 5. Dafuck Redis?• Remote Dictionary Server• Armazenamento chave-valor
  6. 6. Dafuck Redis?• Remote Dictionary Server• Armazenamento chave-valor • ... lista e executa operações
  7. 7. Dafuck Redis?• Remote Dictionary Server• Armazenamento chave-valor • ... lista e executa operações• Um servidor de estrutura de dados
  8. 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. 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. 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. 11. Um canivete suíço
  12. 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. 13. Breve histórico• Breve mesmo...
  14. 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. 15. Agenda
  16. 16. Agenda?
  17. 17. é... agora que tacomeçando a parada!
  18. 18. Agenda!• Como funciona• Comandos• Tipos de dados• Utilidade• PHP• Úteis
  19. 19. Inicio de tudo!$ git clone git://github.com/antirez/redis$ cd redis$ make$ ./redis-server
  20. 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
  21. 21. Tipos de dados
  22. 22. Tipos de dados• Binary-safe strings ( até 10GB ) • listas • conjuntos• Conjuntos sortidos • (Cada chave possuí uma pontuação)• hashes• Canais pub/sub
  23. 23. Comandos da base de dados• SELECT• MOVE• FLUSHDB• FLUSHALL• SHUTDOWN• SLAVEOF• DBSIZE• INFO• MONITOR• SAVE / BGSAVE• LASTSAVE• BGREWRITEAOF
  24. 24. Comandos da base de dados• SELECT• MOVE• FLUSHDB 16 bases• FLUSHALL numeradas• SHUTDOWN• SLAVEOF• DBSIZE• INFO• MONITOR• SAVE / BGSAVE• LASTSAVE• BGREWRITEAOF
  25. 25. Comandos da base de dados• SELECT• MOVE• FLUSHDB Exclusão em• FLUSHALL massa• SHUTDOWN• SLAVEOF• DBSIZE• INFO• MONITOR• SAVE / BGSAVE• LASTSAVE• BGREWRITEAOF
  26. 26. Comandos da base de dados• SELECT• MOVE• FLUSHDB Útil para• FLUSHALL debugging e• SHUTDOWN monitoramento• SLAVEOF• DBSIZE• INFO• MONITOR• SAVE / BGSAVE• LASTSAVE• BGREWRITEAOF
  27. 27. 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]
  28. 28. 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
  29. 29. Os tipos de dados!!!
  30. 30. StringsSET name KinnSET age 23MGET name age> Kinn>23GETSET name Kinncj> Kinn
  31. 31. StringsSETEX age 3 20GET age> 20// .. 3 segundos apósGET age> null
  32. 32. InteirosINCR count>1INCR count>2INCRBY count 3>5
  33. 33. HashesHMSET user name Kinn email kinncj@php.netHGET user email> kinncj@php.netHKEYS user> name> emailHGETALL user> name> Kinn> email> kinncj@php.net
  34. 34. ListasRPUSH admins Kinn>1RPUSH admins Manolo>2LINDEX admins 0> KinnLLEN admins>2RPOP admins> Manolo
  35. 35. ConjuntosSADD page:3:visitors 134>1SADD page:3:visitors 253>1SADD page:3:visitors 253>0SCARD page:3:visitors>2SMEMBERS page:3:visitors> 134> 253SISMEMBER page:3:visitors 349>0
  36. 36. ConjuntosSADD page:6:visitors 253SADD page:6:visitors 923SADD page:6:visitors 13SINTER page:3:visitors page:6:visitors> 253
  37. 37. Conjuntos sortidosZADD highscores 2930 KinnZADD highscores 1500 ManoloZREVRANGE highscores 0 10 WITHSCORES> Kinn> 2930> Manolo> 1500
  38. 38. ExemploListas array(‘foo’, ‘bar’);Conjuntos suffle(array(‘foo’, ‘bar’));Conjuntos sortidos ksort(array(3 => ‘foo’, 1 => ‘bar’));
  39. 39. Os tipos básicos de cadalinguagem existem no redis
  40. 40. Processe dados no redis ao invés do PHP
  41. 41. SORT - SQL em seu NoSQLSORT chaveSORT chave LIMIT 0 10 DESCSORT chave ALPHASORT page:6:visitors BY user_*->rankGET user_* DESC
  42. 42. Pub/Sub
  43. 43. Pub/Sub• Redis faz BroadCast!!!!!!
  44. 44. Pub/SubSUBSCRIBE mensagemSUBSCRIBE chan1 chan2 chan3PUBLISH mensagem “Ola Mundo”PSUBSCRIBE chat.*
  45. 45. Goodies
  46. 46. Goodies• Replicação Master/Slave• Transações: MULTI / EXEC / DISCARD
  47. 47. Future Goodies
  48. 48. Future Goodies• Lua Scripting: EVAL
  49. 49. Future Goodies : Cluster
  50. 50. Future Goodies : Cluster• Redis Cluster ( Tão atrasado quanto o PHP 6 )
  51. 51. Future Goodies : Cluster Velocidade Redis é rápidoÉ muito improvável que CPU seja gargalo
  52. 52. Future Goodies : Cluster Velocidade
  53. 53. Future Goodies : Cluster Redis é rápido
  54. 54. Future Goodies : ClusterÉ muito improvável que CPU seja gargalo
  55. 55. Future Goodies : ClusterO que você faz quando está sem RAM?
  56. 56. Future Goodies : Cluster Esperar pelo cluster Redis? Se você puder... o Cluster é parece ser ótimo
  57. 57. 2 centavos Armazene em disco.Carregue hot-data na memória.
  58. 58. Uso• WEB SCALE• THE CLOUD• NOSQL• ELASTIC• HORIZONTAL SCALING• VERTICAL TOO
  59. 59. Uso• WEB SCALE• THE CLOUD• NOSQL• ELASTIC• HORIZONTAL SCALING• VERTICAL TOO
  60. 60. BULLSHIT
  61. 61. Caia na realSe você precisa escalar, sua base de dadosnão vai magicamente fazer isso por você
  62. 62. UsoEntão para que realmente ele é bom?
  63. 63. Uso• Armazenamento de sessões• Cache• Qualquer outra coisa que o memcached faça
  64. 64. Uso• Cache: Site de noticias • Leituras caras • Mudança rápida de páginas • Tracking dinâmico do que o usuário está fazendo
  65. 65. Uso• Cache: Site de noticiasCacheando resultados genéricos: SETEX <id da página>:content 600 <dados>
  66. 66. Uso• Lista de jobs BRPOP fila LPUSH fila “descrição do job” ex: Lib resque do GitHub https://github.com/defunkt/resque/
  67. 67. Aplicações• Ajax pooling• Serviço de compartilhamento de diretório ( GitHub)• CSRF tokens• Tokens temporários de OAuth• Cache• Chat
  68. 68. E o PHP?Entra aonde?
  69. 69. PHP + Redis Extensão phpredishttp://github.com/nicolasff/phpredis
  70. 70. phpredis• Session handler• up to date
  71. 71. 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’);
  72. 72. PHP + Redis Extensão phpiredishttp://github.com/seppo0010/phpiredis
  73. 73. phpiredis• Parsing de protocolo• Baixo nível
  74. 74. 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’);
  75. 75. PHP + Redis Extensão Predishttp://github.com/nrk/predis
  76. 76. Predis• Master/Slave auto select• Pode fazer uso do phpiredis para parsing• Symfony bundle
  77. 77. PHP + RedisDoctrine cache layer
  78. 78. Doctrine• Cache de query results diretamente no redis.
  79. 79. Redis• É rápido!• É divertido!• Try-it try.redis-db.com
  80. 80. Obrigado @kinncj kinncj@php.net• 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

×