PHP

Dominando Cache em PHP: Redis, Memcached e Cache de Opcode com OPcache em Projetos Reais

8 min de leitura

Dominando Cache em PHP: Redis, Memcached e Cache de Opcode com OPcache em Projetos Reais

Cache em PHP: Redis, Memcached e OPcache O cache é um dos pilares da otimização de aplicações web modernas. Em PHP, temos três estratégias principais: Redis (cache distribuído com estruturas de dados avançadas), Memcached (cache simples e rápido em memória) e OPcache (cache de opcode do PHP). Cada uma resolve problemas diferentes e, frequentemente, são usadas em conjunto. Entender quando e como aplicar cada uma é essencial para construir sistemas escaláveis e responsivos. A Importância do Cache em Aplicações Reais Sem cache, sua aplicação executa a mesma lógica repetidamente: consultas ao banco de dados, cálculos pesados, processamento de dados. Isso degrada o desempenho exponencialmente conforme o número de usuários cresce. Cache em memória reduz latência de milissegundos para microssegundos, permitindo que aplicações sirvam centenas de requisições por segundo. É especialmente crítico em operações que envolvem I/O (disco, rede, processamento intensivo). --- Redis: Cache Distribuído e Versátil Redis é um banco de dados em memória que funciona como cache distribuído com

<h2>Cache em PHP: Redis, Memcached e OPcache</h2>

<p>O cache é um dos pilares da otimização de aplicações web modernas. Em PHP, temos três estratégias principais: Redis (cache distribuído com estruturas de dados avançadas), Memcached (cache simples e rápido em memória) e OPcache (cache de opcode do PHP). Cada uma resolve problemas diferentes e, frequentemente, são usadas em conjunto. Entender quando e como aplicar cada uma é essencial para construir sistemas escaláveis e responsivos.</p>

<h3>A Importância do Cache em Aplicações Reais</h3>

<p>Sem cache, sua aplicação executa a mesma lógica repetidamente: consultas ao banco de dados, cálculos pesados, processamento de dados. Isso degrada o desempenho exponencialmente conforme o número de usuários cresce. Cache em memória reduz latência de milissegundos para microssegundos, permitindo que aplicações sirvam centenas de requisições por segundo. É especialmente crítico em operações que envolvem I/O (disco, rede, processamento intensivo).</p>

<p>---</p>

<h2>Redis: Cache Distribuído e Versátil</h2>

<p>Redis é um banco de dados em memória que funciona como cache distribuído com suporte a estruturas de dados sofisticadas (strings, hashes, listas, sets, sorted sets). Diferente do Memcached, Redis permite operações atômicas, expiração granular e persistência opcional. É ideal para sistemas que precisam compartilhar cache entre múltiplos servidores.</p>

<h3>Instalação e Conexão Básica</h3>

<pre><code class="language-php">&lt;?php

// Conexão com Redis

$redis = new Redis();

