ASP.NET 异步缓存

标签 asp.net vb.net multithreading caching

首先我想我应该链接到 this article这几乎完成了我的任务。

这是我的问题: 我的网站上有一个用户控件,需要缓存一些数据至少 15 分钟,然后再次从数据库中提取数据。问题是从数据库中提取结果大约需要 7-10 秒。

我的想法是,我可以将缓存设置为大约两个小时,然后在缓存对象中设置一个属性来说明对象何时加载(我们将其称为 LoadDate 属性)。然后我会让代码提取缓存的对象。

  • 如果为空,我别无选择,只能同步拉取数据,然后加载我的用户控件
  • 如果它不为空,我想继续将数据从缓存的对象加载到我的用户控件上。然后我会检查 LoadDate 属性。如果已经超过 15 分钟或更长时间,则设置异步进程来重新加载缓存。
    • 需要有一个进程来在更新时锁定缓存对象
    • 我需要一个 if 语句来说明对象是否被锁定,然后就不用更新它了。这将用于其他用户的后续页面加载 - 因为第一个用户已经在更新缓存,并且我不希望一遍又一遍地更新缓存;它应该在第一次调用时更新。请记住,在进行缓存检查之前我已经加载了用户控件

在我之前链接的文章中,答案完美地设置了缓存更新,但我不相信它是异步的。问题始于使用 Page.RegisterAsyncTask 异步执行此操作。 [问题 1] 我似乎找不到任何关于即使用户离开页面是否也允许异步进程继续的信息?

[问题 2] 有人知道如何执行此操作吗?我有一些代码,但它已经变得非常长,而且似乎仍然无法正常工作。

最佳答案

问题 1(RegisterAsyncTask)

要记住的非常重要的事情:从客户端/用户/浏览器的角度来看,这不会使请求异步。如果您注册的任务需要 30 秒才能完成,浏览器仍将等待 30 秒以上。 RegisterAsyncTask 唯一做的就是在异步调用期间将工作线程释放回 IIS。不要误会我的意思——这仍然是一项有值(value)且重要的技术。但是,对于发出该特定请求的用户/浏览器来说,它不会对响应时间产生明显影响。

问题2

这可能不是解决您问题的最佳解决方案,但我过去使用过的方法可能会有所帮助:当您 add your item to the cache 时,指定一个absoluteExpiration和一个onRemoveCallback。创建一个获取新数据并将其放入缓存的函数:这​​是您应该作为 onRemoveCallback 传递的函数。这样,每次缓存数据过期时,都会发生回调以将新数据放回缓存中;由于回调是由于缓存过期事件而发生的,因此没有用户请求等待缓存新数据所需的 7-10 秒。

这不是一个完美的设计。一些注意事项:

  • 最初如何加载缓存?最简单的方法是从 Application_Start 函数调用缓存加载器函数。
  • 每 15 分钟,就会有一个 7-10 秒的窗口,其中缓存为空。在此期间的任何请求都需要自己获取数据。根据您的系统使用模式,这可能是一个可接受的小窗口,并且在此期间只会发生很少的请求。
  • 缓存回调不保证在您的缓存项过期时准确发生。如果系统负载非常重,则在触发回调和重新加载缓存之前可能会有延迟。同样,根据您系统的使用情况,这可能不是问题,也可能是一个重大问题。

抱歉,我没有一个万无一失的答案给你(我会密切关注这个帖子 - 也许另一个 SO'er 会这样做!)。但正如我所说,我使用这种方法取得了一些成功,除非您的系统负载极高,否则它应该有助于解决问题。

编辑:根据OP的评论,对上述方法稍有改动

您可以缓存一个虚拟值,并纯粹使用它来触发您的refreshCachedData 函数。它不是特别优雅,但我以前也做过。 :)

详细说明:将实际缓存的数据保留在缓存中,键为“MyData”,没有过期时间,也没有 onRemoveCallback。每次在“MyData”中缓存新数据时,您还会向缓存添加一个虚拟值:“MyDataRebuildTrigger”,有效期为 15 分钟,并使用 onRemoveCallback 来重建实际缓存的数据。这样,当“MyData”为空时,就不会出现 7-10 秒的间隙。

关于ASP.NET 异步缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6697397/

相关文章:

java - 为什么java中线程通信不起作用?

java - 为什么这里需要同步?

c# - Razor 退出代码块

c# - WPF 中的可滚动文本框不会滚动,因为它比容器大

c# - 身份服务器 4 : Proper logout from MVC Client

vb.net - 使用面板的 Autoscroll = True 在图片框中进行矩形选择以裁剪图像时自动移动滚动条

php - vb.net通过php向mysql数据库添加文本

C++ vector/类/线程

c# - 永远等待本地主机!

c# - Gridview 根据条件动态格式化