具有多个键的内存缓存

本文关键字:内存 缓存 | 更新日期: 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;
    }
}

打印:

已在缓存中。

这不是一个完整的解决方案。这只是方向。