$redis-&gt;connect(&#039;127.0.0.1&#039;, 6379);

// Verificar conexão

if ($redis-&gt;ping()) {

echo &quot;Conectado ao Redis!&quot;;

}

// Armazenar valor simples

$redis-&gt;set(&#039;user:1:name&#039;, &#039;João Silva&#039;, 3600); // Expira em 1 hora

echo $redis-&gt;get(&#039;user:1:name&#039;); // Saída: João Silva

// Incrementar contador

$redis-&gt;incr(&#039;page:views&#039;);

echo $redis-&gt;get(&#039;page:views&#039;); // Saída: 1 (ou valor incrementado)

// Usar hash para dados estruturados

$redis-&gt;hset(&#039;user:2&#039;, &#039;name&#039;, &#039;Maria&#039;, &#039;email&#039;, &#039;maria@example.com&#039;);

$user = $redis-&gt;hgetall(&#039;user:2&#039;);

print_r($user); // Array com name e email

// Limpar chave

$redis-&gt;del(&#039;user:1:name&#039;);</code></pre>

<h3>Cache de Resultados de Banco de Dados</h3>

<pre><code class="language-php">&lt;?php

class UserRepository {

private $redis;

private $pdo;

public function __construct($redis, $pdo) {

$this-&gt;redis = $redis;

$this-&gt;pdo = $pdo;

}

public function getUserById($id) {

$cacheKey = &quot;user:{$id}&quot;;

// Tentar obter do cache

$cached = $this-&gt;redis-&gt;get($cacheKey);

if ($cached !== false) {

return json_decode($cached, true);

}

// Cache miss: buscar do banco

$stmt = $this-&gt;pdo-&gt;prepare(&quot;SELECT * FROM users WHERE id = ?&quot;);

$stmt-&gt;execute([$id]);

$user = $stmt-&gt;fetch(PDO::FETCH_ASSOC);

// Armazenar em cache por 1 hora

if ($user) {

$this-&gt;redis-&gt;setex($cacheKey, 3600, json_encode($user));

}

return $user;

}

public function invalidateUserCache($id) {

$this-&gt;redis-&gt;del(&quot;user:{$id}&quot;);

}

}</code></pre>

<p>---</p>

<h2>Memcached: Simplicidade e Velocidade</h2>

<p>Memcached é um cache distribuído minimalista: apenas armazena pares chave-valor em memória. É extremamente rápido e com overhead mínimo, ideal para aplicações que precisam apenas de cache simples. Não oferece persistência ou estruturas de dados complexas, mas essa simplicidade é sua força — menos código, menos bugs.</p>

<h3>Configuração Básica e Operações</h3>

<pre><code class="language-php">&lt;?php

$memcached = new Memcached();

$memcached-&gt;addServer(&#039;127.0.0.1&#039;, 11211);

// Armazenar dados

$memcached-&gt;set(&#039;product:123&#039;, [

&#039;id&#039; =&gt; 123,

&#039;name&#039; =&gt; &#039;Notebook&#039;,

&#039;price&#039; =&gt; 2500.00

], 1800); // Expira em 30 minutos

// Recuperar dados

$product = $memcached-&gt;get(&#039;product:123&#039;);

echo $product[&#039;name&#039;]; // Saída: Notebook

// Operações em batch (mais eficiente)

$keys = [&#039;product:1&#039;, &#039;product:2&#039;, &#039;product:3&#039;];

$products = $memcached-&gt;getMulti($keys);

// Deletar

$memcached-&gt;delete(&#039;product:123&#039;);

// Verificar status

$stats = $memcached-&gt;getStats();

echo &quot;Itens no cache: &quot; . $stats[0][&#039;curr_items&#039;];</code></pre>

<h3>Cache de Resultados de API Externas</h3>

<pre><code class="language-php">&lt;?php

class WeatherService {

private $memcached;

public function __construct($memcached) {

$this-&gt;memcached = $memcached;

}

public function getWeather($city) {

$cacheKey = &quot;weather:{$city}&quot;;

// Tentar cache primeiro

$weather = $this-&gt;memcached-&gt;get($cacheKey);

if ($weather !== false) {

return $weather;

}

// Cache miss: chamar API

$response = file_get_contents(&quot;https://api.weather.example.com?city={$city}&quot;);

$weather = json_decode($response, true);

// Cachear por 6 horas (reduz custos de API)

$this-&gt;memcached-&gt;set($cacheKey, $weather, 21600);

return $weather;

}

}</code></pre>

<p>---</p>

<h2>OPcache: Cache de Opcode do Motor PHP</h2>

<p>OPcache é diferente: ele não cacheia dados da aplicação, mas sim o código PHP compilado. O PHP é interpretado — cada requisição compila o código-fonte em bytecode (opcode), depois executa. OPcache armazena esse bytecode compilado, eliminando a etapa de compilação em requisições subsequentes. É habilitado por padrão no PHP 5.5+ e oferece ganhos de 20-40% de desempenho com configuração mínima.</p>

<h3>Configuração Recomendada no php.ini</h3>

<pre><code class="language-ini">; Habilitar OPcache

opcache.enable=1

opcache.enable_cli=1

; Tamanho da memória (em MB)

opcache.memory_consumption=128

; Número máximo de scripts em cache

opcache.max_accelerated_files=10000

; Validar scripts a cada N segundos (0 = nunca, em produção)

opcache.revalidate_freq=60

; Estratégia de revalidação (timestamp ou md5)

opcache.validate_timestamps=1

; Interned strings buffer (economiza memória com strings duplicadas)

opcache.interned_strings_buffer=8

; Habilitar JIT compiler (PHP 8+, ganhos até 3x)

opcache.jit=tracing

opcache.jit_buffer_size=100M</code></pre>

<h3>Verificando Status do OPcache</h3>

<pre><code class="language-php">&lt;?php

// Informações sobre o estado do OPcache

if (extension_loaded(&#039;Zend OpcacheExtension&#039;)) {

$status = opcache_get_status();

echo &quot;Memoria usada: &quot; . $status[&#039;memory_usage&#039;][&#039;used_memory&#039;] . &quot; bytes\n&quot;;

echo &quot;Scripts em cache: &quot; . $status[&#039;opcache_statistics&#039;][&#039;num_cached_scripts&#039;] . &quot;\n&quot;;

echo &quot;Taxa de hit: &quot; . $status[&#039;opcache_statistics&#039;][&#039;hits&#039;] /

($status[&#039;opcache_statistics&#039;][&#039;hits&#039;] +

$status[&#039;opcache_statistics&#039;][&#039;misses&#039;]) * 100 . &quot;%\n&quot;;

// Limpar cache (útil após deploy)

opcache_reset();

}</code></pre>

<p>---</p>

<h2>Conclusão</h2>

<p>Dominando esses três mecanismos, você constrói aplicações verdadeiramente escaláveis. <strong>Redis</strong> é sua ferramenta versátil para cache distribuído com estruturas complexas e operações atômicas. <strong>Memcached</strong> brilha em cenários simples onde velocidade bruta é prioridade. <strong>OPcache</strong> é a base — sempre ativo, oferecendo ganhos automáticos de compilação. Use Redis/Memcached para dados da aplicação (resultados de banco, APIs externas) e confie no OPcache para otimização transparente do motor PHP. A combinação desses três gera sistemas que servem milhões de requisições com latência minimal.</p>

<p>---</p>

<h2>Referências</h2>

<ul>

<li><a href="https://redis.io/documentation" target="_blank" rel="noopener noreferrer">Redis Official Documentation</a></li>

<li><a href="https://memcached.org/" target="_blank" rel="noopener noreferrer">Memcached Official Wiki</a></li>

<li><a href="https://www.php.net/manual/en/book.opcache.php" target="_blank" rel="noopener noreferrer">PHP OPcache Manual</a></li>

<li><a href="https://www.oreilly.com/library/view/high-performance-php/9781492044529/" target="_blank" rel="noopener noreferrer">High Performance PHP - Scalable Systems Design</a></li>

<li><a href="https://www.manning.com/books/redis-in-action" target="_blank" rel="noopener noreferrer">Redis in Action</a></li>

</ul>

Comentários

Mais em PHP

Guia Completo de GraphQL com PHP: Conceitos e Implementação Básica
Guia Completo de GraphQL com PHP: Conceitos e Implementação Básica

O que é GraphQL e por que usar com PHP GraphQL é uma linguagem de query para...

O que Todo Dev Deve Saber sobre Camada Model: Repositórios e Mapeamento de Dados
O que Todo Dev Deve Saber sobre Camada Model: Repositórios e Mapeamento de Dados

Compreendendo a Camada Model: Fundamentos A camada Model é o coração de qualq...

Dominando Herança e Polimorfismo em PHP em Projetos Reais
Dominando Herança e Polimorfismo em PHP em Projetos Reais

Herança em PHP: Fundamentos e Prática Herança é um dos pilares da Programação...