首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET异步缓存

ASP.NET异步缓存
EN

Stack Overflow用户
提问于 2011-07-14 17:23:53
回答 1查看 1K关注 0票数 4

首先,我认为我应该链接到这篇文章,它几乎完成了我的任务。

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

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

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

在我之前链接的文章中,答案完美地设置了缓存更新,但我不认为它是异步的。这个问题首先是使用Page.RegisterAsyncTask异步地完成的。问题1,,我似乎找不到任何信息,说明这是否允许异步进程继续,即使用户离开了页面?

问题2,,有人对如何做到这一点有一个好主意吗?我有一些代码,但它已经变得非常长,而且似乎仍然不能正常工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-14 19:22:04

问题1 (RegisterAsyncTask)

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

问题2

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

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

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

对不起,我没有一个防弹的答案给你(我要盯着这条线--也许还有另一条!)但是正如我所说的,我已经成功地使用了这种方法,除非您的系统负载非常高,否则它应该有助于解决这个问题。

编辑:基于OP的评论,对上述方法的一个轻微的扭曲

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6697397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档