Algum de vocês conhece um mapa Java ou um armazenamento de dados padrão semelhante que elimina automaticamente as entradas após um determinado tempo limite? Isso significa envelhecimento, onde as entradas antigas expiradas "vencem automaticamente".
De preferência em uma biblioteca de código aberto acessível através do Maven?
Conheço maneiras de implementar a funcionalidade pessoalmente e já o fiz várias vezes no passado, por isso não estou pedindo conselhos a esse respeito, mas sim indicadores para uma boa implementação de referência.
Soluções baseadas em WeakReference , como o WeakHashMap, não são uma opção, porque minhas chaves provavelmente não são cadeias de caracteres internas e eu quero um tempo limite configurável que não dependa do coletor de lixo.
O Ehcache também é uma opção na qual eu não gostaria de confiar porque precisa de arquivos de configuração externos. Estou procurando uma solução somente de código.
fonte
Respostas:
Sim. O Google Collections, ou Guava, como é chamado agora, tem algo chamado MapMaker que pode fazer exatamente isso.
Atualizar:
A partir da goiaba 10.0 (lançada em 28 de setembro de 2011), muitos desses métodos do MapMaker foram preteridos em favor do novo CacheBuilder :
fonte
weakKeys()
implica que as chaves são comparadas usando a semântica ==, nãoequals()
. Eu perdi 30 minutos tentando descobrir porque meu cache String-com chave não estava funcionando :)weakKeys()
é importante.weakKeys()
não é necessário 90% do tempo.Esta é uma implementação de exemplo que eu fiz para o mesmo requisito e simultaneidade funciona bem. Pode ser útil para alguém.
Link de repositório Git (com implementação de ouvinte)
https://github.com/vivekjustthink/WeakConcurrentHashMap
Felicidades!!
fonte
cleanMap()
metade do tempo esperado?Você pode experimentar minha implementação de um mapa de hash auto-expirável. Esta implementação não utiliza threads para remover entradas expiradas; em vez disso, usa DelayQueue que é limpo automaticamente a cada operação.
fonte
O Apache Commons possui um decorador para o Map expirar as entradas: PassiveExpiringMap É mais simples que os caches do Guava.
PS tenha cuidado, não está sincronizado.
fonte
Parece que o ehcache é um exagero para o que você deseja, no entanto, observe que ele não precisa de arquivos de configuração externos.
Geralmente, é uma boa ideia mover a configuração para um arquivo de configuração declarativo (para que você não precise recompilar quando uma nova instalação requer um tempo de expiração diferente), mas isso não é de todo necessário, você ainda pode configurá-lo programaticamente. http://www.ehcache.org/documentation/user-guide/configuration
fonte
As coleções do Google (goiaba) possuem o MapMaker no qual você pode definir o limite de tempo (para expiração) e pode usar referências suaves ou fracas ao escolher um método de fábrica para criar instâncias de sua escolha.
fonte
você pode experimentar o mapa de expiração http://www.java2s.com/Code/Java/Collections-Data-Structure/ExpiringMap.htm uma classe do The Apache MINA Project
fonte
Se alguém precisar de uma coisa simples, a seguir é um conjunto simples de expiração de chave. Pode ser convertido em um mapa facilmente.
fonte
System.nanoTime()
para calcular diferenças de horário, pois System.currentTimeMillis () não é consistente, pois depende do horário do sistema e pode não ser contínuo.Normalmente, um cache deve manter os objetos por algum tempo e expô-los algum tempo depois. O momento ideal para armazenar um objeto depende do caso de uso. Eu queria que essa coisa fosse simples, sem threads ou agendadores. Essa abordagem funciona para mim. Ao contrário de
SoftReference
s, é garantido que os objetos estejam disponíveis por um período mínimo de tempo. No entanto, eles não ficam na memória até o sol se transformar em um gigante vermelho .Como exemplo de uso, pense em um sistema de resposta lenta que poderá verificar se uma solicitação foi feita recentemente e, nesse caso, para não executar a ação solicitada duas vezes, mesmo que um usuário agitado aperte o botão várias vezes. Mas, se a mesma ação for solicitada algum tempo depois, ela deverá ser executada novamente.
fonte
O cache da goiaba é fácil de implementar. Podemos expirar a chave na base de tempo usando o cache da goiaba. Eu li totalmente post e abaixo dá a chave do meu estudo.
Referência: exemplo de cache de goiaba
fonte