gpt4 book ai didi

asp.net - 为 ASP.NET 中的第一个访问者设置缓存对象

转载 作者:行者123 更新时间:2023-12-03 13:20:06 25 4
gpt4 key购买 nike

我有一个网站,它将从数据库中检索一些大量数据并将其存储到缓存对象中。但是,在高峰时段,如果缓存对象过期,所有用户同时检索数据,我的网站会变得非常慢(CPU 100%),网站和数据库之间的连接会超时。结果,缓存对象将变为空。

我的临时解决方案是,每次缓存对象过期时。我必须通过将所有用户重定向到静态页面来停止所有用户。然后清除缓存对象,以管理员身份访问页面(目前只允许管理员访问)生成缓存对象。之后,我将再次启用该页面,用户可以照常访问该页面。

我在想,是否可以在缓存对象过期时创建缓存对象,仅在第一个访问者访问该页面时创建缓存对象(在高峰时段,可能多达 50 个用户同时访问该页面时间),其余访问页面的用户必须等到缓存对象被创建(阻止他们调用创建缓存对象模块)。

当前它的工作原理是每次用户访问此页面时,它都会检查缓存对象。如果为空,则检索 HeavyData从数据库。

if (Cache[ID] == null)
{
HeavyData = RetrieveHeavyDataFromDatabase(); // retrieve data from db
Cache.Insert(ID, HeavyData, null, DateTime.Now.AddMinutes(720)), System.Web.Caching.Cache.NoSlidingExpiration);
}

最佳答案

问题可能是多个请求正在尝试重新创建缓存。

只需在单例周围添加一个锁定对象和一个 if-lock-if 包装器。这仍然会阻止每个请求,直到填充缓存,但会确保只有 1 个请求会进入繁重的进程。

http://en.wikipedia.org/wiki/Double-checked_locking

private static object lockObject = new object();

if (Cache[ID] == null)
{
lock(lockObject)
{
if (Cache[ID] == null)
{
HeavyData = RetrieveHeavyDataFromDatabase(); // retrieve data from db
Cache.Insert(ID, HeavyData, null, DateTime.Now.AddMinutes(720)), System.Web.Caching.Cache.NoSlidingExpiration);
}
}
}

关于asp.net - 为 ASP.NET 中的第一个访问者设置缓存对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21515289/

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