gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:28:20 25 4
gpt4 key购买 nike

有人可以在这里帮助我吗?我有以下代码来存储和查看捕获,但是,它不起作用。即使我将它设置为 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;
}

最佳答案

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

  • 如果修改 web.config , IIS 关闭旧实例并慢慢将流量转移到新实例,在此过程中内存被回收。 如何检查这个 :您可以通过检查 AppDomain.IsFinalizingForUnload 来检测这种情况。并在回调期间记录下来。
  • Application Pool Recycling : IIS中有一个配置,如果IIS进程空闲了指定的时间,它就会根据这个配置来回收它。您可以在服务器上进行检查,并增加此时间或完全禁用回收。
  • 每个进程对它可以消耗多少内存都有限制,如果你在内存中添加过多的对象,会增加IIS的内存消耗,并且在关键时刻操作系统会回收进程。

  • 编辑

    在您的程序中添加 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方法。
  • 已过期 - 该项目已从缓存中删除,因为它已过期。
  • 未充分利用 - 当系统内存不足时,它通过从缓存中删除项目来释放内存。
  • 依赖性已更改 - 该项目从缓存中删除,因为与其关联的缓存依赖项发生了变化。 (在您的情况下它无效)

  • 希望这些信息对您有所帮助。

    关于asp.net - 缓存在它应该到期之前到期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8981565/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com