用于缓存对象的哈希集和基于ID的查询

时间:2017-03-15 21:34:44

标签: c# asp.net .net hashset

如果我有课程Foo

public class Foo {
    int FooId;
    string FooName;
    // etc;
}

我想缓存它们并根据Id查询它们,我现在做的是这样的事情:

private List<Foo> cachedFoos;

public Foo GetFoo (int fooId) {
    Foo foo = cachedFoos.FirstOrDefault(s => s.FooId == fooId)
    if (foo != null){
        return foo;
    } 
    else {
       foo = GetFooFromDb;
       cachedFoos.Add(foo);
       return foo;
    }
}

但我认为我应该在这里使用HashSet,所以我不必担心并发问题(插入重复的Foos)。 HashSets按对象查询,但我需要通过PK查询。我应该在某种程度上利用HashSets吗?

1 个答案:

答案 0 :(得分:0)

如果你想使用ID作为密钥并且害怕并发问题,我认为ConcurrencyDictionary是你需要的类,它还有一个非常有用的函数GetOrAdd

private ConcurrencyDictionary<int, Foo> cachedFoos = new ConcurrencyDictionary<int, Foo>();

public Foo GetFoo (int fooId) {
    return cachedFoos.GetOrAdd(fooId, GetFooFromDb);
}

但是请注意,编程中存在两个难题:命名和缓存失效。我的示例并没有开始缓存失效。此外,除非您了解自己所做的非常好,否则不应该使用自己的缓存。为什么不使用已经包含缓存的标准,例如EntityFramework?