草庐IT

c# - 不同 ASP.NET 缓存选项的优缺点

coder 2023-07-08 原文

我最近问了一个关于在 ASP.NET MVC WebAPI 应用程序中缓存应用程序数据的问题,它让我想到了一个新问题。 ASP.NET 中可用的不同缓存方法的优缺点是什么?

我遇到了:

  • 内存缓存

    http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.aspx

  • 使用静态成员变量:

    private static Northwind.SuppliersDataTable suppliers = null;
    
  • 申请状态:

     HttpContext.Current.Application["key"] ="Value"
    
  • 数据缓存:

    HttpRuntime.Cache.Insert(
      /* key */                "key", 
      /* value */              "value", 
      /* dependencies */       null, 
      /* absoluteExpiration */ Cache.NoAbsoluteExpiration, 
      /* slidingExpiration */  Cache.NoSlidingExpiration, 
      /* priority */           CacheItemPriority.NotRemovable, 
      /* onRemoveCallback */   null);
    

我敢肯定还有其他的,而且我知道它们在技术上都将数据存储在内存中...所以知道我应该为 ASP.NET MVC webapi 使用什么吗?

我之前的问题: Caching application data in memory: MVC Web API

最佳答案

每种缓存技术/方法都有自己的一套功能。这些功能在一个应用程序要求中可能看起来是不利的,但在其他应用程序要求中可能是有利的。

因此,简而言之,根据您的要求决定哪种缓存技术和哪些功能最适合您。

例如,让我们讨论一些客户端缓存技术

MSDN 说我们还可以使用 HiddenField 在隐藏字段中仅存储少量频繁更改的数据,因为此数据包含在每次回发到服务器的往返过程中。

此功能的优势:通过使用客户端选项存储页面信息来减少服务器的工作量。

但是,MSDN 明确指出:这种方法具有最少的安全支持。

因此,人们可能会也可能不会始终使用此功能,因为还存在安全考虑。

再考虑一个例子Page Output caching:它是2种,页面输出缓存和页面片段缓存。

页面输出缓存缓存整个网页,仅当该页面的内容相当静态时才适用。如果页面的某些部分发生变化,您可以将静态部分包装为用户控件,并使用页面片段缓存来缓存用户控件。

关于 ApplicationHttpRuntime.cache 的最后一条评论:

Application 不是缓存,它是一个全局命名值集合。如果您向 Application 添加对象,它将一直保留到应用域回收为止。

  • 应用程序变量是网络应用程序所有用户之间的共享变量
  • 应用程序变量的行为类似于静态变量,它们替代了静态变量,因为静态变量在 Web 应用程序中是无状态的
  • 只有共享值才应该保留在应用程序变量中,并且一旦它们不在使用中,就应该明确地删除它们。

Cache :通过在 ApplicationCache类。虽然 Cache 类确实提供了更多的灵 active 和控制,但它在增加吞吐量方面似乎仅比用于缓存的 Application 类提供了边际优势。很难开发一种测试方案来准确衡量 Cache 类内置的潜在优势 - 通过清理过程对较少使用的对象进行管理,而不是应用程序不这样做的事实提供此功能。开发人员需要在这种情况下做出决定,并且应该基于项目的需求和便利性及其使用模式。检查 this link 了解更多。

引用 this MSDN article 获取有关 Asp.net 中所有缓存技术的完整精彩解释,并讨论了每种技术的特性。

此外,这 2 个链接是一个很好的起点:

关于c# - 不同 ASP.NET 缓存选项的优缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18937855/

有关c# - 不同 ASP.NET 缓存选项的优缺点的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  3. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  4. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  5. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  6. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  7. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  8. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  9. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