Voici donc le problème que je suis en train de résoudre - j'ai un objet avec deux champs entiers que je veux mettre en cacheEhcache - à l'aide d'une liste <Integer> la valeur du cache
public class MyObject {
int x;
int y;
....
}
Maintenant, le champ x
est ce que Je suis principalement sur - mais il peut y avoir des doublons, auquel cas je veux revenir sur le second champ (pour que this.x = that.x et this.y = that.y). y ne peut être que 25 valeurs distinctes. Maintenant, je sais que je pourrais juste combiner les deux comme une chaîne et l'utiliser comme clé de cache, mais alors je devrais essayer x+[25 possible values]
pour déterminer si elle n'était pas dans le cache - ce qui rend le cache très cher. Je pensais essayer de stocker un List<Integer>
comme la valeur de cache pour le champ x
et puis si leur était plus d'un, parcourir la liste et rechercher une correspondance sur y
. Maintenant, si j'utilise un ConcurrentList
(ou un ensemble si je me soucie des doublons - ignorons cela pour le moment) plusieurs threads pourront-ils y ajouter et ensuite le remettre dans le cache sans conditions de course? Est-il possible qu'Ehcache renvoie deux objets List différents à deux threads, puis quand ils ajoutent leur nouvelle valeur à la liste et tentent de la remettre dans le cache, je pourrais obtenir des résultats indéterministes? Voyez-vous une meilleure façon de construire ce cache?
EDIT: J'apprécie les réponses ci-dessous, mais tout le monde semble manquer le point principal. Est-ce que ça va marcher? Est-ce qu'Ehcache peut renvoyer deux objets différents pour le même cacheKey (disons si l'objet était sur le disque pendant l'appel et qu'il est sérialisé deux fois, une fois pour chaque appel).
Y a-t-il une raison pour laquelle vous ne pouvez pas utiliser un hachage comme clé? – Falmarri
Comme je l'ai dit dans la question qui voudrait dire pour une valeur donnée de x, je devrais vérifier le cache peut-être 25 fois pour savoir que ce n'était pas dans le cache. Je veux faire correspondre sur x peu importe la valeur de y - mais s'il y a plusieurs x alors la meilleure valeur de y. – Gandalf
Oui, il est possible d'avoir une valeur ajoutée deux fois en utilisant la méthode que vous avez mentionnée. Utilisez plutôt un ConcurrentMap. –