2010-01-21 95 views
1

我目前有一個LINQ 2 SQL數據模型和一個支持'Passenger'存儲庫類。該庫如下(從我的頭頂,使代碼可能有錯誤):在數據訪問層ASP.NET緩存(最佳實踐問題)

public class PassengerRepository 
{ 
    public static Passenger GetPassenger(int passengerId) 
    { 
     Passenger p = null; 
     // Linq to sql code to retrieve passenger by passengerId and store in 'p' 
     return p; 
    } 

    public static Passenger GetPassengerByUrl(string passengerUrl) 
    { 
     Passenger p = null 
     // Linq to sql code to retrieve passenger by passengerUrl and store in 'p' 
     return p; 
    } 
} 

在此之上,我有一個PassengerController類,如下所示:

public class PassengerController 
{ 

    public static Passenger GetPassenger(int passengerId) 
    { 
     if (Cache["Passenger_" + passengerId] != null) 
      return (Passenger)Cache["Passenger_" + passengerId]; 

     Passenger p = null; 
     p = PassengerRepository.GetPassenger(passengerId); 

     Cache["Passenger_" + passengerId] = p; 
     return p; 
    } 

    public static Passenger GetPassenger(string passengerUrl) 
    { 
     if (Cache["PassengerUrl_" + passengerUrl] != null) 
      return (Passenger)Cache["PassengerUrl_" + passengerUrl]; 

     Passenger p = null; 
     p = PassengerRepository.GetPassengerByUrl(passengerUrl); 

     Cache["PassengerUrl_" + passengerUrl] = p; 
     return p; 
    } 

} 

PassengerId和PassengerUrl對於特定的乘客來說總是獨一無二的

我的問題是,我存儲乘客對象的副本,如果由Id或Url獲取,因爲緩存鍵將不同。當我通過Id獲取數據時,我將其存儲在高速緩存中,其中有一個依賴於PassengerId的密鑰,因此我無法檢查該Passenger對象是否已經存儲在特定的Url中。這適用於另一種方式,如果通過Url獲取,我無法檢查緩存中是否存在特定Id的Passenger對象。我的問題是:

  1. 會是什麼,如果通過任一網址或ID只讀取存儲在緩存中的乘客對象的一個​​實例的最佳方法?我想可能是創建一個Caching包裝器,然後當通過Url獲取時,也許一旦我得到Passenger數據庫,我通過Id將Passenger存儲在緩存中,然後在Url的緩存中創建一個新密鑰並存儲一個字符串變量使用Passenger Id對象的鍵名。 (即在乘客Url鍵中,我將存儲對乘客Id鍵的引用)。

  2. 在附註中,我將Controller/Repository類中的所有數據訪問方法都視爲靜態 - 這是否是高性能且高效的內存?

  3. 我將緩存放在正確的地方嗎?大多數人把它放在存儲庫類中,還是控制器是可以接受的地方?

任何意見將不勝感激!

乾杯, A.

回答

0

一段時間後再回到這個問題。我認爲這可能是一個相當主觀的問題。對於它的價值,我實際上最終通過從應用程序緩存中的Passenger ID生成的密鑰來存儲乘客,例如Passenger_100。然後,我在密鑰中創建了一個代理對象,該對象將從乘客URL(Passenger_myurl)中生成,該對象充當Passenger_100密鑰的參考。

0

如果你給你的系統的一些詳細信息,我們可能會更有幫助。例如你會有多少乘客?如何厲害的是你的服務器等等,等等

但與給定的信息,我可以說:

  1. 你可以找到它們後緩存陣列中的乘客的對象。 然後當你想在這個數組中搜索另一個搜索優先搜索。如果在您的列表中找不到乘客,則轉到數據庫,獲取乘客信息,將pasenger信息添加到您的陣列並返回找到的乘客信息。

  2. 這種方式在我看來很好。我們也在一些中等規模的網站中使用。如果有人顯示更好的選擇,我會很感激。

+0

你好,會用這個數組方法增加更多的開銷嗎?此外,如果我更新乘客數據,那麼我想從緩存中刪除陳舊的數據,並且使用該數組似乎會增加更多的複雜性/開銷。 乘客人數約爲100,000人。 – romiem 2010-01-21 12:31:20

+0

如果你要去一個數據庫(1.打開連接,2.運行一些查詢,3.關閉連接),那麼我認爲我的方法應該工作得更快。但我在這裏假設你不經常搜索乘客。例如,如果您將乘客緩存了半個小時,那麼您的數組大小不應超過10000個元素。 你說的很複雜。當您更新乘客時,您還應該更新/清理陣列中的數據。 – 2010-01-21 12:38:57