Geralmente a utilização de uma estratégia de cache em uma arquitetura de software vêm por conta da necessidade de se ganhar performance ou até de economizar alguns recursos como a rede. O grande problema é que o cache consome alguns recursos importantes como memória e muitas vezes uma abordagem precipitada do mesmo pode levar até a uma situação inversa, onde você perde desempenho ao invés de ganhar.
Cachear objetos que são utilizados frequentemente é uma estratégia muito boa para que quer ganhar performance visto que você pode evitar que seu fluxo acesse alguns layers da sua aplicação. Muitos desenvolvedores acabam por escolher a opção de cache tanto pela fácil implementação quanto pela quantidade de soluções que já automatizam essa parte para você.
Sem dúvida, inúmeras aplicações hoje em dia utilizam da técnica de cacheamento quando o assunto é banco de dados. Evitar que queries sejam diretamente no disco fisico e passem a ser feitas na memório, podem trazer ganhos de performance significativos. O grande problema é que algumas aplicações não se preocupam com os detalhes e com a implementação de forma correta. Ao se utilizar cacheamento de objetos é necessário possuir uma estratégia e uma regra bem definida sobre o que pode ou não pode ser cacheado, caso contrário você o efeito inicialmente buscado, performance, pode na verdade ser um problema para sua aplicação levando até a perda de desempenho.
Omar AL Zabir, arquiteto chefe da BT, postou em seu blog os 10 principais erros que acontecem na utilização do cache que podem quebrar totalmente sua aplicação. São eles:
- Confiar no serializer padrão do .NET
- Guardar objetos grandes em apenas um item de cache.
- Utilizar o cache para compartilhar os objetos entre as threads.
- Assumir que os items estarão no cache após consultar eles.
- Armazenar coleções inteiras e seus objetos aninhados.
- Armazenar objetos pai-filho juntos ou também separados.
- Cachear definições de configuração.
- Cachear objetos vivos que utilizam alguma forma de stream, arquivo, registro, ou rede.
- Armazenar o mesmo item utilizando diversas chaves.
- Não atualizar ou deletar os items do cache após atualizar ou deletar os items do banco de dados.
E você leitor tem mais alguma dica para quem deseja utilizar cacheamento de objetos nas suas aplicações? Qual é a sua experiência com cacheamento? Você já sofreu perda de performance?