【问题标题】:Web Service Cache For Static Values静态值的 Web 服务缓存
【发布时间】:2014-07-28 02:57:43
【问题描述】:

是否有任何理由缓存像这样返回非数据库所需响应的服务 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

【问题讨论】:

  • 附带说明:您正在对返回值进行双重序列化。
  • 我明白你在说什么,但如果不这样做,我无法弄清楚如何获得我想要的输出。
  • 修复了双重序列化,以防有人使用代码

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


【解决方案1】:

是的。

我的直觉说“是”。序列化会消耗 cpu 时间,并且缓存命中发生在管道的早期,因此在缓存这些请求时肯定会看到改进,即使它们没有命中数据库。将这样的数据存储在缓存中只使用微不足道的内存量,因此任何改进都足够了。

不过,我敢肯定你不相信我的直觉,而且你没有理由相信。我编写了一个小测试 Web 服务,其中包含您的测试方法(相同)和一个非缓存版本进行比较(相同,但用于 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 设置为仅一小时:将其设置为最大值。当您更换程序集时,应用程序池会回收,并且无论如何都需要重建缓存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    相关资源
    最近更新 更多