如果我有课程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吗?
答案 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?