Cache de objetos do WordPress: Redis, Memcached e APIs nativas

Publicados: 2017-11-04

Sites WordPress de nível empresarial que podem ser dimensionados à vontade, precisam de um mecanismo de cache persistente além de páginas e imagens, um mecanismo que pode armazenar em cache objetos PHP reais. Embora o WordPress forneça um mecanismo de cache de objetos por meio do WordPress Object Cache, existem outras soluções que oferecem grande alavancagem e poder. Mas antes de entrarmos em tudo isso, primeiro, precisamos ver o que é cache de objetos e como ele funciona em PHP.

O que é cache de objetos?

PHP é uma linguagem orientada a objetos. Ele usa o paradigma Object para estruturar o código. Como resultado, seu site WordPress consiste em muitos objetos PHP diferentes que são constantemente criados, instanciados e destruídos (pelo gerenciador de memória). Criar e destruir objetos tem uma sobrecarga de custos, principalmente se eles forem muitos. No entanto, a maioria deles tende a ser muito reutilizada, pois representam funcionalidades centrais. Isso significa que cada vez que o aplicativo precisar deles novamente, ele precisará instanciá-los desde o início.

E se você pudesse armazenar em cache um objeto instanciado usado com frequência para não precisar destruí-lo e criá-lo o tempo todo?

Você pode usar a função serialise() do PHP para converter um objeto ou uma primitiva em uma representação numérica (byte blob) que pode ser armazenada na memória ou no disco para acesso posterior. Em seguida, você calcula o número de hash do blob de bytes usando a função hash() e armazena ambos. O hash como chave e o blob de bytes como valor. Para recuperá-lo, você usa o número de hash calculado do blob de bytes que foi inicialmente armazenado como uma chave. Você pode transformar qualquer coisa (String, Integer, Object, Boolean, Array, etc) em uma representação armazenável de um valor dessa maneira.

Exemplo:

$serialized = serialize( array ( 'test' ));

Execute a operação inversa, com unserialize():

$original = unserialize ( $serialized );

Em geral, existem três maneiras de armazenar objetos em cache: usando o WordPress Object Cache nativo, a API Transients ou um armazenamento externo de valores-chave como Redis ou Memcached.

Cache de objetos do WordPress

O WordPress oferece duas APIs de cache de objetos: o WordPress Object Cache nativo e a API Transients. Eles são idênticos e, embora isso possa causar confusão, há uma lógica por trás disso.

O Cache de Objetos do WordPress nativo pode armazenar objetos e primitivos no cache, mas não de maneira persistente por padrão. Isso significa que o armazenamento em cache acontece na memória e os objetos armazenados em cache não vivem além do ciclo de vida da solicitação. Portanto, você não pode compartilhar seus objetos em cache em diferentes carregamentos de página. Você precisa fornecer sua própria implementação de loja com o uso de Drop-Ins, que são plugins “avançados” que podem estender a funcionalidade do WordPress. Você pode vê-los em seu painel do WordPress, na lista de plugins:

Drop-ins do WordPress

A API de Transients, por outro lado, funciona fora da caixa. Você pode salvar variáveis, arrays, objetos vinculados com uma data de expiração diretamente em um banco de dados e ter um cache de objetos persistente. No entanto, o problema é que, quando seus objetos em cache expiram, eles permanecem no banco de dados ocupando espaço. Isso significa que há uma sobrecarga extra gasta na manutenção do banco de dados, podando de vez em quando os objetos expirados.

O WordPress detecta se você implementou seu próprio cache de objeto persistente e, quando descobre que esse é o caso, as chamadas para a API Transients são ignoradas e roteadas para o WordPress Object Cache (e, portanto, a razão para que sejam idênticas).

Os desenvolvedores podem implementar seu próprio cache de objetos, usar um plugin WordPress (mais sobre isso posteriormente) ou nossa própria implementação, se for um cliente Pressidium. Não temos o cache de objetos ativado por padrão, pois isso pode causar penalidades de desempenho se usado na situação errada. Não existe uma solução “tamanho único” quando se trata de cache de objetos em sites WordPress.

Redis e Memcached

Os armazenamentos de valores-chave não usam tabelas e tipos de dados predefinidos para armazenar informações em registros como em RDBMS. Eles são projetados para armazenar e recuperar pares chave/valor, como nas estruturas de dados do dicionário que você encontra em linguagens de programação.

