Я кеширую данные на веб-сайте ASP.NET через System.Web.Caching.Cache-Class, потому что получение данных очень дорого, и оно меняется только время от времени, когда наши сотрудники изменяют данные в бэкэнде..
Поэтому я создаю данные в Application_Start и сохраняю их в Cache со сроком действия 1 день.
При доступе к данным (происходит на многих страницах веб-сайта), у меня естьчто-то вроде этого сейчас в статическом классе CachedData:
public static List<Kategorie> GetKategorieTitelListe(Cache appCache)
{
// get Data out of Cache
List<Kategorie> katList = appCache[CachedData.NaviDataKey] as List<Kategorie>;
// Cache expired, retrieve and store again
if (katList == null)
{
katList = DataTools.BuildKategorienTitelListe();
appCache.Insert(CachedData.NaviDataKey, katList, null, DateTime.Now.AddDays(1d), Cache.NoSlidingExpiration);
}
return katList;
}
Проблема, которую я вижу с этим кодом, заключается в том, что он не является потокобезопасным.Если два пользователя открывают две из этих страниц одновременно, а кэш-память только что закончилась, существует риск, что данные будут извлечены несколько раз.
Но если я заблокирую тело метода, я столкнусь с производительностьюпроблемы, потому что только один пользователь одновременно может получить список данных.
Есть ли простой способ предотвратить это?Какова лучшая практика для такого случая?