广告
返回顶部
首页 > 资讯 > 精选 >ASP.NET中怎么构建自定义文件缓存
  • 254
分享到

ASP.NET中怎么构建自定义文件缓存

2023-06-17 12:06:39 254人浏览 薄情痞子
摘要

本篇内容介绍了“asp.net中怎么构建自定义文件缓存”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ASP.net的输出缓存(即静态html

本篇内容介绍了“asp.net中怎么构建自定义文件缓存”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

ASP.net的输出缓存(即静态html)在.NET4.0前一直是基于内存的。这意味着如果我们的站点含有大量的缓存,则很容易消耗掉本机内存。现在,借助于.NET4.0中的OutputCacheProvider,我们可以有多种选择创建自己的缓存。如,我们可以把HTML输出缓存存储到memcached分布式集群服务器,或者MongoDB中。当然,我们也可以把缓存作为文件存储到硬盘上,考虑到可扩展性,这是一种最廉价的做法。

1:OutputCacheProvider

OutputCacheProvider是一个抽象基类,我们需要override其中的四个方法,它们分别是:

Add 方法,将指定项插入输出缓存中。

Get 方法,返回对输出缓存中指定项的引用。

Remove 方法,从输出缓存中移除指定项。

Set 方法,将指定项插入输出缓存中,如果该项已缓存,则覆盖该项。

2:创建自己的文件缓存处理类

该类型为FileCacheProvider,代码如下:

public class FileCacheProvider : OutputCacheProvider  {  private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);   public override void Initialize(string name, NameValueCollection attributes)  {  base.Initialize(name, attributes);  CachePath = HttpContext.Current.Server.MapPath(attributes["cachePath"]);  }  public override object Add(string key, object entry, DateTime utcExpiry)  {  Object obj = Get(key);  if (obj != null) //这一步很重要  {  return obj;  }  Set(key,entry,utcExpiry);  return entry;  }  public override object Get(string key)  {  string path = ConverTKEyToPath(key);  if (!File.Exists(path))  {  return null;  }  CacheItem item = null;  using (FileStream file = File.OpenRead(path))  {  var fORMatter = new BinaryFormatter();  item = (CacheItem)formatter.Deserialize(file);  }  if (item.ExpiryDate <= DateTime.Now.ToUniversalTime())  {  log.Info(item.ExpiryDate + "*" + key);  Remove(key);  return null;  }  return item.Item;  }  public override void Set(string key, object entry, DateTime utcExpiry)  {  CacheItem item = new CacheItem(entry, utcExpiry);  string path = ConvertKeyToPath(key);  using (FileStream file = File.OpenWrite(path))  {  BinaryFormatter formatter = new BinaryFormatter();  formatter.Serialize(file, item);  }  }  public override void Remove(string key)  {  string path = ConvertKeyToPath(key);  if (File.Exists(path))  File.Delete(path);   }  public string CachePath  {  get;  set;  }  private string ConvertKeyToPath(string key)  {  string file = key.Replace('/', '-');  file += ".txt";  return Path.Combine(CachePath, file);  }  }  [Serializable]  public class CacheItem  {  public DateTime ExpiryDate;  public object Item;  public CacheItem(object entry, DateTime utcExpiry)  {  Item = entry;  ExpiryDate = utcExpiry;  }  }

有两个地方需要特别说明:

在Add方法中,有一个条件判断,必须做出这样的处理,否则缓存机制将会缓存***次的结果,过了有效期后缓存讲失效并不再重建;

在示例程序中,我们简单的将缓存放到了Cache目录下,在实际的项目实践中,考虑到缓存的页面将是成千上万的,所以我们必须要做目录分级,否则寻找并读取缓存文件将会成为效率瓶颈,这会耗尽CPU。

3:配置文件

我们需要在WEB.config中配置缓存处理程序是自定义的FileCacheProvider,即在 <system.web>下添加节点:

<caching>  <outputCache defaultProvider="FileCache">  <providers>  <add name="FileCache" type="mvcApplication2.Common.FileCacheProvider" cachePath="~/Cache" />  </providers>  </outputCache>   </caching>

4:缓存的使用

我们假设在MVC的控制中使用(如果要在ASP.NET页面中使用,则在页面中包含<%@OutputCache VaryByParam="none" Duration="10" %>),可以看到,Index是未进行输出缓存的,而Index2进行了输出缓存,缓存时间为10秒。

public class HomeController : Controller  {  private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);  static string s_conn = "Data Source=192.168.0.77;Initial Catalog=luminjidb;User Id=sa;PassWord=sa;";  public ActionResult Index()  {  using (DataSet ds = Common.sqlHelper.ExecuteDataset(s_conn, CommandType.Text, "select top 1* from NameTb a, DepTb b where a.DepID = b.ID ORDER BY NEWID()"))  {  ViewBag.Message = ds.Tables[0].Rows[0]["name"].ToString();  }  return View();  }  [OutputCache(Duration = 10, VaryByParam = "none")]  public ActionResult Index2()  {  using (DataSet ds = Common.SqlHelper.ExecuteDataset(s_conn, CommandType.Text, "select top 1* from NameTb a, DepTb b where a.DepID = b.ID ORDER BY NEWID()"))  {  ViewBag.Message = ds.Tables[0].Rows[0]["name"].ToString();  }  return View();  }  }

5:查看下效果

上面的代码,在访问了Index2后,将会在Cache文件夹下产生缓存文件,如下:

现在,我们开始评价下有输出缓存和无输出缓存的性能对比,模拟100个用户并发1000次请求如下:

ASP.NET中怎么构建自定义文件缓存

可以看到,有输出缓存后,吞吐率明显提高了10倍。

6:代码下载

FileCacheProvider的原始代码来自于网络,我修改了其中的BUG,全部代码下载如下:MvcApplication20110907.rar

“ASP.NET中怎么构建自定义文件缓存”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: ASP.NET中怎么构建自定义文件缓存

本文链接: https://www.lsjlt.com/news/288934.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ASP.NET中怎么构建自定义文件缓存
    本篇内容介绍了“ASP.NET中怎么构建自定义文件缓存”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ASP.NET的输出缓存(即静态HTML...
    99+
    2023-06-17
  • ASP.NET中怎么创建自定义操作
    这期内容当中小编将会给大家带来有关ASP.NET中怎么创建自定义操作,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。ASP.NET安装部署之创建自定义操作1.在解决方案资源管理器中选择“Test Insta...
    99+
    2023-06-18
  • ASP.NET配置文件中自定义节点
    节处理程序解释并处理 Web.config 文件特定部分中 XML 配置元素中定义的设置,并根据配置设置返回适当的配置对象。 处理程序类返回的配置对象可以是任何数据结构;它不限于任何...
    99+
    2022-11-13
  • 怎么自定义redis缓存拦截器
    自定义Redis缓存拦截器的步骤如下:1. 创建一个实现了`HandlerInterceptor`接口的自定义类,并重写其三个方法`...
    99+
    2023-09-11
    redis
  • docker怎么自定义镜像构建php7
    这篇文章主要讲解了“docker怎么自定义镜像构建php7”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“docker怎么自定义镜像构建php7”吧!首先进行...
    99+
    2022-10-19
  • FlexBuilder中怎么创建自定义控件
    FlexBuilder中怎么创建自定义控件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。创建自定义组件1、Flex是由as类结构实现的。FlexBuilder教程中类结构包含了...
    99+
    2023-06-17
  • Java 中怎么自定义一个LRU 缓存算法
    今天就跟大家聊聊有关Java 中怎么自定义一个LRU 缓存算法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。背景LinkedHashMap继承自HashMap,内部提供了一个remo...
    99+
    2023-06-17
  • logback怎么自定义指定日志文件存储目录
    这篇文章主要介绍“logback怎么自定义指定日志文件存储目录”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“logback怎么自定义指定日志文件存储目录”文章能帮助大家解决问题。logback自定义...
    99+
    2023-07-05
  • Android怎么在XML文件中自定义控件
    今天小编给大家分享一下Android怎么在XML文件中自定义控件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、为什么需要...
    99+
    2023-07-05
  • spring缓存自定义resolver的方法怎么用
    本篇内容介绍了“spring缓存自定义resolver的方法怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、概述cache-asid...
    99+
    2023-06-29
  • ASP.NET 中怎么利用DataGrid自定义分页
    这期内容当中小编将会给大家带来有关ASP.NET 中怎么利用DataGrid自定义分页,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。ASP.NET DataGrid自定义分页代码1using S...
    99+
    2023-06-17
  • SpringBoot怎么自定义Redis实现缓存序列化
    本篇内容主要讲解“SpringBoot怎么自定义Redis实现缓存序列化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot怎么自定义Redis实现缓存序列化”吧!1、自定义Red...
    99+
    2023-07-02
  • Vue中怎么自定义事件
    本篇文章给大家分享的是有关Vue中怎么自定义事件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。事件绑定每个 Vue 实例都实现了事件接口 (E...
    99+
    2022-10-19
  • laravel中间件怎么自定义
    今天小编给大家分享一下laravel中间件怎么自定义的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是中间件中间件为过滤进...
    99+
    2023-06-30
  • 怎么使用自定义Maven设置文件
    本文小编为大家详细介绍“怎么使用自定义Maven设置文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用自定义Maven设置文件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Mavensettings.x...
    99+
    2023-06-26
  • Win10怎么使用命令创建自定义大小的空文件
    这篇文章主要介绍Win10怎么使用命令创建自定义大小的空文件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!创建空文件操作步骤右键开始按钮,选择“Windows PowerShell(管理员)”或“CMD命令提示符”在...
    99+
    2023-06-10
  • 阿里云服务器创建自定义镜像文件怎么弄
    首先登录阿里云服务器的控制台,进入“创建镜像”页面。 在“创建镜像”页面中,选择您想要创建镜像的服务器IP地址和操作系统版本,并点击“创建镜像”按钮。 在“创建镜像”页面中,可以选择要创建的镜像格式,例如“mirror-img”格式。您可...
    99+
    2023-10-27
    阿里 自定义 怎么弄
  • 怎么在react中创建自定义hooks
    这篇文章主要介绍“怎么在react中创建自定义hooks”,在日常操作中,相信很多人在怎么在react中创建自定义hooks问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在react中创建自定义hooks...
    99+
    2023-06-25
  • Flex中怎么自定义itemeditor组件
    在 Flex 中,可以通过自定义 ItemEditor 组件来实现自定义的编辑器。以下是一个简单的示例:1. 首先,创建一个自定义的...
    99+
    2023-09-27
    Flex
  • vue2.0中怎么自定义Echarts组件
    这期内容当中小编将会给大家带来有关vue2.0中怎么自定义Echarts组件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、自定义 图表 组件Echarts.vue&l...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作