Así que aquí está el problema que estoy tratando de resolver - Tengo un objeto con dos campos de enteros que quiero para almacenar en cachéEhcache - usando una lista <Integer> como el valor de caché
public class MyObject {
int x;
int y;
....
}
Ahora el campo x
es lo Principalmente coincido, pero puede haber duplicados, en cuyo caso quiero recurrir al segundo campo (para que this.x = that.x y this.y = that.y). y solo puede ser 25 valores distintos. Ahora sé que podría combinar los dos como un String y usar eso como la clave de caché, pero luego tendría que probar x+[25 possible values]
para determinar realmente si no estaba en el caché, lo que hace que el caché sea muy caro. Estaba pensando en intentar almacenar un List<Integer>
como el valor de caché para el campo x
y luego, si su número era más de uno, recorrer la lista y buscar coincidencias en y
.
Ahora si uso un ConcurrentList
(o un conjunto si me importan los duplicados, ignóralo por el momento) ¿se podrán agregar varios subprocesos y luego volver a ponerlo en el caché sin condiciones de carrera? ¿Es posible que Ehcache pueda devolver dos Objetos de Lista diferentes a dos subprocesos y luego cuando agreguen su nuevo valor a la lista e intenten volver a ponerlo en la memoria caché, podría obtener resultados indeterminados? ¿Ves una mejor forma de construir este caché?
EDIT: Agradezco las respuestas a continuación, pero parece que a todos les falta el punto principal. esto funcionara? ¿Podría Ehcache realmente devolver dos objetos diferentes para la misma clave de caché (digamos si el objeto estaba en el disco durante la llamada y se serializó dos veces, una para cada llamada).
¿Hay algún motivo por el que no pueda usar un hash como clave? – Falmarri
Como dije en la pregunta que significaría para cualquier valor dado de x, tendría que verificar el caché posiblemente 25 veces para saber realmente que no estaba en el caché. Quiero unirme a x sin importar el valor de y - pero si hay varias x, entonces el mejor valor de y. – Gandalf
Sí, es posible agregar un valor dos veces utilizando el método que mencionaste. Más bien use un ConcurrentMap. –