Cache em PHP: Redis, Memcached e soluções integradas
Cache é uma das ferramentas-chave para melhorar o desempenho de aplicações web. Em PHP, o desenvolvedor tem acesso a várias abordagens: desde um simples cache de arquivos até poderosos sistemas in-memory, como Redis e Memcached. Neste artigo, vamos detalhar cada opção, fornecer exemplos de código e ajudar você a escolher a solução ideal para o seu projeto.
Por que usar cache?
Sem cache, cada requisição ao site pode resultar em cálculos repetidos, consultas ao banco de dados ou APIs externas. O cache permite salvar o resultado de uma operação cara e entregá-lo a partir de um armazenamento rápido. Principais cenários de uso:
- Salvar resultados de consultas SQL (especialmente agregações e JOINs).
- Cache de fragmentos HTML (por exemplo, menus, barras laterais).
- Armazenamento de sessões de usuários.
- Cache de respostas de APIs externas.
1. Redis — o rei do cache in-memory
Redis é um armazenamento de dados em memória de alto desempenho, que suporta estruturas de dados: strings, listas, hashes, conjuntos. Para PHP, existem vários clientes, os mais populares são predis/predis (PHP puro) e phpredis (extensão em C).
Instalação
composer require predis/predisExemplo: cache do resultado de uma consulta ao banco de dados
<?phprequire 'vendor/autoload.php';
use Predis\\Client;
$redis = new Client([ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379,]);
function getUsersFromDb() { // Simulação de consulta demorada sleep(2); return ['user1', 'user2', 'user3'];}
$cacheKey = 'users:all';$cached = $redis->get($cacheKey);
if ($cached) { $users = json_decode($cached, true); echo "Do cache: ";} else { $users = getUsersFromDb(); $redis->setex($cacheKey, 3600, json_encode($users)); // TTL 1 hora echo "Do banco: ";}
print_r($users);Principais recursos do Redis:
setex()— definir chave com tempo de vida (TTL).expire()— definir TTL para uma chave existente.del()— excluir chave.incr()— incremento atômico (contadores).
2. Memcached — simplicidade e velocidade
Memcached é outro sistema in-memory popular, mas ao contrário do Redis, ele suporta apenas valores string e não possui estruturas de dados integradas. No entanto, para cache simples, ele funciona mais rápido devido ao minimalismo.
Instalação da extensão
sudo apt install php-memcached# ou via pecl:pecl install memcachedExemplo: cache de fragmento HTML
<?php$memcached = new Memcached();$memcached->addServer('127.0.0.1', 11211);
function renderMenu() { // Geração cara do menu return '<nav><ul><li>Início</li></ul></nav>';}
$menuHtml = $memcached->get('menu:main');if ($menuHtml === false) { $menuHtml = renderMenu(); $memcached->set('menu:main', $menuHtml, 600); // TTL 10 minutos}
echo $menuHtml;Importante: Memcached não suporta TTL em segundos por padrão — o tempo é definido em segundos (número inteiro). Se for passado 0, o cache será armazenado para sempre.
3. APCu — cache integrado ao PHP
APCu (Alternative PHP Cache) é uma extensão para cache de dados na memória compartilhada de um único servidor. Ideal para aplicações de página única e projetos pequenos.
Instalação
sudo apt install php-apcuExemplo: cache de configuração
<?php$configKey = 'app:config';
if Também na biblioteca
ORM para JavaScript (Node.js): comparação entre Sequelize, TypeORM, Prisma
clinic.js — Monitoramento de aplicações TypeScript
Cliente Redis para C# (.NET): StackExchange.Redis — conexão e exemplos
Moshi para Kotlin: guia completo com exemplos práticos
EventKit para Swift: guia completo com exemplos práticos