SlideShare uma empresa Scribd logo
1 de 32
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
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
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
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
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
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 adicionais como 
transactions, pipeline, data type, publish-subscribe 
pattern, restore do dataset, 
replicação, entre outros. 
http://redis.io/documentation
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
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
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
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 chave2 ...] 
- MSET [chave1 valor1 chave2 valor2 ...] 
- KEYS [padrão] 
- INCR/INCRBY 
- DECR/DECRBY 
- APPEND [chave valor] 
- DEL [chave]
Padronizando chaves
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)
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
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
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
E se o serviço parar? 
O Redis suporta duas estratégias diferentes de 
Backup/Restore de dados 
- Snapshotting 
- Log appending
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
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
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/Rediska) 
Credis (github.com/colinmollenhour/credis)
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);
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;
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;
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);
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);
Minha última experiência
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
Perguntas?
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.

Mais conteúdo relacionado

Mais procurados

As novidades do PHP5 (2005)
As novidades do PHP5 (2005)As novidades do PHP5 (2005)
As novidades do PHP5 (2005)Pablo Dall'Oglio
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkMarcelo Rodrigo
 
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworksDo Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworksPablo Dall'Oglio
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteMichael Cardoso
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com AjaxAdler Medrado
 
XML Free Programming - Brazil
XML Free Programming - BrazilXML Free Programming - Brazil
XML Free Programming - BrazilStephen Chin
 
Criando relatórios com PHP - PHP Conference Brasil 2013
Criando relatórios com PHP - PHP Conference Brasil 2013Criando relatórios com PHP - PHP Conference Brasil 2013
Criando relatórios com PHP - PHP Conference Brasil 2013Pablo Dall'Oglio
 
Curso de Introdução - PHP Zend Framework
Curso de Introdução - PHP Zend FrameworkCurso de Introdução - PHP Zend Framework
Curso de Introdução - PHP Zend FrameworkEvandro Klimpel Balmant
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11Cezar Souza
 
Conhecendo o Zend Framework
Conhecendo o Zend FrameworkConhecendo o Zend Framework
Conhecendo o Zend FrameworkJaime Neto
 
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Pablo Dall'Oglio
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2Cezar Souza
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Vinícius de Paula
 
PHP: Programando com orientação a Objetos
PHP: Programando com orientação a ObjetosPHP: Programando com orientação a Objetos
PHP: Programando com orientação a ObjetosPablo Dall'Oglio
 
PHP: Linguagem + Mysql + MVC + AJAX
PHP: Linguagem + Mysql + MVC + AJAX PHP: Linguagem + Mysql + MVC + AJAX
PHP: Linguagem + Mysql + MVC + AJAX Sérgio Souza Costa
 

Mais procurados (20)

As novidades do PHP5 (2005)
As novidades do PHP5 (2005)As novidades do PHP5 (2005)
As novidades do PHP5 (2005)
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
 
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworksDo Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
 
Design Patterns com PHP
Design Patterns com PHPDesign Patterns com PHP
Design Patterns com PHP
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil Competente
 
Modern PHP
Modern PHPModern PHP
Modern PHP
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com Ajax
 
XML Free Programming - Brazil
XML Free Programming - BrazilXML Free Programming - Brazil
XML Free Programming - Brazil
 
Criando relatórios com PHP - PHP Conference Brasil 2013
Criando relatórios com PHP - PHP Conference Brasil 2013Criando relatórios com PHP - PHP Conference Brasil 2013
Criando relatórios com PHP - PHP Conference Brasil 2013
 
Curso de Introdução - PHP Zend Framework
Curso de Introdução - PHP Zend FrameworkCurso de Introdução - PHP Zend Framework
Curso de Introdução - PHP Zend Framework
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11
 
Conhecendo o Zend Framework
Conhecendo o Zend FrameworkConhecendo o Zend Framework
Conhecendo o Zend Framework
 
Tutorial codeigniter
Tutorial codeigniterTutorial codeigniter
Tutorial codeigniter
 
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.
 
Palestra
PalestraPalestra
Palestra
 
PHP: Programando com orientação a Objetos
PHP: Programando com orientação a ObjetosPHP: Programando com orientação a Objetos
PHP: Programando com orientação a Objetos
 
