C#MemoryCache自己更改数据

时间:2017-07-10 12:57:59

标签: c# memorycache

我正在使用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;
    }

所以当我添加一个新日志时,我有一个名为Log的类,这是一个错误,继承代码

        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并添加Object(缓存值)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
}

1 个答案:

答案 0 :(得分:-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副本 - 因此添加到其中的项目将无法在另一个中看到。