Um bom exemplo dessa loja é o Redis. Além das estruturas de dados do dicionário, ele suporta uma infinidade de outras, incluindo as avançadas, como conjuntos classificados com consultas de intervalo e índices geoespaciais com consultas de raio. Ele oferece cache de objeto persistente .

Redis

O Redis não é apenas um armazenamento ou cache de valor-chave. Ele suporta replicação de dados, scripts, alta disponibilidade em uma configuração de cluster. Você também pode ajustar o nível de persistência em disco desejado. O bom do Redis é que, se você reiniciar, a maior parte do cache ainda estará no disco, com os dados perdidos sendo apenas uma pequena fração. O problema é que ao reiniciar, o servidor teria que reconstruir o cache e isso na maioria das vezes aumenta a carga. Com o Redis isso não acontece. Além disso, os objetos expirados são excluídos imediatamente do banco de dados. Não há tempo de sobrecarga de gerenciamento lá também.

O Redis Labs tem uma excelente página mostrando os casos de uso do Redis na empresa: eles variam de Very Large DataSets a pesquisa de texto completo, Real-Time Series, integração Spark e muito mais.

Embora todos esses recursos custem em complexidade e talvez em velocidade em alguns casos, otimizar seu código Redis Drop-In pode obter alguns ganhos. Não se esqueça do fato de que o Redis faz cache de objetos persistente , algo que o Memcached não faz, embora seja muito mais simples de usar.

Memcached

O Memcached é um sistema de cache de objetos de alto desempenho na memória que, de acordo com o site oficial, foi projetado especificamente para acelerar aplicativos da Web dinâmicos e aliviar a carga do banco de dados. Também é muito mais simples e direto de usar que o Redis.

Por ter sido projetado especificamente para fazer cache de objetos para páginas da Web, e o fato de usar um banco de dados na memória o torna a solução de cache de objetos mais rápida do mercado. No entanto, como mencionamos anteriormente, se seu servidor reiniciar, seu cache estará fora. E até que seja reconstruído, você provavelmente terá uma carga maior. Mas como os criadores dizem: “pense nisso como uma memória de curto prazo para o seu site”, então depende do que você quer fazer em primeiro lugar.

Como o Memcached usa um banco de dados na memória para manter o cache, ele é muito eficiente no armazenamento em cache de consultas SQL, saídas de chamadas de função e outros.

Plug-ins do WordPress

  • WP Redis, o plugin oficial do Redis para WordPress. Suporta WP-CLI, clustering e replicação.
  • Redis Object Cache Outro plugin Redis de back-end para WordPress.
  • Cache de objetos do Memcached, o back-end do Memcached.
  • Delete Expired Transients, este plugin exclui objetos de transientes expirados do banco de dados. Ele suporta multisites também!

Como executar benchmarks

O objetivo do nosso artigo é deixá-lo empolgado com o cache de objetos e começar a mexer por conta própria. Você pode tentar várias implementações de cache persistente e ver como seu aplicativo se comporta. Você pode usar a função microsecond() do PHP para fazer benchmark de chamadas. Por exemplo: Chame microsecond() antes e depois de chamar wp_cache_get() , subtraia os valores e armazene o resultado. Faça isso para várias implementações de cache e veja em quais casos você percebe um ganho de desempenho.

No Pressidium, não temos o cache de objetos habilitado por padrão e, embora isso seja algo que possa ser solicitado, geralmente não aconselhamos a favor desde o início. Realizamos testes e garantimos que seu site obterá benefícios com isso.

Conclusão

Digamos que para renderizar uma página o aplicativo precisa ler 2.000 objetos transitórios. Isso significa 2.000 leituras no banco de dados. Usando um sistema de cache de objeto persistente, essas 2.000 leituras são transferidas para o armazenamento de valor-chave. Se você usar o memcached, corre o risco de perder todo o seu cache em uma reinicialização repentina. Em geral, o Redis pode não ser tão rápido quanto o Memcached, mas seus recursos corporativos e persistência beneficiam você a longo prazo.

No entanto, um tamanho não serve para todos! Por exemplo, vimos instâncias do Redis que realmente deixaram os sites mais lentos e, em outros casos, eles os aceleraram incrivelmente. Isso tem a ver com vários objetos que seu aplicativo usa: em geral, se seu aplicativo usa alguns (digamos uma dúzia), você não obterá muito benefício com o cache de objetos e, na pior das hipóteses, você tem sobrecarga de rede. Se, no entanto, seu aplicativo estiver na casa das centenas, pode valer a pena dar uma olhada.