gpt4 book ai didi

c# - 缓存和线程安全

转载 作者:行者123 更新时间:2023-11-30 15:43:17 25 4
gpt4 key购买 nike

我通过 System.Web.Caching.Cache-Class 在 ASP.NET 网站中缓存数据,因为检索数据的成本非常高,而且当我们的内容人员在后端更改数据时,数据只会偶尔更改一次.

所以我在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;
}

我看到这段代码的问题是它不是线程安全的。如果两个用户同时打开其中两个页面,而缓存刚刚用完,则存在数据被多次检索的风险。

但是如果我锁定方法体,我会遇到性能问题,因为一次只有一个用户可以获取数据列表。

有没有简单的方法来防止这种情况?对于这种情况,最佳做法是什么?

最佳答案

你是对的,你的代码不是线程安全的。

// this must be class level variable!!!
private static readonly object locker = new object();

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)
{
lock (locker)
{
katList = appCache[CachedData.NaviDataKey] as List<Kategorie>;

if (katlist == null) // make sure that waiting thread is not executing second time
{
katList = DataTools.BuildKategorienTitelListe();
appCache.Insert(CachedData.NaviDataKey, katList, null, DateTime.Now.AddDays(1d), Cache.NoSlidingExpiration);
}
}
}
return katList;
}

关于c# - 缓存和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6875898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com