在线市场中保存数据库访问





4.00/5 (1投票)
用于在严格周期内更改的数据的缓存技术

引言
考虑一下在线市场中的[汇率]。这些数据必须存储在数据库中,开发人员将在货币兑换计算中使用它们。鉴于汇率每天固定在早上6点定期更改一次,这意味着在24小时内数据不会改变。那么,如果我们已经有了数据,就没必要每次需要时都访问数据库,直到第二天早上6点。如上图所示,用Web服务器本地XML数据替代真实的数据库数据可以减少数据库访问,最终让数据库“更轻松”。
在这里,我描述了我在一个在线汽车市场中缓存定期更新数据的方法。由于汽车的信息和广告变化不频繁,这可以算作一个很好的例子。
在.NET中,有一个类似的技术叫做部分页面缓存。我将在本文后面回顾它。
示例
- 首先打开并执行“SetUp_JustExecute.sql”文件。这将创建一个数据库、一个账户和一个表。
- 在Visual Studio中打开解决方案文件。这是一个Web应用程序项目。生成并执行。您将在Web浏览器中看到以下内容。
确保缓存或XML文件已在项目文件夹中创建。
Using the Code
- 通过添加WebPageXmlCaching.cs到您的.NET项目中,导入
WebPageXmlCaching
命名空间。您将只使用该命名空间中的WebPageXmlCachingAPI
类和Periodicality
类。 - 确定您的代码中哪个部分需要缓存。围绕高成本数据库查询的代码将是主要目标。
- 用A、B两个块包裹代码区域。您需要更改一些变量。(点击放大)
A. 注意"CarSpec"和Request.QueryString["carno"];XML缓存文件将被创建为“[页面名称]/CarSpec_[carno].xml”。如果您不希望针对“carno”生成不同的缓存版本,只需将其设置为“”,即
'WebPageXmlCachingAPI.GetCacheInXml(Request, "CarSpec", "", ref strXMLCarSpec);
'<% string strXMLCarSpec = null; WebPageXmlCachingAPI.GetCacheInXml(Request, "CarSpec", Request.QueryString["carno"], ref strXMLCarSpec); if (strXMLCarSpec != null ) Response.Write(strXMLCarSpec + " [Data from the cached XML, not from DB]"); else { WebPageXmlCachingAPI.StartRecordingResponse(Response); %>
B. 注意Periodicality(...);您应该指定缓存何时更新。
<% string strHTMLCache = WebPageXmlCachingAPI.StopRecordingResponse(Response); // at PM 8:00 every monday. There are more methods in // Periodicality class to tweak the cycle. Periodicality prd = new Periodicality (DayOfWeek.Monday, TimeSpan.FromHours(20)); // Save in a xml file WebPageXmlCachingAPI.SetCacheInXml(Request, "CarSpec", prd, Request.QueryString["carno"], strHTMLCache); } %>
注意两对方法:
Get
/Set
和Start
/Stop
。您可能知道如何使用它们。WebPageXmlCachingAPI.GetCacheInXml(Request, "CarSpec", "", ref strXMLCarSpec); WebPageXmlCachingAPI.StartRecordingResponse(Response); WebPageXmlCachingAPI.StopRecordingResponse(Response); WebPageXmlCachingAPI.SetCacheInXml(Request, "CarSpec", prd, "", strHTMLCache);
- 编译并执行。在第一次执行时,汽车数据将来自数据库。但**从下一次执行开始**,数据(HTML片段)将来自本地XML文件。您将体会到页面打开的速度有多快,因为它不访问数据库。确保缓存文件已创建。在过期时间之前,Web服务器将继续用本地XML缓存替换远程数据库数据。
讨论
我猜在每个在线市场中都会发生这种情况:商品信息通常在一段时间内不会改变。因此,定期更新的数据可以很容易地识别为缓存目标,以减少数据库的开销。
可能存在许多类似的技术,包括.NET中的部分页面缓存。
//After deploying a 'user control' on page, specify below
<%@ OutputCache Duration="3600" VaryByParam="carno" %>
//the cache will be expired after 60 minutes and
//the cache will create and manage different versions
//of cache based on URL parameter 'carno'
但假设我要显示5000件商品。不幸的是,我并不完全信任.NET中这个用户控件缓存背后的机制,尽管我猜它一定非常高效。
此外,'持续时间'不符合我的需求。假设数据每天早上6点更新。如果页面在早上5:59被调用,接下来会发生什么?过期的、无意义的数据将持续到早上6:59(3600秒)。存在基于绝对时间的缓存过期,但这种过期只发生一次。在这种情况下需要自动重复。
所以我发明了我自己的缓存
- 通过直接打开XML文件来亲眼验证缓存内容
- 定期、更精确地更新缓存
- 适用于非.NET的其他Web服务器环境
尽管我已尽力简化A和B块,但上面的代码已是我的最佳实践。抱歉C#中宏的使用非常有限。宏可以在一个简单的函数中生成长代码。也许其他语言可以使用宏更简单地应用这种缓存技术。
进一步研究
- 用于“汇率”类数据缓存的框架
我将HTML片段缓存到了XML文件中的CDATA
标签中。但是,如果将XML文件用作一个定期与大型数据库同步的只读小型数据库呢?这是可能的,因为数据库模式可以无损地转换为XML。
设想一个数据库访问框架,它将远程数据库和本地XML数据都封装在其中。虽然Web程序员可以通过这个框架的接口发送数据库查询,就像他们以前做的那样,但这个框架将在远程数据库和缓存了主数据库的本地XML之间选择数据源来返回数据。
我听说Microsoft SQL Server提供了一个可以用于此目的的功能:SSRS(SQL Server Reporting Services)。不幸的是,我对它了解不多。目前,我猜测那些希望将大部分业务逻辑存储在Web服务器而不是数据库中的人,会更倾向于将缓存规则的代码也放在Web服务器而不是SSRS中。 - 将此技术扩展到其他网页,而不仅仅是.NET
我希望将上述想法实现为一个服务器端COM对象,如果Web服务器是Microsoft产品,那么该对象将有机会被各种服务器语言使用。
历史
- 文章创建。