具有多个键的内存缓存
本文关键字:内存 缓存 | 更新日期: 2023-09-27 17:59:57
我需要构建一个自定义类对象的缓存(安全性与财务一样)。类的对象可以通过多种方式进行识别,因为它有多个标识符,如PKey、Name、Long Name或不同语言中的任何其他类型的名称。
因此,缓存应该基于任何标识符(即多个密钥)进行搜索。
如何创建这样的缓存?
我使用的是C#4.5,但我认为这是一个通用问题,所以任何方式的解决方案都可以帮助
我认为快速高效的解决方案之一是为不同的标识符保留不同的缓存。例如<名称,Pkey>,<长名称,Pkey>,<标识符Pkey>和具有<Pkey,对象>
有没有更新更好的方法来做到这一点?
编辑:当我访问缓存时,所有的密钥都是未知的,所以我无法制作复合密钥
也许这段代码会很有用:
public class Test12 {
static Map<CacheKey, SecureObject> cache = new ConcurrentHashMap<CacheKey, SecureObject>();
public static void main(String[] args) {
SecureObject secureObject = new SecureObject(new CacheKey("pkey1", "name1", 1L));
cache.put(secureObject.getKey(), secureObject);
secureObject = new SecureObject(new CacheKey("pkey1", "name2", 2L));
if (cache.containsKey(secureObject.getKey())) {
System.out.println("Already in cache.");
}
}
}
class CacheKey {
String pkey;
String name;
Long longName;
CacheKey(String pkey, String name, Long longName) {
this.pkey = pkey;
this.name = name;
this.longName = longName;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CacheKey cacheKey = (CacheKey) o;
if (pkey != null && pkey.equals(cacheKey.pkey)) {
return true;
} else {
if (name != null && name.equals(cacheKey.name)) {
return true;
} else {
if (longName != null && longName.equals(cacheKey.longName)) {
return true;
} else {
return false;
}
}
}
}
@Override
public int hashCode() {
int result = 0;
if (pkey != null) {
result = pkey.hashCode();
} else if (name != null) {
result = name.hashCode();
} else if (longName != null) {
result = longName.hashCode();
}
return result;
}
}
class SecureObject {
CacheKey key;
SecureObject(CacheKey key) {
this.key = key;
}
public CacheKey getKey() {
return key;
}
public void setKey(CacheKey key) {
this.key = key;
}
}
打印:
已在缓存中。
这不是一个完整的解决方案。这只是方向。