¿Existe alguna combinación de la funcionalidad de Cache
y Multimap
de Guava disponible? Básicamente, necesito una colección donde las entradas caducan después de un tiempo dado, como está disponible en Cache
, pero tengo claves no únicas y necesito que las entradas caduquen de manera independiente.combinación de Java Guava de Multimap y Cache
Respuesta
Creo que Louis Wasserman proporcionó la respuesta en uno de los comentarios anteriores, es decir, que no hay disponible un combo de Multimap
y Cache
disponible. He resuelto mi problema/necesidades con la solución se describe en pseudo-código de abajo:
private Cache<Integer,Object> cache = CacheBuilder.newBuilder().SomeConfig.build();
private Multimap<Integer,Object> multimap = HashMultimap<Integer, Object>.create();
private AtomicInteger atomicid = new AtomicInteger(0);
public void putInMultimap(int id, Object obj) {
int mapid = atomicid.addAndGet(1);
cache.put(mapid,obj);
multimap.put(id,mapid);
}
public List<Object> getFromMultimap(int id) {
Set<Integer> mapids = multimap.get(id);
List<Object> list = new ArrayList<Object>();
for (int i : mapids) {
list.add(cache.getIfPresent(i));
}
return list;
}
Esta 'solución' simple tiene algunas limitaciones pero funciona bien para mí.
Con un caché de guayaba no hay poner el método, el caché está diseñado para ser auto-poblado. Los valores devueltos de una búsqueda de clave se calculan en tiempo de ejecución. Un enfoque similar es tomado por Commons Collections Transformer Factories.
Creo que podría implementar lo que está buscando con bastante facilidad. Si observa un ejemplo simple respaldado por un mapa, como Kitty-Cache, puede ver que puede reemplazar el mapa con un Multimap y reescribir los otros métodos en consecuencia. Así que en KittyCache.java internamente que podría tener algo como:
Multimap<K, CacheEntry<V>> cache;
El truco para este tipo de caché es que en realidad nada ha caducado hasta que alguien lo solicite.
"Con un caché de guayaba no hay un método put, el caché está diseñado para ser auto-poblado" - esto no es cierto. Es cierto que 'Cache' no tiene ningún método "put" y que 'LoadingCache' está diseñado para ser auto-poblado, pero siempre puedes usar un caché que no se carga y llamar a' cache.asMap(). Put (.. .) 'para agregar sus propias entradas. Por supuesto, esto no te da un multimap. Solo corrigiendo esa primera declaración. – Ray
Desde Guava 11.0 hay un [método put] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/Cache.html#put (K, V)) en 'Caché'. El ejemplo que proporcionó es interesante, pero no puedo confiar en la caducidad de las solicitudes, implemento 'RemovalListener' para recibir notificaciones sobre las caducidades en' Cache'. – hgus1294
Gracias por poner esto en claro Ray. Estaba citando: http://java.dzone.com/articles/google-guava-cache –
Mientras que estás hablando y no Cache
LoadingCache
que podía pasar la vista Cache.asMap()
en Multimaps.newMultimap
.
Interesante. Hice algunas pruebas, pero no puedo hacer que las entradas caduquen de forma independiente. Pasé un 'Cache.asMap()' en un 'Multimaps.newMultimap' según su sugerencia e hizo algunas pruebas rápidas con 'expireAfterWrite' establecido en 1000 ms y ejecutó el siguiente escenario: ' map.put (1, Object1); '' Thread.Sleep (700) '' map.put (1, Object2); '' Thread.Sleep (500) '. En este punto, espero que la primera entrada sea desalojada, pero la segunda permanezca pero encuentro que ambas entradas serán desalojadas. Tal vez estoy haciendo algo mal, pero a menos que pueda cambiar el comportamiento, no funciona para mí. – hgus1294
- 1. Guava MultiMap y ConcurrentModificationException
- 2. Ordenar Guava Multimap por número de valores
- 3. ¿Cómo ordenar guava multimap? (CLAVE = FECHA)
- 4. Mal rendimiento con Guava Cache en Android
- 5. ¿Cómo manejar las excepciones de actualización de Google Guava Cache?
- 6. Agregando una llave con un valor vacío a Guava Multimap
- 7. Equal/hash personalizado al insertar la clave (Guava Cache)
- 8. LRU byte Cache java
- 9. Java DNS cache viewer
- 10. ¿Combinación de Launch4J y Java Web Start?
- 11. Filtrado Guava Multimaps
- 12. ¿Forma compacta de crear Guava Multimaps?
- 13. La biblioteca de Guava para Java; ¿Cuáles son sus características más útiles y/u ocultas
- 14. Alto rendimiento Concurrent MultiMap Java/Scala
- 15. Guava r07, GWT y javax.annotation.Nullable
- 16. Combinar dos mapas en un MultiMap
- 17. ¿Cómo iterar sobre Multimap en el orden de inserción?
- 18. Inyectar Google guava cache builder en bean a través de Spring
- 19. ¿Hay una buena comparación entre Functional Java y Guava?
- 20. Iterar un Multimap con JSP
- 21. Combinación de java y nodejs para la aplicación de Android
- 22. Guava: cómo combinar filtro y transformar?
- 23. Problemas con GWT y Guava
- 24. ¿Cuál es la diferencia entre HttpRuntime Cache y HttpContext Cache?
- 25. Problemas de serialización de Java, al usar guava Lists.transform
- 26. "multiset" y "multimap": ¿cuál es el punto?
- 27. C++ invalidación de iterador multimap
- 28. ¿Algo en Guava similar al efecto funcional de Java?
- 29. ¿Cómo puedo crear un Multimap en Java en Android?
- 30. Combinación de Cmake y gcc
¿Cómo lidiar con el multimapa en constante crecimiento? – neu242
@ neu242 para la parte 'SomeConfig' en la respuesta actual puede agregar una llamada' .removalListener', que se invocará cada vez que se expulse algo de la memoria caché, para que también pueda eliminarla del multimapa – Philipp