加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 缓存在它应该到期之前到期

发布时间:2020-12-16 06:38:16 所属栏目:asp.Net 来源:网络整理
导读:有人可以帮我吗?我有以下代码来存储和修复catch,但是,它不起作用.即使我在slidingExpiration中将其设置为14天,缓存也会在几分钟内到期.提前致谢! public static ListReplyDTO VideoCommentList(){ ListReplyDTO replyList = new ListReplyDTO(); if (HttpR
有人可以帮我吗?我有以下代码来存储和修复catch,但是,它不起作用.即使我在slidingExpiration中将其设置为14天,缓存也会在几分钟内到期.提前致谢!

public static List<ReplyDTO> VideoCommentList()
{
     List<ReplyDTO> replyList = new List<ReplyDTO>();
     if (HttpRuntime.Cache["videoComment"] == null)
     {
         HttpRuntime.Cache.Remove("videoComment");
         HttpRuntime.Cache.Insert("videoComment",replyList,null,Cache.NoAbsoluteExpiration,TimeSpan.FromDays(14));
     }
     else
     {
         replyList = (List<ReplyDTO>)HttpRuntime.Cache["videoComment"];
     }

     if (replyList.Count > 8)
     {
         replyList = replyList.OrderByDescending(x => x.DateCreated).Take(8).ToList();
     }
     else
     {
         replyList = replyList.OrderByDescending(x => x.DateCreated).ToList();
     }
     return replyList;
}

public static List<ReplyDTO> AddVideoComment(ReplyDTO replyDTO)
{
     List<ReplyDTO> replyList = new List<ReplyDTO>();
     replyList = VideoCommentList();
     replyList.Add(replyDTO);
     HttpRuntime.Cache.Insert("videoComment",TimeSpan.FromDays(14));

     if (replyList.Count > 8)
     {
          replyList = replyList.OrderByDescending(x => x.DateCreated).Take(8).ToList();
     }
     else
     {
          replyList = replyList.OrderByDescending(x => x.DateCreated).ToList();
     }
     return replyList;
}

解决方法

ASP.net缓存是内存中的,因此如果您的IIS进程或应用程序池回收,它将变得清晰.您可以检查以下可能导致流程再循环的事项

>如果修改web.config,IIS将关闭旧实例并慢慢将流量传输到新实例,在此过程中将回收内存中的内容.如何检查:您可以通过检查AppDomain.IsFinalizingForUnload并在回调期间记录该情况来检测这种情况.
> Application Pool Recycling:IIS中有一个配置,根据该配置,如果IIS进程在指定时间内处于空闲状态,它将对其进行回收.您可以在服务器上进行检查,并增加此时间或完全禁用回收.
>每个进程都限制了它可以消耗多少内存,如果在内存中添加太多对象,它将增加IIS的内存消耗,并且在关键时刻OS将回收该进程.

编辑

在程序中,您将replyList项添加到缓存,然后执行.Take()操作.由于replyList是引用对象,如果你修改它,它也会在缓存中得到更新.因此,如果在您的程序中,如果您执行replyList == null,它将更新缓存中的项目.

所以修改你的代码并尝试

public static List<ReplyDTO> VideoCommentList()
{
    List<ReplyDTO> replyList = new List<ReplyDTO>();
    if (HttpRuntime.Cache["videoComment"] == null)
    {
        //Call to .Remove is not required
        //HttpRuntime.Cache.Remove("videoComment");
        HttpRuntime.Cache.Insert("videoComment",TimeSpan.FromDays(14));
    }
    else
    {
        //No need to check count > 8,Take will handle it for you
        replyList = ((List<ReplyDTO>)HttpRuntime.Cache["videoComment"])
                        .OrderByDescending(x => x.DateCreated)
                        .Take(8).ToList();
    }
    return replyList;
}

public static List<ReplyDTO> AddVideoComment(ReplyDTO replyDTO)
{
    //Read from cache
    List<ReplyDTO> replyList = ((List<ReplyDTO>)HttpRuntime.Cache["videoComment"]);
    if(replyList == null)
        replyList = VideoCommentList();
    replyList.Add(replyDTO);
    HttpRuntime.Cache.Insert("videoComment",TimeSpan.FromDays(14));

    //Here you are creating a new list,and not referencing the one in the cache
    return replyList.OrderByDescending(x => x.DateCreated).Take(8).ToList();
}

重要建议

如果要检查从缓存中删除对象的时间和原因,可以在插入时获取CacheItemRemovedCallback选项的帮助.使用此参数和CacheItemRemovedReason参数,可以记录从缓存中删除对象的原因.原因

>已删除 – 您的代码已通过调用“插入”或“删除”方法从缓存中删除了该项.
> Expired – 项目已从缓存中删除,因为它已过期.
>未充分利用 – 当系统内存不足时,它会通过从缓存中删除项目来释放内存.
> DependencyChanged – 项目已从缓存中删除,因为与其关联的缓存依赖项已更改. (在你的情况下它是无效的)

希望这些信息可以帮助您.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读