PHP e Redis

842 visualizações

Publicada em

Php conference 2014

Publicada em: Tecnologia
0 comentários
5 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
842
No SlideShare
0
A partir de incorporações
0
Número de incorporações
13
Ações
Compartilhamentos
0
Downloads
0
Comentários
0
Gostaram
5
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

PHP e Redis

  1. 1. PHP e o cache sofisticado com Redis @Pv_Fusion Paulo Victor L. L. Gomes Analista de Sistemas, Pós-graduando em Engenharia de Sistemas, Zend Certified Engineer PHP 5.3, contribuidor do PHPSP. Voucher TricaeNTM
  2. 2. Conhecendo o Redis O Redis é um storage de dados schemaless, do tipo tuple store ou key-value store, projetado para armazenar dados na memória RAM e permitir acesso fácil e extremamente rápido de qualquer informação, através de uma API bastante rica e simples de usar. Versão estável 2.8.17 em 28/10/2014
  3. 3. Conhecendo o Redis Open Source (BSD), criado por Salvatore Sanfilippo (antirez) seu primeiro release foi em Março de 2009. Foi comprado pela VMWare em 2010. Versão estável 2.8.17 em 28/10/2014
  4. 4. Conhecendo o Redis - Muito rápido - Non-blocking I/O - 100 000+ escrita/leitura por segundo - Pequeno: 16 000 linhas de código C - Complementa a camada de persistência - API simples e completa Versão estável 2.8.17 em 28/10/2014
  5. 5. Conhecendo o Redis Referenciado em muitas literaturas como data structure server, por permitir o armazenamento de dados simples, como Strings e números, até estruturas de dados complexas, como Lists, Sets, Hashes e Sorted Sets. Versão estável 2.8.17 em 28/10/2014
  6. 6. Quem está usando o Redis? Fonte: http://redis.io/topics/whos-using-redis 30/10/2014
  7. 7. Mas e o Memcached? O Redis assim como o Memcached é um poderoso storage de dados na RAM, mas implementa alguns recursos adicionais como transactions, pipeline, data type, publish-subscribe pattern, restore do dataset, replicação, entre outros. http://redis.io/documentation
  8. 8. E a segurança? - Porta para conexões na interface de rede - Regras básicas de segurança são válidas como binde no localhost, iptables… - Permite que conexões sejam autenticadas antes que qualquer query seja executada Guia de boas práticas de segurança com Redis http://redis.io/topics/security
  9. 9. Instalação Instale algumas dependências: Debian / Ubuntu e variações Fedora / Centos / RHEL $ sudo apt-get update $ sudo apt-get install build-essential automake tcl8.5-dev $ sudo yum install gcc make jemalloc-devel lua-devel hiredis-devel Depois é só instalar: $ wget http://download.redis.io/redis-stable.tar.gz $ tar xzf redis-stable.tar.gz $ cd redis-stable $ make $ sudo make install
  10. 10. Console Subir o Redis: redis-server Acessar o console: redis-cli Acessar o console informando o host e a porta redis-cli -h NOMEHOST -p PORTA
  11. 11. Console Testando o serviço: redis-cli ping Retorno esperado...
  12. 12. Console Testando o serviço: redis-cli ping Retorno esperado... PONG
  13. 13. Console - Comandos Básicos - SET [chave valor] - SETEX [chave tempo valor] - TTL [chave] - GET [chave] - MGET [chave1 chave2 ...] - MSET [chave1 valor1 chave2 valor2 ...] - KEYS [padrão] - INCR/INCRBY - DECR/DECRBY - APPEND [chave valor] - DEL [chave]
  14. 14. Padronizando chaves
  15. 15. Padronizando chaves - Chaves podem conter espaço em branco mas… Não faça isso - Chaves curtas performam melhor - Curta mas com significado - Separe utilizando dois pontos “ : “ - Convenção: tipo-de-objeto:id:campo user:8:username = chaves user:71:username = clotilde - SHA1(data)
  16. 16. Console - Comandos Atomicos - GETSET [chave valor] - Define novo valor retornando o valor anterior - SETNX [chave valor] - Falha se a chave já esta definida - MSETNX [chave1 valor1 chave2 valor2 chave3 valor4] - Falha se alguma chave já existir
  17. 17. Configuração O Redis pode ser iniciado sem um arquivo de configuração usando uma configuração padrão built-in, no entanto, esta configuração é recomendada apenas para fins de teste e desenvolvimento. Subindo o redis para testes redis-server A maneira correta de configurar o Redis é fornecendo um arquivo de configuração, normalmente chamado de redis.conf. Subindo o redis informando suas configurações redis-server redis.conf
  18. 18. Configuração O que podemos configurar no redis.conf ? - Porta de comunicação (port) - Timeout de cliente (timeout) - Verbosidade de log do server (loglevel) - Snapshotting (save) - Nome do arquivo onde persistir o DB (dbfilename) - Replicação (slave-serve-stale-data, slave-read-only, repl-disable-tcp-nodelay, slave-priority) - Senha de autenticação (requirepass) - Limite de clientes (maxclients) - Limite de tamanho (maxmemory) http://redis.io/topics/config
  19. 19. E se o serviço parar? O Redis suporta duas estratégias diferentes de Backup/Restore de dados - Snapshotting - Log appending
  20. 20. Snapshotting Também conhecida como RDB, a persistência do dataset no disco respeita dois critérios combinados: Tempo decorrido (em segundos) e Quantidade de alterações realizadas no dataset, a partir do último backup realizado. save TEMPO QUANTIDADE save 60 5
  21. 21. Snapshotting Também conhecida como RDB, a persistência do dataset no disco respeita dois critérios combinados: Tempo decorrido (em segundos) e Quantidade de alterações realizadas no dataset, a partir do último backup realizado. save TEMPO QUANTIDADE save 60 5
  22. 22. Snapshotting Também podemos gravar o dataset pelo cliente. - SAVE (Síncrono) - BGSAVE (Assíncrono)
  23. 23. Clientes PHP Predis (github.com/nrk/predis) PHPRedis (github.com/nicolasff/phpredis) Rediska (github.com/Shumkov/Rediska) Credis (github.com/colinmollenhour/credis)
  24. 24. Predis - Set e Get <?php require __DIR__.'/../autoload.php'; $server = array( 'host' => '127.0.0.1', 'port' => 6381 ); $client = new PredisClient($server); /** @var PredisResponseStatus $returnOfSet */ $returnOfSet = $client->set('news:3543:url', 'http://news.com.br/tinky-winky-briga-com-dipsy-e-pede-demissao-dos-teletubbies.html'); $response = $client->get('news:3543:url'); var_export($response);
  25. 25. Predis - MSet e MGet <?php require __DIR__.'/../autoload.php'; $client = new PredisClient(array('host' => '127.0.0.1', 'port' => 6381)); $urls = array( 'news:3543:url' => 'http://news.com.br/tinky-winky-briga-com-dipsy-e-pede-demissao-dos-teletubbies.html', 'news:3544:url' => 'http://news.com.br/ze-dirceu-canta-macarena-e-vai-preso.html', 'news:3545:url' => 'http://news.com.br/spotify-pega-virus-nos-servidores-depois-de-adicionar-funk-brasileiro.html', 'news:3545:content' => 'O spotify se deu mal quando decidiu inserir funk no seu leque musical', 'news:3543:content' => 'Tinky Wink briga com Dipsy e pede demissão dos Teletubies, segundo informações a briga de iniciou por conta do creminho gostoso', ); $client->mset($urls); $response = $client->mget(array('news:3543:url', 'news:3544:url', 'news:3545:url', 'news:3543:content')); var_export($response); echo PHP_EOL;
  26. 26. Predis - Keys <?php require __DIR__.'/../autoload.php'; $server = array( 'host' => '127.0.0.1', 'port' => 6381 ); $client = new PredisClient($server); $allKeys = $client->keys("*"); var_export($allKeys); echo PHP_EOL; $contentKeys = $client->keys('news:*:content'); var_export($contentKeys); echo PHP_EOL;
  27. 27. Predis - Pipelining <?php require __DIR__.'/../autoload.php'; $client = new PredisClient(array('host' => '127.0.0.1', 'port' => 6381)); $responses = $client->pipeline(function ($pipe) { $pipe->incrby('likes', 10); $pipe->incrby('likes', 30); $pipe->incrby('likes', 1); $pipe->incrby('likes', 1); $pipe->decrby('likes',10); $pipe->exists('likes'); $pipe->set('configuration:33234:flag','0'); }); var_export($responses);
  28. 28. Predis - Pub/Sub $pubsub = $client->pubSubLoop(); $pubsub->subscribe('control_channel', 'notifications'); foreach ($pubsub as $message) { switch ($message->kind) { case 'subscribe': echo "Subscribed to {$message->channel}", PHP_EOL; break; case 'message': if ($message->channel == 'control_channel') { if ($message->payload == 'quit_loop') { echo "Aborting pubsub loop...", PHP_EOL; $pubsub->unsubscribe(); } else { echo "Received an unrecognized command: {$message->payload}.", PHP_EOL; } } else { echo "Received the following message from {$message->channel}:", PHP_EOL, " {$message->payload}", PHP_EOL, PHP_EOL; } break; }} unset($pubsub);
  29. 29. Minha última experiência
  30. 30. Bonus - PERSIST (Remove expiração de chave) - PEXPIRE (Insere expiração em chave) - STRLEN (Tamanho armazenado na chave) - RENAME (Renomeia a chave) - TYPE (Verifica tipo armazenado na chave) Todos os comandos: http://redis.io/commands
  31. 31. Perguntas?
  32. 32. Referências Redis http://redis.io/ NoSQL Distilled: A Brief Guide to the Emerging World of Polyglot Persistence by Pramod J. Sadalage & Martin Fowler. The Little Redis Book by Karl Seguin. App Redis Documentation by Kyle Banks. Redis in Action (Manning, 2013) by Josiah L. Carlson (early access edition). Instant Redis Optimization How-to (Packt, 2013) by Arun Chinnachamy. Instant Redis Persistence (Packt, 2013) by Matt Palmer.

×