PHP: Linguagem + Mysql + MVC + AJAX
PHP: Linguagem + Mysql + MVC + AJAX PHP: Linguagem + Mysql + MVC + AJAX
PHP: Linguagem + Mysql + MVC + AJAX
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 

Destaque

Tecnologias para sistemas distribuidos escalaveis
Tecnologias para sistemas distribuidos escalaveisTecnologias para sistemas distribuidos escalaveis
Tecnologias para sistemas distribuidos escalaveisLuiz Bettega
 
Tecnologias para sistemas distribuidos escalaveis
Tecnologias para sistemas distribuidos escalaveisTecnologias para sistemas distribuidos escalaveis
Tecnologias para sistemas distribuidos escalaveisCesar Schneider
 
Redis para iniciantes - TDC 2014
Redis para iniciantes - TDC 2014Redis para iniciantes - TDC 2014
Redis para iniciantes - TDC 2014Miguel Galves
 
FISL12 - Redis e as facilidades de trabalhar com um banco de dados NoSQL
FISL12 - Redis e as facilidades de trabalhar com um banco de dados NoSQLFISL12 - Redis e as facilidades de trabalhar com um banco de dados NoSQL
FISL12 - Redis e as facilidades de trabalhar com um banco de dados NoSQLMaxwell Dayvson Da Silva
 
Redis – What, Why, When, How?
Redis – What, Why, When, How?Redis – What, Why, When, How?
Redis – What, Why, When, How?Kinn Julião
 
Bancos de dados NoSQL - Redis e MongoDB
Bancos de dados NoSQL - Redis e MongoDBBancos de dados NoSQL - Redis e MongoDB
Bancos de dados NoSQL - Redis e MongoDBPaulo Bischof
 
Mapa Mental Comandos Unix E Linux
Mapa Mental Comandos Unix E LinuxMapa Mental Comandos Unix E Linux
Mapa Mental Comandos Unix E LinuxRichar Por
 
Comandos do linux
Comandos do linuxComandos do linux
Comandos do linuxPeslPinguim
 
Treinamento de comandos Unix e Linux
Treinamento de comandos Unix e LinuxTreinamento de comandos Unix e Linux
Treinamento de comandos Unix e LinuxCid de Andrade
 
High-Volume Data Collection and Real Time Analytics Using Redis
High-Volume Data Collection and Real Time Analytics Using RedisHigh-Volume Data Collection and Real Time Analytics Using Redis
High-Volume Data Collection and Real Time Analytics Using Rediscacois
 
Implementing DDD Concepts in PHP
Implementing DDD Concepts in PHPImplementing DDD Concepts in PHP
Implementing DDD Concepts in PHPSteve Rhoades
 
Clean architecture with ddd layering in php
Clean architecture with ddd layering in phpClean architecture with ddd layering in php
Clean architecture with ddd layering in phpLeonardo Proietti
 

Destaque (19)

Tecnologias para sistemas distribuidos escalaveis
Tecnologias para sistemas distribuidos escalaveisTecnologias para sistemas distribuidos escalaveis
Tecnologias para sistemas distribuidos escalaveis
 
Tecnologias para sistemas distribuidos escalaveis
Tecnologias para sistemas distribuidos escalaveisTecnologias para sistemas distribuidos escalaveis
Tecnologias para sistemas distribuidos escalaveis
 
Redis
RedisRedis
Redis
 
NoSql Introduction
NoSql IntroductionNoSql Introduction
NoSql Introduction
 
Redis para iniciantes - TDC 2014
Redis para iniciantes - TDC 2014Redis para iniciantes - TDC 2014
Redis para iniciantes - TDC 2014
 
FISL12 - Redis e as facilidades de trabalhar com um banco de dados NoSQL
FISL12 - Redis e as facilidades de trabalhar com um banco de dados NoSQLFISL12 - Redis e as facilidades de trabalhar com um banco de dados NoSQL
FISL12 - Redis e as facilidades de trabalhar com um banco de dados NoSQL
 
Comandos basicos linux
Comandos basicos linuxComandos basicos linux
Comandos basicos linux
 
Aula 06 comandos linux
Aula 06   comandos linuxAula 06   comandos linux
Aula 06 comandos linux
 
Redis – What, Why, When, How?
Redis – What, Why, When, How?Redis – What, Why, When, How?
Redis – What, Why, When, How?
 
