静态值的Web服务缓存

时间:2014-06-06 18:39:39

标签: asp.net .net vb.net caching iis

有没有理由缓存像这样的服务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

1 个答案:

答案 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);
}

我的旧笔记本电脑上的结果是:

  • 非缓存方法:8秒
  • 缓存方法:1.5秒

我分别进行了5次跑步并平均了时间。您的测量结果可能不会显示出这么大的差异。在这种方法上使用缓存似乎仍然是足够的理由。

另外:如果方法没有命中数据库,我猜这些值会被编译到程序集中。在这种情况下,我认为没有理由将cacheDuration设置为仅一小时:将其设置为最大值。当您更换程序集时,应用程序池将重新循环,并且无论如何都需要重建缓存。