Estou procurando um cache em memória Java simples que tenha boa simultaneidade (portanto, LinkedHashMap não é bom o suficiente) e que pode ser serializado em disco periodicamente.
Um recurso de que preciso, mas que se mostrou difícil de encontrar, é uma maneira de "espiar" um objeto. Com isso, quero dizer recuperar um objeto do cache sem fazer com que o cache segure o objeto por mais tempo do que o faria de outra forma.
Atualização: um requisito adicional que esqueci de mencionar é que preciso ser capaz de modificar os objetos em cache (eles contêm matrizes flutuantes) no local.
Alguém pode fornecer alguma recomendação?
Respostas:
Como essa pergunta foi feita originalmente, a biblioteca Guava do Google agora inclui um cache poderoso e flexível. Eu recomendaria usar isso.
fonte
Ehcache é uma solução muito boa para isso e tem uma maneira de espiar ( getQuiet () é o método) de forma que não atualize o timestamp ocioso. Internamente, o Ehcache é implementado com um conjunto de mapas, como o ConcurrentHashMap, portanto, tem tipos semelhantes de benefícios de simultaneidade.
fonte
Se você está precisando de algo simples, isso seria adequado?
Não vai salvar no disco, mas você disse que queria simples ...
Links:
(Como Adam comentou, sincronizar um mapa tem um impacto no desempenho. Não estou dizendo que a ideia não tem cabelos, mas seria suficiente como uma solução rápida e suja.)
fonte
ConcurrentHashMap<WeakReference<T>>
. docs.oracle.com/javase/7/docs/api/java/lang/ref/…Outra opção para um cache java em memória é cache2k . O desempenho na memória é superior ao EHCache e google guava, consulte a página de benchmarks cache2k .
O padrão de uso é semelhante a outros caches. Aqui está um exemplo:
Se você tiver o google goiaba como dependência, experimentar o cache de goiaba pode ser uma boa alternativa.
fonte
Você pode usar o imcache facilmente . Um exemplo de código está abaixo.
fonte
Experimente isto:
fonte
public static SimpleCacheManager getInstance() {
deve serpublic synchronized static SimpleCacheManager getInstance() {
caso contrário,if (instance == null) {
não é thread-safe. Nesse caso, você pode remover o objeto do monitor todos juntos, pois a sincronização ocorre para todas as chamadas getInstance (), consulte: javaworld.com/article/2073352/core-java/…Experimente aspectos
@Cacheable
do jcabi . Com uma única anotação, você torna todo o resultado do método armazenável em cache na memória:Além disso, leia este artigo: http://www.yegor256.com/2014/08/03/cacheable-java-annotation.html
fonte
Que tal: https://commons.apache.org/proper/commons-jcs/ (atualizado para o novo endereço, pois JCS agora está no Apache Commons)
fonte
Experimente Ehcache ? Ele permite que você conecte seus próprios algoritmos de expiração de cache para que você possa controlar sua funcionalidade de visualização.
Você pode serializar em disco, banco de dados, em um cluster, etc ...
fonte