[Dúvida] Cache
Cache
Recentemente li um pouco sobre cache, e como ele pode melhorar a performance de sites. Mas surgiram algumas dúvidas(algumas bem básicas, já que sou novo no assunto), as quais eu gostaria de compartilhar aqui com vocês.
A partir de quando usar cache.
A primeira dúvida que tive é a partir de qual tamanho de aplicação devo usar cache. Existe algum cálculo para com base no tráfego e no número de requisições ao banco de dados, o qual a partir dele deve-se usar cache?
Cache caseiro
Li também sobre algumas ferramentas para cache, como o Redis e o memcache. Então me surgiu uma dúvida, já que estes programas armazenam dados em memória RAM, não seria possível criar um sistema de cache caseiro usando arquivos. Vi isso em um artigo de blog que me chamou atenção: http://blog.thiagobelem.net/criando-um-sistema-de-cache-no-php. Isso funciona?
A partir de quando usar cache.
Essa é fácil de responder: depende.
Sempre ele. Não tem como ser diferente. Não é tão fácil responder de forma universal. E mesmo que pareça fácil, provavelmente é um erro. Até mesmo medir em alguns casos pode ser difícil.
O cache não é tão milagroso quanto algumas pessoas pensam. Gerenciá-lo não é simples e custa caro.
Me lembro do caso do Stack Overflow, onde tem alguns dos melhores desenvolvedores que pode encontrar e usar cache em todo canto, por isso eles conseguem entrar tudo muito rápido com pouco infra. Até que um dia descobriram que em várias situações o cache estava atrapalhando. Confiaram na intuição e ela não se comprovou. Tiraram e ficou melhor.
Então é o de sempre: até que você comprove que alguma complexidade inserida dê um resultado que se paga, não use.
There are only two hard things in Computer Science: cache invalidation and naming things.
-- Phil Karlton
Cache é difícil e pode criar problemas, então estude muito, saiba usar, mas evite sempre que possível. Precisa ser um ganho muito grande para usar. E na maioria dos sistemas de aplicações ele não ajuda tanto assim. Mesmo em sistemas que trabalham com volume de acesso muito grande que compense, esse volume precisa ter um certo padrão.
Não sei todos os detalhes, mas o Google não se beneficiará de usar cache em qualquer busca que alguém faça nele. Não sei nem mesmo se tem de forma seletiva.
Observar a relação entre a escrita e a leitura é importante.
Existem algumas situações que podem ganhar o cache com custo muito baixo, então ele pode ser tornar mais viável.
Não é caro fazer um protótipo para testar, mas é caro colocar no código principal e passar a ter que dar manutenção daquilo. Pense duas vezes.
Então faça sem. Se o sistema foi bem escrito será fácil mudar depois para agregar o cache se ele for necessário e for possível ter ganho mensuráveis que há ganho na maioria das situações.
Lembre-se que os bancos de dados já possuem um sistema sofisticadíssimo de cache, e na maioria dos casos é suficiente.
Cuidado com soluções ingênuas, elas são simples, mas quase sempre não funcionam como a pessoa espera. Em PHP por exemplo tem um custo enorme e precisa ser bem benéfico.
Faz sentido para você?
Espero ter ajudado.
Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).
O cache, assim como qualquer recurso que usamos, tem prós e contras, situações em que ele se encaixa bem e outras nas quais ele atrapalha. E como praticamente tudo em computação, não tem fórmula mágica do tipo "use sempre que tudo vai funcionar". Se for mal feito, pode até piorar a situação.
Além disso, toda solução sempre traz novos problemas. Um dos mais conhecidos é a invalidação do cache, considerado por muitos um dos problemas mais difíceis da computação.
Enfim, se está pensando em colocar cache no seu sistema, minha sugestão é estudar bem as soluções, avaliar os prós e contras, e principalmente testar bastante pra ver se de fato há um ganho que valha a pena. Cada caso é um caso, não tem fórmula mágica.
Fala mano, tudo certo?
Eu não tenho tanta experiência implementando sistemas de cache, mas acredito que posso contribuir com 10 cents rs.
Na empresa em que trabalho, usamos redis para algumas coisas, como por exemplo: consultar o id da conta de um usuário que está armazenado em outro microsserviço. Por que usamos redis pra isso? Porque esse id não muda e está em um banco de dados de outro microsserviço, portanto faz sentido cachear essa informação. Colocamos um refresh no cache de 12h, pois se por um acaso esse id alterou (muito improvável, mas vai que né :/) o cache poderá ser atualizado com a nova informação.
Agora vamos para a "contribuição":
Acredito que a maioria dos bancos de dados na nuvem cobram por operação de Input/Output, por isso, quanto mais consultas esse banco realizar, mais dinheiro você gasta. Entretanto, um sistema de cache como o Redis também vai te cobrar de diferentes formas, tanto por armazenamento quanto por requisição (me corrija se estiver enganado). Dessa forma, você precisa analizar o trade off de utilizar cache vs only database. Se ao utilizar cache você vai economizar com consultas no banco (o preço do cache deve ser menor que o valor economizado, pois o inverso é desvantagem) você deve sim pensar em implementar esse sistema de cache. Lembre-se de que um sistema pode sempre ganhar tração e aumentar o número de requisições devido ao aumento de usuários. Será que você vai querer implementar esse cache apenas quando a panela já estiver quente?
Espero ter ajudado de alguma forma. Abraços!
possivel usar arquivos é, só é mais custoso e lento acessar um arquivo do que a memória RAM