2010-11-26 87 views
4

我正在從Web服務中讀取第三方提要中的數據,稍微修改並存儲它,然後將其返回給我的客戶端。它只需要定期從第三方網站進行更新。它將作爲Azure中的Web角色中的WCF服務運行。如何在c#中構建Web服務緩存#

起初,我以爲我只是總讓我parsefeed方法的調用,但作出這樣的調用返回,如果最後一次更新是太快了...

public void ParseFeed() 
    { 
     if (DateTime.Now > lastrun.AddMinutes(1)) 
     { 
     //Fetch updated data into something shared here. 
     //thedata is a public static in Global class 
     thedata = fetchdata(); 
     lastrun=DateTime.Now;    
     } 
    } 

但我想,作爲可以取需要1-2s(它是一種網絡服務),多個用戶會一次點擊該代碼。

http://support.microsoft.com/default.aspx?scid=kb;en-us;Q312607從 因爲任何類的靜態成員,包括一個應用程序類,不是線程安全,用戶代碼必須提供用於訪問靜態成員適當的鎖定。這適用於您添加到應用程序類的任何靜態成員。

  • 我可以使用鎖(不知道如何)編輯:大量的信息here

  • 我能避免靜止無功,並使用高速緩存,並把我的數據在它(但會在過期時將被刪除,並且多個用戶會嘗試獲取數據)

  • 我可以使用緩存中包含假數據(基本上是一個計時器)並在該數據過期時刷新 - 但即使沒有人正在擊中該網站。 (也可能不是線程安全的)

  • 我無法真正使用輸出緩存,因爲客戶端以可能使每個請求唯一的方式查詢我返回的數據:我的服務根據請求排序和篩選

順便說一句我不擔心Azure上的多個實例的結果的一致性。每個人都可以自己獲取,所以我不需要在多臺服務器上共享狀態。

我覺得有一個簡單的解決方案,我完全錯過了。想法?

+0

我發現了這個http://stackoverflow.com/questions/39112/what-is-the-best-way-to-lock-cache-in-asp-net#40065,它顯示瞭如何管理鎖。這可能適用於大多數選項,並且仍然存在是否使用緩存,靜態變量或者是否有更簡單的機制的問題 – Andiih 2010-11-26 09:53:24

回答

1

從你的問題,它看起來像:

  • 這是不能接受的服務的數據是超過一分鐘過時
  • 這是可以接受的,如果兩個服務實例返回由於刷新時間不同的數據不同步的
  • 它是可以接受的呼叫者至框1-2秒,同時數據被刷新

假設這些都爲真,則最簡單的解決方案只是使用一個靜態變量來存儲數據,圍繞整個檢查/刷新塊構建一個lock構造。我甚至不打算像雙重鎖定模式那樣聰明地做任何事情;鎖定爭用根本不會成爲一個問題,因爲在關鍵區域花費的時間與運行Web服務的開銷相比是微不足道的,除非它阻止並且每個人都必須阻止。

+0

我實際上說過,一旦數據大約過了一分鐘,它就會獲得新的時間數據(即,在提供陳舊數據時啓動背景非阻塞刷新會更好)。另一方面,如果數據說過時(過夜不使用),那麼我需要阻止提取並返回。 – Andiih 2010-11-26 12:42:06

1

由於您可能將從緩存中讀取的內容超過您將要寫入的內容,因此我會使用ReaderWriterLockSlim來確保數據可以被多個線程同時讀取但未寫入。我也會確保緩存的數據是不可變的,以確保它不會被用戶改變。