Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Estratégia de cache, quando o cache se torna inútil?


Use o cache de consulta embutido do MySQL em vez de tentar mantê-lo você mesmo. Ele limpará automaticamente as consultas em cache nas tabelas quando elas forem gravadas. Além disso, ele funciona na memória, então deve ser muito eficiente ...

Além disso, não apenas cache de consultas. Tente armazenar em cache segmentos inteiros do aplicativo em diferentes estágios do ciclo de renderização. Assim, você pode deixar o MySQL armazenar em cache as consultas e, em seguida, armazenar em cache cada visualização individual (renderizada), cada bloco individual e cada página. Em seguida, você pode escolher se deseja ou não extrair do cache com base na solicitação.

Por exemplo, um usuário não logado pode obter a página inteira diretamente do cache. Mas um usuário logado pode não conseguir (devido ao nome de usuário, etc). Então, para ele, você pode renderizar 1/2 das suas visualizações na página do cache (já que elas não dependem do objeto do usuário). Você ainda obtém o benefício do cache, mas ele será escalonado com base na necessidade.

Se você está realmente esperando muito tráfego, definitivamente vale a pena dar uma olhada no Memcached . Deixe o MySQL armazenar suas consultas para você e, em seguida, armazene todos os itens de cache do usuário no memcache...

Editar: Para responder à sua edição:

Os sistemas de arquivos podem ficar lentos se um único diretório crescer. Contanto que você esteja "namespaceing" por diretório (para que cada diretório tenha apenas uma pequena parte dos arquivos de cache), você deve estar bem desse ponto de vista. Quanto ao limite exato, ele realmente dependerá do seu hardware e sistema de arquivos mais do que qualquer outra coisa. Eu sei que o EXT3 fica bastante lento se houver uma carga de arquivos em um único diretório (tenho diretórios com literalmente centenas de milhares de arquivos e pode levar até meio segundo para simplesmente stat() um dos arquivos, muito menos fazer qualquer tipo de listagem de diretório)...

Mas perceba que, se você adicionar outro servidor, terá duplicação de cache (o que não é uma coisa boa) ou terá que reescrever toda a sua camada de cache. Existe uma razão para não usar o Memcached direito desde o início?

Editar 2: Para responder à sua última edição:

Ainda é muito difícil ligar. Eu tenho um aplicativo que possui um banco de dados com cerca de 1,5 bilhão de linhas (crescendo em torno de 500k por dia). Não usamos nenhum cache nele porque não temos problemas de simultaneidade. E mesmo se o fizéssemos, seria melhor lançar mais servidores MySQL nele em vez de adicionar cache, já que qualquer forma de cache teria uma taxa de acerto tão baixa que não valeria a pena o tempo de desenvolvimento para adicioná-lo.

E essa é a razão pela qual sou tão inflexível sobre não armazenar em cache para velocidade. Sempre haverá um objeto que não está no cache. Portanto, se você acessar uma página com um desses objetos, ela ainda precisará ser rápida. Como regra geral, tento armazenar em cache qualquer coisa que será acessada novamente nos próximos minutos (mantenho um tempo de vida de cerca de 5 minutos em produção em outros aplicativos de qualquer maneira). Portanto, se os itens não estiverem recebendo mais do que alguns acertos nesse período de tempo, ou a taxa de acertos for muito baixa (menos de 90%), não me incomodo em armazenar em cache esse item ....