我有一个ASP.NET页面,其中有一个基于计时器的脚本,在服务器上调用WebMethod。
这是aspx上的脚本:
function AutoRefreshPage() {
$.ajax({
type: "POST",
url: pageUrl + "/GetSomeData",
data: JSON.stringify({
par1: 'a',
par2: 'b',
par3: 'c'
}),
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function (response) {
var objMain = $.parseJSON(response.d);
// Update data on page...
// Re-trig method in 30 sec
setTimeout(AutoRefreshPage, 30000);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
console.log("Error");
// Re-trig method in 30 sec
setTimeout(AutoRefreshPage, 30000);
}
});
}
以下是网络方法:
namespace MyNameSpace
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
[System.ComponentModel.ToolboxItem(false)]
public class AjaxServiceProxy : System.Web.Services.WebService
{
[WebMethod(EnableSession = true, CacheDuration = 120)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string GetSomeData(string par1, string par2, string par3)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
// Read from DB (takes abour 10 sec)
var reply = GetSomeDataFromDB(par1,par2,par3);
return serializer.Serialize(reply);
}
}
}
它猜测缓存是否正常工作......在第一次调用GetSomeData时,数据库被命中并获取数据并保存在缓存中。任何进一步的调用(具有相同的参数值)都会返回缓存的数据。当120秒的缓存期满时,清除缓存并再次从DB读取数据。现在我的问题 - 当调用客户端的数量增加(每个都有基于计时器的刷新)时,很可能在缓存过期之后有几次调用GetSomeData但是在刷新缓存之前。结果将对DB进行多次调用 - 所有数据都读取相同的数据。这就是我在第一时间真正想要避免的 - 使用缓存输出!有没有优雅的方法来避免无效缓存的时间差距?