
Otimizando a Performance do Laravel com Pacote Query From Cache
Neste artigo, vamos explorar como melhorar significativamente a performance de aplicações Laravel utilizando o pacote Query From Cache, uma solução elegante para cache de consultas eloquentes que reduz o tempo de resposta e diminui a carga no banco de dados.
Introdução
Em aplicações Laravel de médio a grande porte, as consultas ao banco de dados frequentemente se tornam gargalos de performance. O framework já oferece algumas ferramentas para lidar com cache, mas implementá-las em cada ponto de consulta pode ser trabalhoso. É aqui que o pacote Query From Cache entra como uma solução eficiente e de fácil implementação.
O que é o Query From Cache?
O Query From Cache é um pacote Laravel que simplifica o processo de cache de resultados de consultas diretamente dos seus modelos Eloquent. Ele armazena automaticamente os resultados dos métodos dos modelos e oferece ações para atualizar ou limpar o cache com mudanças mínimas no código.
Principais Características:
- Cache Automático: Basta chamar um método com o sufixo
FromCache
para ter seu resultado armazenado em cache. - Ações de Cache Personalizadas: Utilize ações como
CREATE
,REFRESH
eFORGET
para controlar o comportamento do cache. - Configurável: Ajuste facilmente o prefixo do cache, tempo de expiração e o armazenamento através da configuração.
- Integração Simples: Use uma trait em seus modelos para habilitar o cache sem modificar seus métodos existentes.
Instalação e Configuração
Para começar a utilizar o Query From Cache, siga estes passos:
1. Instale o pacote via Composer
composer require caiquemcz/query-from-cache
2. Registre o Service Provider (opcional para Laravel 5.5+)
Se você não estiver usando o auto-discovery de pacotes, adicione o provider no arquivo config/app.php
:
'providers' => [ // ... CaiqueMcz\QueryFromCache\QueryFromCacheServiceProvider::class, ],
3. Publique o arquivo de configuração
php artisan vendor:publish --tag=config
Isso criará um arquivo query-from-cache.php
na pasta config
.
4. Configure conforme necessário
O arquivo de configuração publicado permite ajustar:
<?php use Illuminate\Support\Facades\Cache; return [ // Prefixo opcional para adicionar às suas chaves de cache 'prefix' => null, // Tempo padrão de cache em minutos 'time_minutes' => 60, // Classe de armazenamento de cache (por padrão, usando a fachada Cache do Laravel) 'class' => Cache::class, ];
Como Implementar em Seus Modelos
A implementação do Query From Cache em seus modelos existentes é muito simples e requer apenas algumas linhas de código:
1. Adicione a trait HasQueryFromCache ao seu modelo
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use CaiqueMcz\QueryFromCache\Traits\HasQueryFromCache; class User extends Model { use HasQueryFromCache; // Seu código do modelo... public function ativos() { // Sua lógica de consulta, por exemplo: return $this->where('ativo', 1)->get(); } }
2. Chamando métodos com cache
Depois de incluir a trait, você pode chamar a versão em cache de qualquer método. A trait intercepta chamadas para
métodos com o sufixo FromCache
:
use \CaiqueMcz\QueryFromCache\Enums\CacheAction; // Uso básico: armazena em cache o resultado do método "ativos" $usuarios = User::ativosFromCache(); // Especificando tempo: armazena em cache por 30 minutos $usuarios = User::ativosFromCache(30); // Atualizar o cache: limpa e recria a entrada do cache $usuarios = User::ativosFromCache(30, CacheAction::REFRESH()); // Remover do cache: limpa a entrada do cache $result = User::ativosFromCache(30, CacheAction::FORGET());
Nota: O primeiro parâmetro é o tempo de expiração do cache em minutos. O segundo parâmetro opcional permite especificar uma ação de cache (CREATE por padrão).
Como Funciona por Trás dos Bastidores
Quando você chama um método com o sufixo FromCache
, a trait executa os seguintes passos:
- Valida o nome do método (ex:
ativosFromCache
se tornaativos
). - Verifica se existe uma entrada de cache (usando uma chave gerada como:
{prefixo}{metodo}:{tabela}:{chave_modelo}
). - Se o cache existir e nenhuma atualização for solicitada, retorna o resultado armazenado.
- Caso contrário, chama o método original (
ativos()
), armazena seu resultado em cache e então o retorna. - Se a ação
FORGET
for especificada, limpa a entrada do cache.
Cenários de Otimização de Performance
O uso do Query From Cache é especialmente benéfico nos seguintes cenários:
1. Consultas frequentes e pouco mutáveis
Ideal para dados que são acessados com frequência, mas atualizados raramente, como:
- Listas de categorias
- Configurações do sistema
- Menus dinâmicos
- Dados de referência (estados, países, etc.)
2. Consultas complexas e custosas
Consultas que envolvem múltiplos joins, agregações ou cálculos complexos se beneficiam significativamente do cache:
// Sem cache - executa a consulta complexa toda vez $relatorio = RelatorioVendas::dadosConsolidadosMensal(); // Com cache - executa apenas na primeira vez ou quando expirar $relatorio = RelatorioVendas::dadosConsolidadosMensalFromCache(120); // cache por 2 horas
3. APIs e endpoints de alto tráfego
Para APIs que recebem muitas requisições para os mesmos dados:
public function listaProdutos() { return response()->json( Produto::listaProdutosAtivosFromCache(60) // cache por 1 hora ); }
4. Dashboards e estatísticas
Dados de dashboards e estatísticas geralmente são computacionalmente intensivos e ideais para cache:
// Método no modelo public function estatisticasUsuarios() { return DB::table('users') ->select(DB::raw('COUNT(*) as total'), DB::raw('SUM(CASE WHEN last_login_at > DATE_SUB(NOW(), INTERVAL 7 DAY) THEN 1 ELSE 0 END) as ativos_7_dias')) ->first(); } // No controller $stats = User::estatisticasUsuariosFromCache(30); // cache por 30 minutos
Estratégias de Invalidação de Cache
Tão importante quanto implementar o cache é saber quando invalidá-lo. Aqui estão algumas estratégias:
1. Invalidação baseada em eventos
Use observers ou events do Laravel para limpar o cache quando dados relevantes forem modificados:
// Em um observer de produto public function updated(Produto $produto) { Produto::listaProdutosAtivosFromCache(60, CacheAction::FORGET()); }
2. Invalidação programada
Para dados que precisam ser atualizados em intervalos regulares, use o scheduler do Laravel:
// Em App\Console\Kernel.php protected function schedule(Schedule $schedule) { $schedule->call(function () { Estatistica::dadosGeraisFromCache(60, CacheAction::REFRESH()); })->hourly(); }
3. Invalidação sob demanda
Em painéis administrativos, ofereça botões para que administradores possam atualizar caches específicos:
public function refreshDashboardCache() { Dashboard::dadosPrincipaisFromCache(60, CacheAction::REFRESH()); return back()->with('message', 'Cache do dashboard atualizado com sucesso!'); }
Monitoramento e Debugging
Para garantir que o cache esteja funcionando como esperado, é recomendável monitorar sua eficácia:
1. Use ferramentas de debugging
Laravel Debug Bar ou Telescope são excelentes para verificar quais consultas estão sendo executadas vs. recuperadas do cache.
2. Implemente logs estratégicos
// No método que usa cache $cached = Cache::has("prefixativos:{$this->getTable()}:{$this->getKey()}"); Log::debug("Cache hit for 'ativos'", ['hit' => $cached]);
3. Métricas de performance
Implemente métricas para comparar tempos de resposta antes e depois da implementação do cache.
Considerações Importantes
- Memória vs. Velocidade: Cache utiliza recursos de memória/disco. Equilibre o tempo de expiração com a disponibilidade de recursos.
- Consistência de Dados: Para dados que mudam frequentemente, use tempos de cache mais curtos ou mecanismos de invalidação eficientes.
- Teste em Produção: O comportamento do cache pode variar entre ambientes. Monitore o desempenho em produção.
- Cache Distribuído: Para aplicações em múltiplos servidores, considere usar Redis ou Memcached como driver de cache.
Conclusão
O pacote Query From Cache oferece uma maneira elegante e direta de implementar cache em aplicações Laravel, reduzindo significativamente o tempo de resposta e a carga no banco de dados. Com apenas algumas linhas de código, é possível transformar consultas lentas em respostas rápidas, melhorando a experiência do usuário e reduzindo custos de infraestrutura.
A implementação gradual do cache, começando pelas consultas mais pesadas e frequentes, pode trazer melhorias de performance imediatas sem necessidade de grandes refatorações no código existente.
Veja também

Um certificado SSL é uma garantia de compra segura?
Comprar na internet tornou-se algo normal, e corri...

Aprendizado e Ética em IA: Lições do Caso SimSimi
Em meados de 2016, tive contato com um chatbot que...

Black Hat SEO em sites de órgãos públicos
Muitos sites de órgãos públicos vêm sendo inva...