Bancos de dados NoSQL - Redis e MongoDB
Bancos de dados NoSQL - Redis e MongoDBBancos de dados NoSQL - Redis e MongoDB
Bancos de dados NoSQL - Redis e MongoDB
 
Mapa Mental Comandos Unix E Linux
Mapa Mental Comandos Unix E LinuxMapa Mental Comandos Unix E Linux
Mapa Mental Comandos Unix E Linux
 
DDD in PHP
DDD in PHPDDD in PHP
DDD in PHP
 
Comandos do linux
Comandos do linuxComandos do linux
Comandos do linux
 
Treinamento de comandos Unix e Linux
Treinamento de comandos Unix e LinuxTreinamento de comandos Unix e Linux
Treinamento de comandos Unix e Linux
 
Administração de Redes Linux - I
Administração de Redes Linux - IAdministração de Redes Linux - I
Administração de Redes Linux - I
 
High-Volume Data Collection and Real Time Analytics Using Redis
High-Volume Data Collection and Real Time Analytics Using RedisHigh-Volume Data Collection and Real Time Analytics Using Redis
High-Volume Data Collection and Real Time Analytics Using Redis
 
Implementing DDD Concepts in PHP
Implementing DDD Concepts in PHPImplementing DDD Concepts in PHP
Implementing DDD Concepts in PHP
 
Clean architecture with ddd layering in php
Clean architecture with ddd layering in phpClean architecture with ddd layering in php
Clean architecture with ddd layering in php
 
Hexagonal architecture in PHP
Hexagonal architecture in PHPHexagonal architecture in PHP
Hexagonal architecture in PHP
 

Semelhante a PHP e Redis para cache avançado

Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e SphinxElton Minetto
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2PrinceGuru MS
 
PDO: TRABALHANDO COM BANCO DO JEITO CERTO
PDO: TRABALHANDO COM BANCO DO JEITO CERTOPDO: TRABALHANDO COM BANCO DO JEITO CERTO
PDO: TRABALHANDO COM BANCO DO JEITO CERTOPerla Coutinho Barbosa
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPArlindo Santos
 
Programação Multiplataforma em Ambiente Web
Programação Multiplataforma em Ambiente WebProgramação Multiplataforma em Ambiente Web
Programação Multiplataforma em Ambiente WebIsrael Messias
 
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...Felipe Blini
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valorKinn Julião
 
PHPMyadmin - Introdução
PHPMyadmin - IntroduçãoPHPMyadmin - Introdução
PHPMyadmin - IntroduçãoMarco Pinheiro
 
Alta Disponibilidade em Linux com Heartbeat e Drbd
Alta Disponibilidade em Linux com Heartbeat e DrbdAlta Disponibilidade em Linux com Heartbeat e Drbd
Alta Disponibilidade em Linux com Heartbeat e DrbdFrederico Madeira
 
Alta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxAlta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxThiago Paes
 
Apresentação asterisk
Apresentação asteriskApresentação asterisk
Apresentação asteriskVicente Nobre
 
Implementacao de servidores recursivos guia de praticas semcap ceptro br.pdf
Implementacao de servidores recursivos guia de praticas semcap ceptro br.pdfImplementacao de servidores recursivos guia de praticas semcap ceptro br.pdf
Implementacao de servidores recursivos guia de praticas semcap ceptro br.pdfleandrodesousa13
 
Arquitetando Soluções de Dados com PostgreSQL
Arquitetando Soluções de Dados com PostgreSQLArquitetando Soluções de Dados com PostgreSQL
Arquitetando Soluções de Dados com PostgreSQLRaul Oliveira
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super heroElton Minetto
 
Construindo um data warehouse com Pentaho e Docker
Construindo um data warehouse com Pentaho e DockerConstruindo um data warehouse com Pentaho e Docker
Construindo um data warehouse com Pentaho e DockerWellington Marinho
 

Semelhante a PHP e Redis para cache avançado (20)

Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e Sphinx
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
PDO: TRABALHANDO COM BANCO DO JEITO CERTO
PDO: TRABALHANDO COM BANCO DO JEITO CERTOPDO: TRABALHANDO COM BANCO DO JEITO CERTO
PDO: TRABALHANDO COM BANCO DO JEITO CERTO
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHP
 
Programação Multiplataforma em Ambiente Web
Programação Multiplataforma em Ambiente WebProgramação Multiplataforma em Ambiente Web
Programação Multiplataforma em Ambiente Web
 
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
 
