2017-07-10 105 views
-7

林上的MemoryCache在这里工作是我的几个代码的C#的MemoryCache擅自改变数据

缓存类

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; 
    } 

所以我有一个叫做日志当我添加一个新的日志类那里有一个bug,继承人代码

 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); 

该错误是例如myprevious对象(缓存的值): 3对象A,B,C 我的下一个对象(缓存值)例如: 4对象A,B,C,d

所以我想通过调用RemoveFromCache和添加对象(缓存值)A,取出对象A,B,C,B,C,d

当我走带缓存通过调用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 
} 
+1

“A,B,C”和“A,B,C,D”是什么意思? – mjwills

+0

所有这些'policy + cacheKey;'语句都不会增加问题,但会分散注意力。 –

+1

不完整且不能令人信服。创建一个[mcve]。 –

回答

-1

变化:

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副本 - 因此添加到其中的项目将不会在其他项目中看到。