我的实体有两个唯一ID(是的,这是错误的,但这是一个要求)。我想组织这种实例的缓存。缓存中的搜索可以由id1或id2或id1和id2进行。通过id1和id2搜索都可以 - 我将制作复合键。但是如何通过其中一个ID来处理搜索。缓存密钥应该是什么?我正在使用ehcache。
我有一种情况,其中几个键可能引用相同的情况 对象
就像ehcache不支持这个功能一样 将为每个键存储对象(n个实例) 相同的对象,其中n是不同键的数量 该对象可能来自)。
在某些时候,我有知识来计算 其他钥匙,但不是在我需要之前。
情况:
GEN KEY(1) 检查对象是否在缓存中(2) 正确:退却
FALSE:处理新对象(3) 把它放在ehcache中 返回OBJECT
在第(1)点只知道其中一个键。在这一点上 (3)有可能知道所有的键 对象可能与ehcache中的关联。 问题是在第(2)点需要密钥。
THX
答案 0 :(得分:1)
我无法告诉ehcache,但我一直遇到类似问题的HashMap
用作缓存。我只是将每个值放在Map中两次,它不是那么昂贵且效果很好。
由于我的密钥类型不同,我使用Map<Object, V>
。
答案 1 :(得分:1)
一种选择是使用两张地图。每个id集合一个,但两者都指向同一组值。
如果搜索在id1上,则只查找第一个地图中的值,如果在id2上,则只在第二个地图中查找。如果您需要搜索两者,请查找这两个值并查看值是否相同。
根据您的问题和评论的更新进行了更新: 在你的ecache中使用两个键。是的,这将占用更多空间,有时候您正在寻找的对象已经在另一个键下的缓存中。但是,缓存应该存储常见的查找键。它不应该关心该值可能存在于另一个键下。因此,我不会强调自己尝试优化缓存以基于两个键进行查找。
答案 2 :(得分:1)
要完成您想要的任务,您可以通过传递性来实现,不仅存储缓存中的对象,还存储使用每个键指向对象的索引。
例如: -
缓存[ “KEY1”] = theIndex;
缓存[ “KEY2”] = theIndex;
缓存[theIndex] =对象;
因此,当您请求缓存[“key1”]时,您将获得一个索引(您必须知道它是一个索引),然后使用该索引获取实际对象。
代码可能类似于:
public class CacheUtil {
... any necessary code here
public static void put(String key, Serializable obj) {
if (obj instance of Cacheable) {
//Cacheable interface identifies the cacheable object that has the getKeys method
String[] keys = obj.getKeys();
if (keys != null && keys.length > 0) {
for (String myKey : keys) {
//CacheIndex identifies the index
cache.put(new Element(myKey, new CacheIndex(hashCode)));
}
key = hashCode(keys); //change the key. Can be a hashcode of the keys
}
}
cache.put(new Element(key, obj));
}
public static Serializable get(String key) {
Serializable obj = cache.get(key);
return ((null != serializable) && (serializable instanceof CacheIndex)) ?
get(((CacheIndex)serializable).getIndex(), area) : obj;
}
}