Essa abordagem é praticamente a maneira aceita de fazer qualquer coisa em nossa empresa. Um exemplo simples: quando uma parte de dados de um cliente é solicitada a partir de um serviço, buscamos todos os dados para esse cliente (parte relevante para o serviço) e os salvamos em um dicionário na memória e os servimos a partir daí nas solicitações a seguir (executamos serviços singleton). Qualquer atualização vai para o DB e atualiza o dicionário na memória. Parece tudo simples e inofensivo, mas à medida que implementamos regras comerciais mais complicadas, o cache fica fora de sincronia e precisamos lidar com erros difíceis de encontrar. Às vezes, adiamos a gravação no banco de dados, mantendo novos dados em cache até então. Há casos em que armazenamos milhões de linhas na memória porque a tabela possui muitas relações com outras tabelas e precisamos mostrar dados agregados rapidamente.
Todo esse manuseio de cache é uma grande parte de nossa base de código e sinto que não é o caminho certo para fazê-lo. Todo esse malabarismo adiciona muito ruído ao código e dificulta a compreensão da lógica real dos negócios. No entanto, acho que não podemos fornecer dados em um período de tempo razoável se precisarmos acessar o banco de dados todas as vezes.
Estou infeliz com a situação atual, mas não tenho uma alternativa melhor. Minha única solução seria usar o cache de segundo nível do NHibernate, mas quase não tenho experiência com ele. Sei que muitos campanies usam Redis ou MemCached pesadamente para obter desempenho, mas não tenho idéia de como os integraria ao nosso sistema. Também não sei se eles podem ter um desempenho melhor do que consultas e estruturas de dados na memória.
Existem abordagens alternativas que eu deveria procurar?