为什么我的缓存数据会消失?

时间:2011-11-17 19:39:33

标签: c# wcf caching

我创建了一个运行无限循环的WCF方法,每5分钟轮询一次。它将2个项目写入缓存,我正在检索的主要项目和LAST_POLLED。这是在我们网站的应用程序启动时成功调用的:

//infinite loop
        while (true)
        {
            try
            {
                _cache.RefreshCache();
                WcfCache.SetCache(LAST_POLLED, DateTime.Now);
            }
            catch(Exception ex)
            {
                //logging exception to database
            }

            //essentially polling interval, though dependent on how long it takes to complete task
            Thread.Sleep(Polling_DELAY);
        }

LAST_POLLED日期时间应该有轮询的时间。但有时,它存储于1月1日,0001。我想这必定是因为缓存消失了。此WCF站点的应用程序池未设置为Recycle NOR是工作进程在空闲后设置为关闭的。这将一次使用几天,但还没有工作整整一周。

  1. 为什么此缓存会重置?
  2. 有更好的方法来编码吗?我不想为此创建一个单独的Windows服务来减少项目/应用程序的数量,但我可以。

3 个答案:

答案 0 :(得分:2)

我不确定您使用的缓存类型,但根据定义,事件可能会从cache中消失。缓存用于加速数据访问,而不是数据持久性。

对于数据持久性,您应该使用数据存储。数据存储可以是基于sql的(例如mysql),甚至是键值(no-sql,例如membase)。在这种情况下,这些对你很有帮助。

此外,您似乎正在使用busy-wait。那也是not ideal

BTW,01-01-0001是DateTime.MinValue

编辑:

另一个想法#1:你也可以将东西保存在机器的内存中,例如使用静态变量。它不会被持久化或分发,但它可以满足您的需求。

另一个想法#2:我不认为你必须把东西放在缓存中并确保它在5分钟的时间间隔内存在。使用缓存机制的另一种方法如下:

  1. 获取数据请求。
  2. 检查它是否在缓存中。
  3. 如果是 - 退货。
  4. 如果不是 - 获取数据,缓存,返回。

答案 1 :(得分:1)

由于这是一个ASP.Net应用程序,还有其他因素可能导致IIS重新启动应用程序并丢失缓存。

除了你已经提到的内容之外,最有可能的是“触摸”web.config或bin目录中的文件。我们已经看到备份程序,防病毒应用程序和“有用”用户都以这种或那种方式导致此问题。

此外,检查事件日志以查看IIS是否报告应用程序池中的应用程序崩溃也没有什么坏处,这也会导致此问题。

答案 2 :(得分:0)

此博客文章虽然没有专门针对您的主题,但确实提供了一些有关可能导致您的应用资源池被回收的信息。

http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

  

IIS本身将每29小时回收整个w3wp.exe进程。   它只是直接在w3wp.exe进程中设置上限并将其关闭   所有的应用域都有它。

它还包含一些可以解决您的问题的信息(HostingEnvironment.RegisterObject)