cache de chave / valor do tipo memcached que usa RAM e disco [fechado]

Eu tenho um aplicativo da web java que faz back-end de um serviço da web de terceiros. Ligar para o serviço web cria latência, o que é importante evitar sempre que possível. Além disso, meu aplicativo só pode fazer um determinado número de chamadas de serviço da Web por dia, portanto, é melhor não fazer uma chamada de serviço da Web, a menos que seja absolutamente necessário.

Minha solução atual é armazenar em cache os resultados do serviço da Web no Memcached, e isso funciona bem. Basicamente, estamos utilizando a RAM para armazenar em cache os resultados dos serviços da web.

No entanto, gostaríamos de levar isso para o próximo nível. Também temos espaço em disco que gostaríamos de usar como cache de disco para armazenar em cache os resultados dos serviços da web. Eu gostaria de um sistema em que primeiro verificássemos o cache da RAM (que pode ser armazenado em cache no Memcached, mas não precisa ser). Quando ocorre uma falha no cache da RAM, voltamos a verificar o cache do disco. E quando ocorre uma falha no cache do disco, voltaríamos a chamar o serviço da web. Sempre que recuperamos novos resultados de serviços da Web, atualizamos o cache da RAM e o cache do disco.

Uma possibilidade seria usar um banco de dados SQL como parte do sistema que usa o disco para armazenamento. Mas isso parece menos do que ideal. Os bancos de dados tendem a precisar de muitos serviços de babá. Eles geralmente envolvem arquivos (o próprio banco de dados ou o log de transações) que crescem sem limites; portanto, você precisa gerenciar o que acontece quando esses arquivos em crescimento começam a causar falta de espaço no sistema de arquivos.

Em vez disso, o que eu quero para a parte do sistema baseada em disco é algo em que posso dizer quanto espaço em disco usar e garantirá que nunca usará mais do que isso. E, quando ficar sem espaço, começará automaticamente a jogar fora os pares de valores-chave usados menos recentemente. Definitivamente não preciso de ACID, portanto não deve haver logs de transações.

Então, estou procurando: 1) um sistema de armazenamento de valor-chave baseado em disco que possa atuar como "failover" quando o Memcached tiver uma falta de cache OU 2) um único sistema que substitua o Memcached e forneça o cache da RAM e o cache de disco.

Outras qualidades importantes que eu quero: 1) Como o Memcached, eu quero um sistema de cache que não exija babá. 2) Como o Memcached, quero que o cache seja compartilhado em vários servidores, com cada objeto vivendo em exatamente um servidor. 3) Como o Memcached, quero algo que seja bastante fácil de conectar e usar. Eu não quero escrever uma tonelada de código para fazer isso funcionar.

Outros sistemas que eu já olhei: 1) Acredito que o Redis não se encaixa nesse ponto, pois o cache do disco é apenas um espelho do que está na RAM. Quero que o cache da RAM seja um pequeno subconjunto do cache do disco. 2) O EhCache possui um "armazenamento de disco persistente que armazena dados entre as reinicializações da VM", mas isso não é muito semelhante ao que eu descrevi acima.

O Apache JCS (Java Caching System) parece ser um bom ajuste, então eu adoraria ouvir opiniões sobre ele daqueles que o usaram.

questionAnswers(6)

yourAnswerToTheQuestion