2009-11-19 80 views
1

只是一個關於Microsoft Velocity的隨機查詢。Memcached/Microsoft速度性能問題

情景: 說,我想從我的數據庫的所有訂單。在SQL中,這很好,我可以做SELECT OrderId,TotalCost... from Orders。這是我的數據庫的一次往返,每個人都很開心。

現在,如果我使用Memcached的或(如我現在使用)微軟速度(CTP3),有沒有簡單的方法來做到這一點。我看到的兩個選項是(僞代碼)

FOR EACH ORDER 
    Order = cache.TryGet(OrderId) 
    if Order is null 
      Order = db.Get(OrderId) 
END FOR EACH 

這將是往返LOADS。

另外,還要考慮我想通過客戶拿到訂單

SQL:Select OrderId....TotalCost from Orders where CustomerId = MyCustomerId

一個來回,大家都高興。

使用緩存解決方案有兩種解決方法我看到真的:

解決方案1:

DOES CustomerOrderIdsForCustomerId EXIST 
    NO 
      POPULATE CustomerOrderIdsForCustomerId FROM DATABASE 
    YES 
      FOR EACH OrderId IN CustomerOrdersForCustomerId 
        cache.TryGet(OrderId) 
        IF Order IS NULL 
         Order = db.Get(OrderId) 
      END FOR EACH 

方案二是保持在它自己的高速緩存對象中的所有客戶訂單的序列化列表。減少往返旅程,但似乎跛腳。

有人可以闡明這一情況好嗎?

回答

0

請記住,緩存不應該對任何數據(在你的情況下訂單)的永久存儲。在這種情況下,緩存可以幫助您從數據庫服務器中刪除一些負載,但必須先將緩存中的訂單加載到緩存中才能檢索它們。據說,如果你使用速度避免循環訪問集合,這裏有幾個選項需要考慮。但是,您將始終需要找出一種方法來處理不在緩存中的數據。

選項1:使用地區

您可以創建一個區域,並從該地區的所有對象的一個​​電話。在您的情況,您可以創建一個訂單區域,您可以存儲所有的訂單,然後使用GetObjectsInRegion方法來獲取緩存中的所有訂單。但是請注意,這會返回緩存中的所有訂單......這可能會或可能不會包含數據庫中的所有訂單。

選項2:使用地區和標籤

速度可以讓你標記你放入緩存區域對象,然後使用這些標籤檢索。因此,在您的情況下,您可以使用「訂單」標籤標記訂單對象,然後使用GetObjectsByTag方法檢索它們。既然你可以使用多個標籤,你也可以用他們的客戶id標籤標記它們,然後以這種方式拉出它們。

這兩個選項都與一些注意事項,所以一定要對文檔的閱讀起來: Velocity Tag BasedMethods

1

僅僅因爲你有一個緩存並不意味着你必須使用它,每次查詢!在這種情況下,如你已經確定的那樣,這並不能真正幫助你,我可能會直接進入數據庫來處理這類事情。
雖然這取決於您的應用程序 - 如果您認爲客戶經常會查看他們的訂單歷史記錄,或者您有一些功能正在分析訂單以查看哪些產品很熱,那麼您可能希望使用一些緩存來保持你的SQL服務器的負載。在這種情況下,我可能會在緩存中放入訂單的DataTable或訂單集合,並使用LINQ查詢它以顯示客戶的訂單。

+0

我同意你不應該總是使用緩存。我會說,是說我擁有訂單集合(或者甚至將所有訂單存儲在其自己的區域中),以便使用LINQ語法返回所有訂單: var x =來自Orders in dc .GetOrdersInRegion(「訂單」) select Orders.Value; 然後以這種方式遍歷它們。 如果我想要的訂單爲特定客戶,我會做 變種X =從dc.GetOrdersInRegion訂單(「訂單」) 其中((訂單)Orders.Value).CustomerId == customerGuid 選擇Orders.Value ; 兩者將具有相同的網絡流量 – sjhuk 2009-11-25 11:22:17

+0

+1。通過一些易失性存儲器高速緩存查詢所有行只是沒有意義。 – filiprem 2009-12-21 21:44:08