Cache em PHP: Redis, Memcached e soluções integradas: nível avançado
No desenvolvimento web moderno, o desempenho da aplicação impacta diretamente a experiência do usuário, a conversão e a classificação nos motores de busca. O cache é uma das formas mais eficazes de acelerar aplicações PHP, reduzir a carga no banco de dados e diminuir o tempo de resposta. Em nível avançado, o desenvolvedor precisa não apenas conectar Redis ou Memcached, mas também entender estratégias de invalidação, serialização de dados, ajuste de configuração e escolha da ferramenta certa para cada tarefa específica. Neste artigo, abordaremos três abordagens principais: Redis, Memcached e soluções integradas do PHP (OPcache, APCu), além de exemplos práticos e antipadrões.
1. Soluções integradas: OPcache e APCu
Antes de conectar serviços externos, vale a pena utilizar ao máximo o que já existe no PHP. Os mecanismos integrados operam no nível do interpretador e não exigem instalação de software adicional.
1.1. OPcache
OPcache (anteriormente Zend Optimizer+) compila e armazena scripts PHP em bytecode na memória compartilhada. Isso elimina a necessidade de análise e compilação do código a cada requisição. Para a maioria dos projetos em produção, o OPcache está habilitado por padrão, mas sua configuração é crítica.
Configurações recomendadas no php.ini:
opcache.enable=1opcache.memory_consumption=128opcache.interned_strings_buffer=16opcache.max_accelerated_files=10000opcache.revalidate_freq=2opcache.fast_shutdown=1Importante: Em modo de desenvolvimento, defina opcache.revalidate_freq=0 e opcache.validate_timestamps=1 para que as alterações nos arquivos sejam aplicadas instantaneamente.
1.2. APCu (APC User Cache)
APCu fornece um cache de usuário na memória compartilhada. É ideal para armazenar dados pequenos e frequentemente solicitados: resultados de cálculos, configurações, fragmentos de HTML.
Exemplo de uso do APCu:
// Salvar dados no cache por 300 segundosapcu_store('user_profile_' . $userId, $profileData, 300);
// Obter dadosif (apcu_exists('user_profile_' . $userId)) { $profile = apcu_fetch('user_profile_' . $userId);} else { // Gerar dados $profile = getUserProfileFromDB($userId); apcu_store('user_profile_' . $userId, $profile, 300);}Limitações: APCu funciona apenas em um único servidor. Em arquiteturas em cluster, ele não é sincronizado entre os nós, tornando-o inadequado para sistemas distribuídos.
2. Memcached: simplicidade e velocidade
Memcached é um sistema de cache distribuído em memória RAM. Sua principal vantagem é a alta velocidade e simplicidade. Memcached não suporta persistência (os dados são armazenados apenas em RAM) e não possui mecanismos de replicação integrados, tornando-o ideal para cache temporário.
2.1. Conexão e uso básico
// Estabelecer conexão$memcached = new Memcached();$memcached->addServer('localhost', 11211);
// Salvar dados com TTL de 600 segundos$memcached->set('user_123', ['name' => 'João', 'email' => 'joao@example.com'], 600);
// Obter dados$user = $memcached->get('user_123');if ($memcached->getResultCode() === Memcached::RES_NOTFOUND) { // Dados não encontrados — carregar do BD $user = fetchUserFromDB(123); $memcached->set('user_123', $user, 600);}2.2. Técnicas avançadas com Memcached
- CAS (Check And Set): Permite atualizar dados atomicamente, evitando condições de corrida.
- Multi-get: Obtenção em lote de chaves reduz o número de chamadas de rede.
- Incrementos: Para contadores (ex.: número de visualizações), use
$memcached->increment().
Blogs
Book Recommendations
Leia também
Rust para programação de sistemas: por que um desenvolvedor Python deveria dar uma olhada
Campos e propriedades em C#: qual a diferença e o que está por baixo dos panos?
Clean Code em PHP: princípios para escrever código legível
GraphQL API com Swift: tutorial passo a passo para iniciantes
Metaprogramação em Swift: a magia do código que escreve código