C# 内存缓存添加到列表
本文关键字:列表 添加 缓存 内存 | 更新日期: 2023-09-27 18:35:44
我在我的 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>()
}
现在,一切正常。但是,这次我想更新数据库中的某些内容,然后,我想更新缓存控件,这样我就不必查询我的数据库了。
假设 im 使用一个看起来像这样的对象
Public class Foo{
public string Id;
public List<string> values;
}
并假设T
在此示例中Foo
_cache
的列表中,由Foo
的Id
字段。我会疯狂地怀疑该过程是否是线程安全的。
蒂亚。
您可以通过在内存缓存中传递密钥并将项目添加到该列表中来获取列表。List 是引用类型,因此您所做的更改将影响原始对象。
List<T>
不是线程安全的...要么你必须使用锁定机制,要么你可以使用ConcurrentBag<T>
如果元素的顺序不重要。