C# MemoryCache 添加到列表
C# MemoryCache add to list
我在我的 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
by Foo
的 Id
字段中的列表中。如果该进程是线程安全的,我会非常高兴。
TIA。
您可以通过在内存缓存中传递密钥来获取列表并将项目添加到该列表。
列表是引用类型,因此您所做的更改将影响到原始对象。
List<T>
不是线程安全的...如果元素的顺序不重要,您要么必须使用锁定机制,要么可以使用 ConcurrentBag<T>
..
我在我的 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
by Foo
的 Id
字段中的列表中。如果该进程是线程安全的,我会非常高兴。
TIA。
您可以通过在内存缓存中传递密钥来获取列表并将项目添加到该列表。 列表是引用类型,因此您所做的更改将影响到原始对象。
List<T>
不是线程安全的...如果元素的顺序不重要,您要么必须使用锁定机制,要么可以使用 ConcurrentBag<T>
..