PHP e o cache sofisticado com 
Redis 
@Pv_Fusion 
Paulo Victor L. L. Gomes 
Analista de Sistemas, Pós-graduando em Engenha...
Conhecendo o Redis 
O Redis é um storage de dados schemaless, do 
tipo tuple store ou key-value store, projetado para 
arm...
Conhecendo o Redis 
Open Source (BSD), criado por Salvatore 
Sanfilippo (antirez) seu primeiro release foi em 
Março de 20...
Conhecendo o Redis 
- Muito rápido 
- Non-blocking I/O 
- 100 000+ escrita/leitura por segundo 
- Pequeno: 16 000 linhas d...
Conhecendo o Redis 
Referenciado em muitas literaturas como data 
structure server, por permitir o armazenamento 
de dados...
Quem está usando o Redis? 
Fonte: http://redis.io/topics/whos-using-redis 30/10/2014
Mas e o Memcached? 
O Redis assim como o Memcached é um 
poderoso storage de dados na RAM, mas 
implementa alguns recursos...
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 local...
Instalação 
Instale algumas dependências: 
Debian / Ubuntu e variações 
Fedora / Centos / RHEL 
$ sudo apt-get update 
$ s...
Console 
Subir o Redis: 
redis-server 
Acessar o console: 
redis-cli 
Acessar o console informando o host e a porta 
redis...
Console 
Testando o serviço: 
redis-cli 
ping 
Retorno esperado...
Console 
Testando o serviço: 
redis-cli 
ping 
Retorno esperado... 
PONG
Console - Comandos Básicos 
- SET [chave valor] 
- SETEX [chave tempo valor] 
- TTL [chave] 
- GET [chave] 
- MGET [chave1...
Padronizando chaves
Padronizando chaves 
- Chaves podem conter espaço em branco mas… Não faça isso 
- Chaves curtas performam melhor 
- Curta ...
Console - Comandos Atomicos 
- GETSET [chave valor] 
- Define novo valor retornando o valor anterior 
- SETNX [chave valor...
Configuração 
O Redis pode ser iniciado sem um arquivo de configuração usando uma 
configuração padrão built-in, no entant...
Configuração 
O que podemos configurar no redis.conf ? 
- Porta de comunicação (port) 
- Timeout de cliente (timeout) 
- V...
E se o serviço parar? 
O Redis suporta duas estratégias diferentes de 
Backup/Restore de dados 
- Snapshotting 
- Log appe...
Snapshotting 
Também conhecida como RDB, a persistência 
do dataset no disco respeita dois critérios 
combinados: Tempo de...
Snapshotting 
Também conhecida como RDB, a persistência 
do dataset no disco respeita dois critérios 
combinados: Tempo de...
Snapshotting 
Também podemos gravar o dataset pelo 
cliente. 
- SAVE (Síncrono) 
- BGSAVE (Assíncrono)
Clientes PHP 
Predis (github.com/nrk/predis) 
PHPRedis (github.com/nicolasff/phpredis) 
Rediska (github.com/Shumkov/Redisk...
Predis - Set e Get 
<?php 
require __DIR__.'/../autoload.php'; 
$server = array( 
'host' => '127.0.0.1', 
'port' => 6381 
...
Predis - MSet e MGet 
<?php 
require __DIR__.'/../autoload.php'; 
$client = new PredisClient(array('host' => '127.0.0.1', ...
Predis - Keys 
<?php 
require __DIR__.'/../autoload.php'; 
$server = array( 
'host' => '127.0.0.1', 
'port' => 6381 
); 
$...
Predis - Pipelining 
<?php 
require __DIR__.'/../autoload.php'; 
$client = new PredisClient(array('host' => '127.0.0.1', '...
Predis - Pub/Sub 
$pubsub = $client->pubSubLoop(); 
$pubsub->subscribe('control_channel', 'notifications'); 
foreach ($pub...
Minha última experiência
Bonus 
- PERSIST (Remove expiração de chave) 
- PEXPIRE (Insere expiração em chave) 
- STRLEN (Tamanho armazenado na chave...
Perguntas?
Referências 
Redis 
http://redis.io/ 
NoSQL Distilled: A Brief Guide to the Emerging World of Polyglot Persistence 
by Pra...
Próximos SlideShares
Carregando em…5
×

PHP e Redis

745 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
745
No SlideShare
0
A partir de incorporações
0
Número de incorporações
11
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.

×