Performance

cache:clean ou cache:flush no Magento 2: a diferença real

Os dois comandos parecem sinônimo e a documentação da Adobe é curta demais. A diferença aparece quando a loja divide o Redis com a sessão do cliente ou com outra instalação.

Por Roger Takemiya · Publicado em · 4 min de leitura

Dia de deploy, alguém digita cache:flush por costume, e cinco minutos depois começam as reclamações: cliente perdeu o carrinho no meio da compra. Ou pior, a outra loja do mesmo servidor ficou lenta sem motivo aparente.

Os dois comandos limpam cache. Só que um deles não sabe onde termina o Magento e onde começa o resto.

A diferença em uma linha

A documentação da Adobe é direta ao ponto. Limpar um tipo de cache "não afeta outros processos ou aplicações, porque limpa apenas o cache que o Commerce usa". Já o flush "esvazia o armazenamento de cache, o que pode afetar outros processos e aplicações que usem o mesmo armazenamento".

No código a coisa fica mais concreta. O cache:clean chama cleanType() para cada tipo, e isso vira uma limpeza por tag no frontend do cache. O cache:flush pega o backend por baixo e chama clean() nele, sem tag nenhuma — modo "apague tudo".

cache:cleancache:flush
Alcanceas entradas com a tag do tipoo armazenamento inteiro
No Redisremove chave por chaveFLUSHDB
Vizinho no mesmo bancointactoapagado junto

Por que isso derruba o vizinho

O backend Redis do Magento é o Cm_Cache_Backend_Redis. Quando ele recebe o modo "apague tudo", a implementação é literalmente uma linha: flushDb(). O Redis não pergunta de quem é cada chave — ele esvazia o banco.

Se a instalação seguiu o caminho preguiçoso e colocou cache, full page cache e sessão no mesmo database, o cache:flush apaga a sessão de todo mundo que está comprando naquele momento. Se duas lojas dividem o mesmo banco, uma derruba a outra.

Conferir leva dez segundos. No app/etc/env.php:

grep -n "'database'" app/etc/env.php

Se os números repetirem, ou se não houver número nenhum (todo mundo caiu no banco 0), você tem o problema. E do lado do Redis dá para ver o estrago antes de acontecer:

redis-cli INFO keyspace

Quando o flush é necessário mesmo

Existe caso legítimo, e ele não é raro. Quando a loja usa cache em dois níveis — o RemoteSynchronizedCache, com uma camada local em disco na frente do Redis —, a camada local não é etiquetada por tag. Uma limpeza por tag não alcança ela, e a entrada velha continua sendo servida.

Está escrito em comentário no próprio Manager.php do framework: o flush precisa purgar o armazenamento inteiro porque uma limpeza por tag é rebaixada e não chega no nível local. Sintoma típico: você roda cache:clean, limpa de novo, e o bloco antigo insiste em aparecer. Aí é flush.

Outro caso é depois de trocar a configuração do próprio cache: mudou prefixo, mudou banco, mudou de Redis para arquivo. Sobra lixo que não pertence a tag nenhuma.

O que eu uso no dia a dia

Regra que aplico em todo cliente: cache:clean por padrão, e sempre nomeando o tipo. Trocou um di.xml? bin/magento cache:clean config. Mexeu num template? block_html e full_page. Limpar os dezoito tipos porque você mexeu em um só é jogar fora cache quente à toa e deixar a loja lenta por vários minutos.

bin/magento cache:clean config block_html full_page

Um detalhe que vale saber: os dois comandos disparam a purga do Varnish quando o full_page está envolvido. O cache:clean dispara o evento adminhtml_cache_flush_system e o cache:flush dispara o adminhtml_cache_flush_all — os dois são ouvidos pelo módulo de invalidação e mandam o PURGE. Então não é o flush que "limpa o Varnish e o clean não": ambos limpam.

Guarde o cache:flush para os dois casos da seção anterior, e antes de rodar confira se o Redis de sessão está em outro banco. Como separar cache, FPC e sessão está no guia de performance e Core Web Vitals.

Perguntas rápidas

cache:flush apaga o cache de página do Varnish também?

Sim, e o cache:clean também. Os dois disparam um evento que o módulo de invalidação escuta para mandar a purga ao Varnish quando o tipo full_page está incluído.

Rodar cache:flush pode derrubar a loja?

Derrubar não, mas causa um pico feio. Toda página passa a ser gerada do zero até o cache reencher, e em loja com tráfego isso vira lentidão e às vezes 502. Em horário de pico, prefira limpar só os tipos que você mexeu.

Preciso de cache:flush depois do setup:upgrade?

Não precisa. O setup:upgrade já invalida o que muda de estrutura, e um cache:clean cobre o resto. O flush ali só serve para prolongar a janela de deploy.

Pra conferir na fonte

  1. Manage the cache — clean vs. flush — Adobe Experience League
  2. Cache options and types — Adobe Experience League
  3. Framework App/Cache/Manager.php — GitHub
  4. Cm_Cache_Backend_Redis — clean() e flushDb() — GitHub

cache redis cli

Precisa de um orçamento? Ficarei feliz em ajudar. Clique Aqui