在 iis 网站中缓存全局数据
我有只读对象图,它被缓存一分钟,以便所有线程都可以使用它(下面的代码)。
public class ObjectGraphCache
{
static readonly Object storeLock = new object();
public ObjectGraph AllForElection(int ElectionId, System.Web.Caching.Cache cache)
{
string key=string.Format("AllForElection{0}",
ElectionId);
int timout = int.Parse(ConfigurationManager.AppSettings["dbCacheTimeInSeconds"]);
if (timout == 0)
{
ObjectGraph graph = new ObjectGraph();
graph.AllForElection(ElectionId);
return graph;
}
else
{
Object obj = cache[key];
if (obj == null)
{
lock (storeLock)
{
obj = cache[key]; // In case another page got the lock first and your are queued (Ensures only one get per cycle)
if (obj == null)
{
// Not in cache
ObjectGraph graph = new ObjectGraph();
graph.AllForElection(ElectionId);
cache.Insert(
key,
graph,
null,
DateTime.Now.Add(new TimeSpan(0, 0, timout)),
System.Web.Caching.Cache.NoSlidingExpiration);
return graph;
}
}
}
return (ObjectGraph)obj;
}
但是我想知道:当我更轻松地将 READONLY 对象存储为静态时,为什么要使用 Cache 对象。这存储了一个指向堆的指针,因此当它被更新时,仍在处理前一个指针对象的线程将对旧对象进行罚款,而且我也不必在返回对象之前从缓存中转换该对象。有人看到任何陷阱吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
将
storeLock
放入应用程序变量中put
storeLock
in an application variable