Asp.net - 用于存储字典的缓存与静态变量

Posted

技术标签:

【中文标题】Asp.net - 用于存储字典的缓存与静态变量【英文标题】:Asp.net - Caching vs Static Variable for storing a Dictionary 【发布时间】:2010-11-21 10:56:53 【问题描述】:

我正在建立一个包含许多部门和类别的网上商店。它们存储在我们的数据库中并经常访问。

我们正在使用 URL 重写,因此商店中的几乎每个请求都会生成查找。我们还需要经常迭代数据以生成主商店和部门页面的菜单。

这些信息不会经常变化,所以我想我应该将数据库加载到字典中以加快信息检索。

我知道标准做法是将数据加载到应用程序缓存中,但是我假设在缓存期间会发生某种程度的序列化,并且对于大型数据结构,我认为开销会很大。

我对此的冲动是将字典放在相关类之一的静态变量中。但是,我想对此进行一些输入。我是否认为这种方法会更快?这是可怕的做法吗?我错过了更好的方法吗?

我似乎找不到太多关于这方面的信息,如果您能分享任何信息,我将不胜感激。谢谢!

【问题讨论】:

【参考方案1】:

Application 和 Cache 集合不会序列化您传递给它们的对象,它们存储实际引用。无论对象有多大,从缓存中检索对象都不会是一项昂贵的操作。除非您有充分的理由不这样做,否则请始终坚持使用 Cache 对象,这是一种很好的做法。

唯一值得一提的另一件事是确保您考虑对这个集合进行多线程访问。如果你没有正确锁定,你很快就会遇到一些严重的问题

【讨论】:

非常感谢 - 这正是我需要知道的。 只要确保,如果您使用的是应用程序或缓存,它们是每台机器的。如果您有多台机器(例如网络农场),那么您就有麻烦了……您需要使用可扩展的缓存解决方案,例如 Microsoft Velocity 或 MemCacheD(“D”代表守护进程)。 非常感谢,不过我想自己检查一下缓存序列化问题,看来您在这里的建议是绝对正确的:west-wind.com/Weblog/posts/1214.aspx @Pure.Krome 这也适用于静态变量吗?或者它只是为了缓存 @Bharadwaj 静态变量适用于应用程序域,对吧? app 域是 per-website-per-machine .. 所以是的,这也适用于静态变量。如果您将某些内容保存到 Machine_1 上的静态变量中,那么 Machine_2 将不会看到/知道这一点。【参考方案2】:

好吧,如果需要的话,我认为重写代码以使用静态字段而不是应用程序缓存的工作量并不大。我个人会先使用缓存。不需要过早的优化,你测量过性能吗?它可能与应用程序缓存对象表现得恰到好处。也许它甚至适用于数据库查询? :)

所以,我的答案是 - 使用缓存,看看它是如何工作的。

【讨论】:

【参考方案3】:

memcached 是你的朋友! (但如果你不向外扩展可能会过大)

知道您的字典在应用程序缓存中的大小吗?我很想推荐它作为一个不错的首选。

【讨论】:

我正在查看几十个部门和几百个类别以及相关信息......所以大小明智应该不会太糟糕。我对使用数据库级缓存的唯一犹豫是每次调用我仍然必须将数据库返回的对象转换为它们的关联类型。还有一些相关的数据,比如我希望预先计算的 url。鉴于我经常需要获取这些项目的长列表,我认为我应该进一步缓存。这绝对是一个不错的选择,我非常感谢您提供的信息!【参考方案4】:

恕我直言,一般来说,如果您可以控制基础对象的更新,您应该使用静态存储。否则,如果您依赖 3rd 方 API 进行数据检索,请使用缓存技术。

【讨论】:

以上是关于Asp.net - 用于存储字典的缓存与静态变量的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 中的数据缓存存储

Asp.Net Mvc - 将事物存储在在 Application_Start 中重新初始化的静态变量中是不是安全

静态 ID - ASP.NET Core 分布式缓存标记帮助程序

ASP.NET 网站中出现意外的第二个 AppDomain

ASP.NET Core 6框架揭秘实例演示[16]:内存缓存与分布式缓存的使用

《ASP.NET Core 6框架揭秘》实例演示[16]:内存缓存与分布式缓存的使用