Servidores linux
Servidores linuxServidores linux
Servidores linux
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valor
 
Pdo do PHP Palestra
Pdo do PHP PalestraPdo do PHP Palestra
Pdo do PHP Palestra
 
Aula 2
Aula 2Aula 2
Aula 2
 
PHPMyadmin - Introdução
PHPMyadmin - IntroduçãoPHPMyadmin - Introdução
PHPMyadmin - Introdução
 
Asterisk
AsteriskAsterisk
Asterisk
 
Crud
CrudCrud
Crud
 
Alta Disponibilidade em Linux com Heartbeat e Drbd
Alta Disponibilidade em Linux com Heartbeat e DrbdAlta Disponibilidade em Linux com Heartbeat e Drbd
Alta Disponibilidade em Linux com Heartbeat e Drbd
 
Alta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxAlta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com Nginx
 
Apresentação asterisk
Apresentação asteriskApresentação asterisk
Apresentação asterisk
 
Implementacao de servidores recursivos guia de praticas semcap ceptro br.pdf
Implementacao de servidores recursivos guia de praticas semcap ceptro br.pdfImplementacao de servidores recursivos guia de praticas semcap ceptro br.pdf
Implementacao de servidores recursivos guia de praticas semcap ceptro br.pdf
 
Arquitetando Soluções de Dados com PostgreSQL
Arquitetando Soluções de Dados com PostgreSQLArquitetando Soluções de Dados com PostgreSQL
Arquitetando Soluções de Dados com PostgreSQL
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super hero
 
Construindo um data warehouse com Pentaho e Docker
Construindo um data warehouse com Pentaho e DockerConstruindo um data warehouse com Pentaho e Docker
Construindo um data warehouse com Pentaho e Docker
 

Mais de Paulo Victor Gomes

Functional as a service TDC 2020
Functional as a service TDC 2020Functional as a service TDC 2020
Functional as a service TDC 2020Paulo Victor Gomes
 
O mundo do e commerce visto pela ótica do PHP
O mundo do e commerce visto pela ótica do PHPO mundo do e commerce visto pela ótica do PHP
O mundo do e commerce visto pela ótica do PHPPaulo Victor Gomes
 
Essay about event driven architecture
Essay about event driven architectureEssay about event driven architecture
Essay about event driven architecturePaulo Victor Gomes
 

Mais de Paulo Victor Gomes (6)

Functional as a service TDC 2020
Functional as a service TDC 2020Functional as a service TDC 2020
Functional as a service TDC 2020
 
PHP as a Service TDC2019
PHP as a Service TDC2019PHP as a Service TDC2019
PHP as a Service TDC2019
 
PHP as a Service
PHP as a ServicePHP as a Service
PHP as a Service
 
Stacks Cloud - Digital Ocean
Stacks Cloud - Digital OceanStacks Cloud - Digital Ocean
Stacks Cloud - Digital Ocean
 
O mundo do e commerce visto pela ótica do PHP
O mundo do e commerce visto pela ótica do PHPO mundo do e commerce visto pela ótica do PHP
O mundo do e commerce visto pela ótica do PHP
 
Essay about event driven architecture
Essay about event driven architectureEssay about event driven architecture
Essay about event driven architecture
 

PHP e Redis para cache avançado

  • 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. 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. 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. 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. 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. Quem está usando o Redis? Fonte: http://redis.io/topics/whos-using-redis 30/10/2014
  • 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. 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. 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. 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. Console Testando o serviço: redis-cli ping Retorno esperado...
  • 12. Console Testando o serviço: redis-cli ping Retorno esperado... PONG
  • 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]
  • 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. 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. 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. 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. E se o serviço parar? O Redis suporta duas estratégias diferentes de Backup/Restore de dados - Snapshotting - Log appending
  • 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. 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. Snapshotting Também podemos gravar o dataset pelo cliente. - SAVE (Síncrono) - BGSAVE (Assíncrono)
  • 23. Clientes PHP Predis (github.com/nrk/predis) PHPRedis (github.com/nicolasff/phpredis) Rediska (github.com/Shumkov/Rediska) Credis (github.com/colinmollenhour/credis)
  • 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. 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. 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. 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. 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);
  • 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
  • 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.