繁体   English   中英

有什么方法可以使用外部进程(即不通过页面的后台代码)来缓存对象?

[英]Any way to cache an object using an outside process (i.e. not through a page's code-behind)?

我已经有了我的ASP.NET Web应用程序所需的第一批真正的海量数据。 到现在为止(实际上已经有两年了!),没有任何事情如此昂贵,以至于我不能只在Page_Load上完成它或将其存储在ViewState或Session中。 但是现在,我需要一个对象列表,该对象保持相当静态(最多每天更新一次),并包含约5000个对象,并且每次在Page_Load上对其进行构建都会导致加载时间受到明显影响。

关于缓存的一些Google搜索显示了一些非常基本的示例,例如使用Cache["myStuff"] = myObject; 一切都很好。 但是我想知道是否可以通过某种方式将Web应用程序设置为在特定时间运行更新,而不管是否正在访问或使用该应用程序。

例如,我希望此过程可以将列表更新为每天凌晨4:00运行一次,而此时没人使用任何东西。 因此,假设在下午的第1天,Page_Load检查以获取缓存的对象,但是它返回null,因此,在这种情况下,请咬紧牙关,并请求/构建第1天其余时间的列表,并将其存储在缓存中。 在第一天的剩余时间里,没有人需要构建对象,因为它位于缓存中并且仍然有效。

第1天结束,现在是第2天凌晨4:00。没有人使用任何页面。 我希望删除从第一天开始存储在缓存中的对象,以便人们在早上到达办公室时,第一个访问该页面的人今天不需要构建该列表,已经完成了。

我唯一的想法是研究创建一个可在Windows预定任务等上运行的控制台应用程序。 但是即使那样,我仍然不确定如何从这样的外部应用程序与ASP.NET Web应用程序进行交互。

希望我有道理。 我想实现的目标甚至有可能吗?

如果使用像MemCached这样的分布式缓存,则可以创建Windows服务或控制台应用程序以填充缓存。 由于两个应用程序(服务和Web应用程序)将使用相同的缓存,因此可以解决您的问题。

另一个解决方案是为此设置一个页面(即/startcache.aspx),该页面将在page_load上执行cachin。 您可以安排对该页面的请求。 您还可以使用某种防火墙从Web应用程序外部隐藏页面(因此,没有人可以访问该页面!)。 最后,该解决方案的优点是您可以重用当前代码,因为它将在同一项目中工作。

希望能帮助到你。

Redis是进程外第三方缓存/键值存储区之外的另一种选择。

为了减少服务器和后端的负载并提供所有每日数据(据我从问题中了解)

为什么不创建数据文件(CSV,XML,JSON)并将其作为数据点提供。

从您的问题看来,客户端(应用程序)能够针对该数据集运行自己的查询。

创建这样的文件可以在固定的时间集上完成,然后保存一次即可。 无需包括第三方方的解决方案(除了其值得尊敬的品质)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM