C# MemoryCache 自己改变数据
C# MemoryCache Changing Data by Itself
我正在处理 MemoryCache,这是我的几个代码
缓存Class
private static string policy = "__";
public static void SaveTocache(string cacheKey, object savedItem,int hour = 43800)
{
if (!cacheKey.StartsWith(policy)) cacheKey = policy + cacheKey;
CacheItemPolicy cacheItemPolicy = new CacheItemPolicy();
cacheItemPolicy.AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddHours(hour));
RemoveFromCache(cacheKey);
MemoryCache.Default.Add(cacheKey, savedItem, cacheItemPolicy);
}
public static T GetFromCache<T>(string cacheKey) where T : class
{
if (!cacheKey.StartsWith(policy)) cacheKey = policy + cacheKey;
return MemoryCache.Default[cacheKey] as T;
}
public static void RemoveFromCache(string cacheKey)
{
if(!cacheKey.StartsWith(policy))cacheKey = policy + cacheKey;
foreach (string key in MemoryCache.Default.Where(obj=> obj.Key.StartsWith(cacheKey)).Select(obj=> obj.Key))
{
MemoryCache.Default.Remove(key);
}
}
public static bool IsInCache(string cacheKey)
{
if (!cacheKey.StartsWith(policy)) cacheKey = policy + cacheKey;
return MemoryCache.Default[cacheKey] != null;
}
所以当我添加新日志时,我有一个名为 Log 的 class 有一个错误,代码如下
Models.Log l = new Models.Log();
l.LogId = Guid.NewGuid();
l.Topic = topic;
l.PIC = pic;
l.LogStatusId = logStatus;
l.LogRarityId = logRarity;
l.LogTypeId = logType;
l.SavedUser = savedUser;
l.RequestedUser = requestedUser;
l.Division = division;
l.InsertedDate = DateTime.Now;
l.Description = description;
List<Models.Log> list = getData();
Utility.Connect.Agla15Context.Logs.Add(l);
Utility.Connect.Agla15Context.SaveChanges();
string caches = cacheName;
list.Add(l);
Utility.CacheHelper.SaveTocache(caches, list);
错误是我以前的对象(缓存值)例如:
3 对象 A、B、C
我的下一个对象(缓存值)例如:
4 对象 A、B、C、D
所以我想通过调用 RemoveFromCache 并添加对象(缓存值)A、B、C、D 来删除对象 A、B、C
当我通过调用 GetFromCache 获取缓存时,有时我得到对象(缓存值)A、B、C,有时我得到对象(缓存值)A、B、C、D 我的代码发生了什么。
或者简化的看起来像这样
List<String> a = new List<String>(){"A","B","C"};
Utility.CacheHelper.SaveTocache("MyKey",a);
List<String> b = Utility.CacheHelper.GetFromCache<List<String>>("MyKey");//A,B,C
b.add("D");
Utility.CacheHelper.SaveTocache("MyKey",b);
for(int i=0;i<100;i++)
{
List<String> b = Utility.CacheHelper.GetFromCache<List<String>>("MyKey");//Sometimes A,B,C sometimes A,B,C,D
}
变化:
Utility.CacheHelper.SaveTocache("MyKey",a);
至:
Utility.CacheHelper.SaveTocache("MyKey",a.ToList());
和:
List<String> b = Utility.CacheHelper.GetFromCache<List<String>>("MyKey");
至:
List<String> b = Utility.CacheHelper.GetFromCache<List<String>>("MyKey").ToList();
从技术上讲,只需要对后者进行更改 - 前者会使它更加防弹。
这是必要的,因为如果添加到 MemoryCache 的任何条目都是 shared amongst callers - 因此如果一个调用者操纵 List
,那么其他调用者也将看到该操纵列表。
通过调用 ToList
,您可以确保每个调用者都获得自己的 List
副本 - 因此添加到一个的项目不会在另一个中看到。
我正在处理 MemoryCache,这是我的几个代码
缓存Class
private static string policy = "__";
public static void SaveTocache(string cacheKey, object savedItem,int hour = 43800)
{
if (!cacheKey.StartsWith(policy)) cacheKey = policy + cacheKey;
CacheItemPolicy cacheItemPolicy = new CacheItemPolicy();
cacheItemPolicy.AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddHours(hour));
RemoveFromCache(cacheKey);
MemoryCache.Default.Add(cacheKey, savedItem, cacheItemPolicy);
}
public static T GetFromCache<T>(string cacheKey) where T : class
{
if (!cacheKey.StartsWith(policy)) cacheKey = policy + cacheKey;
return MemoryCache.Default[cacheKey] as T;
}
public static void RemoveFromCache(string cacheKey)
{
if(!cacheKey.StartsWith(policy))cacheKey = policy + cacheKey;
foreach (string key in MemoryCache.Default.Where(obj=> obj.Key.StartsWith(cacheKey)).Select(obj=> obj.Key))
{
MemoryCache.Default.Remove(key);
}
}
public static bool IsInCache(string cacheKey)
{
if (!cacheKey.StartsWith(policy)) cacheKey = policy + cacheKey;
return MemoryCache.Default[cacheKey] != null;
}
所以当我添加新日志时,我有一个名为 Log 的 class 有一个错误,代码如下
Models.Log l = new Models.Log();
l.LogId = Guid.NewGuid();
l.Topic = topic;
l.PIC = pic;
l.LogStatusId = logStatus;
l.LogRarityId = logRarity;
l.LogTypeId = logType;
l.SavedUser = savedUser;
l.RequestedUser = requestedUser;
l.Division = division;
l.InsertedDate = DateTime.Now;
l.Description = description;
List<Models.Log> list = getData();
Utility.Connect.Agla15Context.Logs.Add(l);
Utility.Connect.Agla15Context.SaveChanges();
string caches = cacheName;
list.Add(l);
Utility.CacheHelper.SaveTocache(caches, list);
错误是我以前的对象(缓存值)例如: 3 对象 A、B、C 我的下一个对象(缓存值)例如: 4 对象 A、B、C、D
所以我想通过调用 RemoveFromCache 并添加对象(缓存值)A、B、C、D 来删除对象 A、B、C
当我通过调用 GetFromCache 获取缓存时,有时我得到对象(缓存值)A、B、C,有时我得到对象(缓存值)A、B、C、D 我的代码发生了什么。
或者简化的看起来像这样
List<String> a = new List<String>(){"A","B","C"};
Utility.CacheHelper.SaveTocache("MyKey",a);
List<String> b = Utility.CacheHelper.GetFromCache<List<String>>("MyKey");//A,B,C
b.add("D");
Utility.CacheHelper.SaveTocache("MyKey",b);
for(int i=0;i<100;i++)
{
List<String> b = Utility.CacheHelper.GetFromCache<List<String>>("MyKey");//Sometimes A,B,C sometimes A,B,C,D
}
变化:
Utility.CacheHelper.SaveTocache("MyKey",a);
至:
Utility.CacheHelper.SaveTocache("MyKey",a.ToList());
和:
List<String> b = Utility.CacheHelper.GetFromCache<List<String>>("MyKey");
至:
List<String> b = Utility.CacheHelper.GetFromCache<List<String>>("MyKey").ToList();
从技术上讲,只需要对后者进行更改 - 前者会使它更加防弹。
这是必要的,因为如果添加到 MemoryCache 的任何条目都是 shared amongst callers - 因此如果一个调用者操纵 List
,那么其他调用者也将看到该操纵列表。
通过调用 ToList
,您可以确保每个调用者都获得自己的 List
副本 - 因此添加到一个的项目不会在另一个中看到。