有没有理由缓存像这样的服务WebMethod,它返回一个非数据库要求的响应?移动应用程序将使用此服务调用每天检索一次代码。假设有100万用户用于服务器负载。缓存当前设置为一小时。
<WebMethod(CacheDuration:=3600)> _
Public Function GetIDs() As String
Dim myArray(4) As Object
myArray(0) = New With {Key .id = "one", .name = "1", .passcode = ""}
myArray(1) = New With {Key .id = "two", .name = "2", .passcode = ""}
myArray(2) = New With {Key .id = "three", .name = "3", .passcode = ""}
myArray(3) = New With {Key .id = "four", .name = "4", .passcode = ""}
myArray(4) = New With {Key .id = "five", .name = "5", .passcode = ""}
Dim js As JavaScriptSerializer = New JavaScriptSerializer()
Dim sJSON As String = js.Serialize(myArray)
Return sJSON
End Function
答案 0 :(得分:1)
是。
我的直觉说“是”。序列化花费了cpu时间,缓存命中发生在pipleline的早期,所以在缓存这些请求时你肯定会看到改进,即使它们没有访问数据库。在缓存中存储这样的数据只会使用无关紧要的内存量,因此任何改进都足够好。
我确信你不相信我的直觉,但你没有理由。我写了一个测试webservice,它有你的测试方法(相同),还有一个非缓存版本要比较(相同但是对于CacheDuration属性)。我使用以下客户端来比较两种方法之间的性能:
static void Main(string[] args)
{
var stopwatch = new Stopwatch();
var tasks = new List<Task>();
stopwatch.Start();
for (var x = 0; x < 10; x++)
{
tasks.Add(Task.Factory.StartNew(() =>
{
using (var service = new localService.TestService())
{
for (var i = 0; i < 100; i++)
{
var ids = service.GetIDs();
}
}
}));
}
// completion order should be about the same as order in the list
// let's not worry too much
tasks.ForEach(d => d.Wait());
stopwatch.Stop();
var timeElapsed = stopwatch.ElapsedMilliseconds;
Console.WriteLine(timeElapsed);
}
我的旧笔记本电脑上的结果是:
我分别进行了5次跑步并平均了时间。您的测量结果可能不会显示出这么大的差异。在这种方法上使用缓存似乎仍然是足够的理由。
另外:如果方法没有命中数据库,我猜这些值会被编译到程序集中。在这种情况下,我认为没有理由将cacheDuration设置为仅一小时:将其设置为最大值。当您更换程序集时,应用程序池将重新循环,并且无论如何都需要重建缓存。