我在c#web-api服务器中使用了一些缓存控制。
我使用以下代码:
private static MemoryCache _cache = new MemoryCache("ExampleCache");
public static object GetItems(string key) {
return AddOrGetExisting(key, () => InitItem(key));
}
private static List<T> AddOrGetExisting<T>(string key, Func<List<T>> valueFactory)
{
var newValue = new Lazy<List<T>>(valueFactory);
var oldValue = _cache.AddOrGetExisting(key, newValue, new CacheItemPolicy()) as Lazy<List<T>>;
try
{
return (oldValue ?? newValue).Value;
}
catch
{
_cache.Remove(key);
throw;
}
}
private static List<string> InitItem(string key) {
// im actually fetching a list from the db..but for the sake of the example
return new List<string>()
}
现在,一切都很顺利。但是,这次我想更新我的数据库中的内容,之后,我想更新缓存控件,所以我不必查询我的数据库。
假设我正在使用一个看起来像这样的对象
Public class Foo{
public string Id;
public List<string> values;
}
在此示例中假设T
为Foo
我需要在列表中添加一个项目,该列表存储在_cache
Foo
的{{1}}字段中。如果进程是线程安全的话,我会疯狂地表示。
TIA。
答案 0 :(得分:1)
您可以通过在内存缓存中传递密钥并将项目添加到该列表来获取列表。 列表是引用类型,因此您所做的更改将受到原始对象的影响。
List<T>
不是线程安全的......要么你必须使用锁机制,要么如果元素的顺序不重要,你可以使用ConcurrentBag<T>
。