我目前有一個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對象。我的問題是:
會是什麼,如果通過任一網址或ID只讀取存儲在緩存中的乘客對象的一個實例的最佳方法?我想可能是創建一個Caching包裝器,然後當通過Url獲取時,也許一旦我得到Passenger數據庫,我通過Id將Passenger存儲在緩存中,然後在Url的緩存中創建一個新密鑰並存儲一個字符串變量使用Passenger Id對象的鍵名。 (即在乘客Url鍵中,我將存儲對乘客Id鍵的引用)。
在附註中,我將Controller/Repository類中的所有數據訪問方法都視爲靜態 - 這是否是高性能且高效的內存?
我將緩存放在正確的地方嗎?大多數人把它放在存儲庫類中,還是控制器是可以接受的地方?
任何意見將不勝感激!
乾杯, A.
你好,會用這個數組方法增加更多的開銷嗎?此外,如果我更新乘客數據,那麼我想從緩存中刪除陳舊的數據,並且使用該數組似乎會增加更多的複雜性/開銷。 乘客人數約爲100,000人。 – romiem 2010-01-21 12:31:20
如果你要去一個數據庫(1.打開連接,2.運行一些查詢,3.關閉連接),那麼我認爲我的方法應該工作得更快。但我在這裏假設你不經常搜索乘客。例如,如果您將乘客緩存了半個小時,那麼您的數組大小不應超過10000個元素。 你說的很複雜。當您更新乘客時,您還應該更新/清理陣列中的數據。 – 2010-01-21 12:38:57