在具有多个键的内存缓存中

时间:2014-04-25 08:23:21

标签: c# caching

我需要构建一个自定义类对象的缓存(如财务中的安全性)。可以通过多种方式识别类的对象,因为它具有多个标识符,如PKey,Name,Long Name或不同语言的任何其他类型的名称。

因此,缓存应该可以根据任何标识符(即多个密钥)进行搜索。

如何创建这样的缓存?

我正在使用C#4.5,但我认为这是一个普遍的问题,所以解决方案可以提供任何帮助

我认为快速有效的解决方案之一是为不同的标识符保留不同的缓存。对于例如<名称,Pkey>,<长名称,Pkey>,<标识符,PKEY>以及具有<类型的对象的单个缓存p键,对象>

有更新更好的方法吗?

  

编辑:当我访问缓存时,所有密钥都是未知的,所以我   无法制作复合键

1 个答案:

答案 0 :(得分:0)

也许这段代码会很有用:

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;
    }
}

打印:

  

已经在缓存中。

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