有人可以帮助我吗?我有以下代码来存储和修复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", replyList, null, Cache.NoAbsoluteExpiration, 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;
}
答案 0 :(得分:7)
ASP.net缓存是内存中的,因此如果您的IIS进程或应用程序池回收,它将变得清晰。您可以检查以下可能导致流程再循环的事项
web.config
,IIS将关闭旧实例并慢慢将流量传输到新实例,在此过程中内存将被回收。 如何检查:您可以通过检查AppDomain.IsFinalizingForUnload并在回调期间记录来检测此情况。修改强>
在您的程序中,您要将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", replyList, null,
Cache.NoAbsoluteExpiration, 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", replyList, null, Cache.NoAbsoluteExpiration, 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参数,您可以记录从缓存中删除对象的原因。原因
Insert
或Remove
方法从缓存中删除了该项。希望这些信息对您有所帮助。
答案 1 :(得分:1)
为了追踪你的项目是否从缓存中移除,我建议使用HttpRuntime.Cache.Insert
方法的不同重载,以允许您指定CacheItemRemovedCallback回调函数。
除此之外,您的缓存代码似乎很好。但是,一旦您更改代码以指定回调,请记录弹出原因,这可能会让您更好地了解缓存项目变清的原因。
与大多数其他答案一样,我怀疑您的应用程序因各种原因而被回收/重置。我认为生产机器上的大多数应用程序每天至少回收一次,尤其是在共享托管环境中。所以我猜你的数据最多会保留一天。
答案 2 :(得分:0)
缓存位于内存中,并在应用程序回收时过期。我猜你正在开发机器上评估这个问题,因为流量低或文件编辑导致应用程序回收。
答案 3 :(得分:0)
由于多种原因,您的缓存对象可能会被修剪...
AppDomain回收。 记忆压力。 崩溃。 使用Web Garden。 负载均衡。 等等...
这篇文章应该澄清一点......
答案 4 :(得分:0)
在AddVideoComment()方法中,将缓存项插入行更改为:
HttpRuntime.Cache.Insert("videoComment", replyList, null, Cache.NoAbsoluteExpiration, TimeSpan.FromDays(14),CacheItemPriority.NotRemovable,null);
在VideoCommentList()方法中,使用:
if (HttpRuntime.Cache["videoComment"] == null)
{
replyList = VideoCommentList();
HttpRuntime.Cache.Insert("videoComment", replyList, null, Cache.NoAbsoluteExpiration, TimeSpan.FromDays(14),CacheItemPriority.NotRemovable,null);
}
无需使用HttpRuntime.Cache.Remove("videoComment");
作为HttpRuntime.Cache.Insert(
将替换现有的缓存项。
干杯, DeveloperConcord