2014-06-06 62 views
0

是否有任何理由緩存這樣的服務WebMethod,它返回一個非數據庫需要的響應?移動應用程序將使用此服務呼叫每天檢索一次代碼。假設100萬個用戶負載服務器。緩存當前設置爲一個小時。靜態值的Web服務緩存

<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 
+2

作爲一個方面說明:你是雙重序列化你的返回值。 –

+0

我明白你在說什麼,但我無法弄清楚如何在沒有這樣做的情況下獲得我想要的輸出。 –

+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設置爲只有一個小時:將其設置爲最大值。當您更換程序集時,應用程序池將回收並緩存需要重建。