我的编程空间,编程开发者的网络收藏夹
学习永远不晚

.NET 4.0可扩展缓存框架的示例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

.NET 4.0可扩展缓存框架的示例分析

小编给大家分享一下.NET 4.0可扩展缓存框架的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

.NET Framework中,叫做System.Runtime.Caching,这不仅是个缓存库,还是个框架,可以在上面开发自己的库。ObjectCache定义了所有缓存都要实现的通用操作。与之搭配的是个内存缓存实现,叫做MemoryCache。这个缓存系统的结构如下:

.NET 4.0可扩展缓存框架的示例分析

上图大家可以看出来对应那些产品了吗?

下面我给大家介绍一个实现这样一个架构的代码示例,代码的核心就是ObjectCache:

定义一个抽象的Provider接口:

public interface ICacheBuilder    {     ObjectCache GetInstance();  string DefaultRegionName { get; }  }

In-memory提供者的实现使用MemoryCache:

public class MemoryCacheBuilder : ICacheBuilder  {   public MemoryCacheBuilder() { }   public ObjectCache GetInstance()   {   return MemoryCache.Default;   }   public string DefaultRegionName    {     get { return null; }    }   }

分布式缓存提供者Memcached:

public class MemcachedCache : ObjectCache, ICacheBuilder   {  private long _lDefaultExpireTime = 3600; // default Expire Time     private MemcachedClient _client = null;      #region ICache Members               public MemcachedCache()          {              this._client = MemcachedClientService.Instance.Client;         }        public override void Set(string key, object value, System.DateTimeOffset absoluteExpiration, string regionName = null)         {             Enforce.NotNull(key, "key");             CacheItem item = new CacheItem(key, value, regionName);      CacheItemPolicy policy = new CacheItemPolicy();             policy.AbsoluteExpiration = absoluteExpiration;             Set(item, policy);         }           public override void Set(CacheItem item, CacheItemPolicy policy)        {             if (item == null || item.Value == null)                 return;             item.Key = item.Key.ToLower();              if (policy != null && policy.ChangeMonitors != null && policy.ChangeMonitors.Count > 0)                 throw new NotSupportedException("Change monitors are not supported");                  // max timeout in scaleout = 65535             TimeSpan expire = (policy.AbsoluteExpiration.Equals(null)) ?          policy.SlidingExpiration :                               (policy.AbsoluteExpiration - DateTimeOffset.Now);          double timeout = expire.TotalMinutes;             if (timeout > 65535)               timeout = 65535;             else if (timeout > 0 && timeout < 1)                timeout = 1;            this._client.Store(Enyim.Caching.Memcached.StoreMode.Set, item.Key.ToString(), item.Value);       }        public override object this[string key]         {            get           {                return Get(key);            }            set            {                 Set(key, value, null);            }         }  public override object AddOrGetExisting(string key, object value, CacheItemPolicy policy, string regionName = null)         {             CacheItem item = GetCacheItem(key, regionName);             if (item == null)            {                 Set(new CacheItem(key, value, regionName), policy);                 return value;            }           return item.Value;         }       public override CacheItem AddOrGetExisting(CacheItem value, CacheItemPolicy policy)       {             CacheItem item = GetCacheItem(value.Key, value.RegionName);            if (item == null)            {                Set(value, policy);                return value;            }           return item;        }   public override object AddOrGetExisting(string key, object value, System.DateTimeOffset absoluteExpiration, string regionName = null)        {            CacheItem item = new CacheItem(key, value, regionName);             CacheItemPolicy policy = new CacheItemPolicy();             policy.AbsoluteExpiration = absoluteExpiration;       return AddOrGetExisting(item, policy);         }        public override bool Contains(string key, string regionName = null)         {            return false;        }  public override CacheEntryChangeMonitor CreateCacheEntryChangeMonitor(System.Collections.Generic.IEnumerable<string> keys, string regionName = null)         {           throw new System.NotImplementedException();      }     public override DefaultCacheCapabilities DefaultCacheCapabilities      {        get          {             return                DefaultCacheCapabilities.OutOfProcessProvider |                 DefaultCacheCapabilities.AbsoluteExpirations |                  DefaultCacheCapabilities.SlidingExpirations |  DefaultCacheCapabilities.CacheRegions;          }     }    public override object Get(string key, string regionName = null)       {          key = key.ToLower();         return this._client.Get(key);        }      public override CacheItem GetCacheItem(string key, string regionName = null)        {           object value = Get(key, regionName);           if (value != null)               return new CacheItem(key, value, regionName);          return null;        }      public override long GetCount(string regionName = null)       {          return -1;      }    protected override System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<string, object>> GetEnumerator()      {            throw new System.NotImplementedException();        }  public override System.Collections.Generic.IDictionary<string, object> GetValues(System.Collections.Generic.IEnumerable<string> keys, string regionName = null)       {            throw new System.NotImplementedException();        }            public override string Name        {            get { return "MemcachedProvider"; }        }             public override object Remove(string key, string regionName = null)      {          key = key.ToLower();            return this._client.Remove(key);      }       public override void Set(string key, object value, CacheItemPolicy policy, string regionName = null)      {          Set(new CacheItem(key, value, regionName), policy);       }      #endregion      #region ICacheBuilder Members       public ObjectCache GetInstance()       {           return this;       }       public string DefaultRegionName       {         get { throw new NotImplementedException(); }        }       #endregion  }

分布式缓存提供者Windows Server AppFabric Caching:

public class AppFabricCacheProvider : ObjectCache, ICacheBuilder    {       public static DataCache factory = null;     public static object syncObj = new object();    public override object AddOrGetExisting(string key, object value, CacheItemPolicy policy, string regionName = null)      {             CacheItem item = GetCacheItem(key, regionName);            if (item == null)            {                 Set(new CacheItem(key, value, regionName), policy);             return value;             }             return item.Value;         }    public override CacheItem AddOrGetExisting(CacheItem value, CacheItemPolicy policy)       {           CacheItem item = GetCacheItem(value.Key, value.RegionName);          if (item == null)            {               Set(value, policy);               return value;           }         return item;      }    public override object AddOrGetExisting(string key, object value, System.DateTimeOffset absoluteExpiration, string regionName = null)       {            CacheItem item = new CacheItem(key, value, regionName);           CacheItemPolicy policy = new CacheItemPolicy();           policy.AbsoluteExpiration = absoluteExpiration;            return AddOrGetExisting(item, policy);      }        public override bool Contains(string key, string regionName = null)     {        return Get(key, regionName) != null;      }     public override CacheEntryChangeMonitor CreateCacheEntryChangeMonitor(System.Collections.Generic.IEnumerable<string> keys, string regionName = null)       {             throw new NotImplementedException();       }        public override DefaultCacheCapabilities DefaultCacheCapabilities      {           get             {                return                 DefaultCacheCapabilities.OutOfProcessProvider |                   DefaultCacheCapabilities.AbsoluteExpirations |                     DefaultCacheCapabilities.SlidingExpirations |                   DefaultCacheCapabilities.CacheRegions;            }         }        public override object Get(string key, string regionName = null)         {             key = key.ToLower();            CreateRegionIfNeeded();            return (regionName == null) ?             CacheFactory.Get(key) :              CacheFactory.Get(key, regionName);         }         public override CacheItem GetCacheItem(string key, string regionName = null)        {            object value = Get(key, regionName);             if (value != null)              return new CacheItem(key, value, regionName);             return null;       }         public override long GetCount(string regionName = null)       {            if (string.IsNullOrEmpty(regionName))                 throw new NotSupportedException();            return CacheFactory.GetObjectsInRegion(regionName).LongCount();     }         protected override System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<string, object>> GetEnumerator()       {           throw new NotSupportedException();         }         public override System.Collections.Generic.IDictionary<string, object> GetValues(System.Collections.Generic.IEnumerable<string> keys, string regionName = null)       {            if (string.IsNullOrEmpty(regionName))             throw new NotSupportedException();           return CacheFactory.GetObjectsInRegion(regionName).ToDictionary(x => x.Key, x => x.Value);       }      public override string Name        {         get { return "AppFabric"; }        }  public override object Remove(string key, string regionName = null)      {            key = key.ToLower();           CreateRegionIfNeeded();           return (regionName == null) ?               CacheFactory.Remove(key) :                CacheFactory.Remove(key, regionName);      }       public override void Set(string key, object value, CacheItemPolicy policy, string regionName = null)      {       Set(new CacheItem(key, value, regionName), policy);      }      public override void Set(CacheItem item, CacheItemPolicy policy)      {            if (item == null || item.Value == null)                return;          if (policy != null && policy.ChangeMonitors != null && policy.ChangeMonitors.Count > 0)              throw new NotSupportedException("Change monitors are not supported");            item.Key = item.Key.ToLower();           CreateRegionIfNeeded();         TimeSpan expire = (policy.AbsoluteExpiration.Equals(null)) ?              policy.SlidingExpiration :              (policy.AbsoluteExpiration - DateTimeOffset.Now);            if (string.IsNullOrEmpty(item.RegionName))                CacheFactory.Put(item.Key, item.Value, expire);           else                CacheFactory.Put(item.Key, item.Value, expire, item.RegionName);        }        private static DataCache CacheFactory       {            get          {               if (factory == null)               {                  lock (syncObj)                   {                        if (factory == null)                     {         DataCacheFactory cacheFactory = new DataCacheFactory();                         factory = cacheFactory.GetDefaultCache();                    }               }               }                return factory;            }      }      private void CreateRegionIfNeeded() 163:     {            try          {          CacheFactory.CreateRegion(DefaultRegionName);         }         catch (DataCacheException ex)          {              if (!ex.ErrorCode.Equals(DataCacheErrorCode.RegionAlreadyExists))                    throw ex;           }      }   public override void Set(string key, object value, System.DateTimeOffset absoluteExpiration, string regionName = null)        {            CacheItem item = new CacheItem(key, value, regionName);           CacheItemPolicy policy = new CacheItemPolicy();           policy.AbsoluteExpiration = absoluteExpiration;          Set(item, policy);       }     public override object this[string key]        {           get           {               return Get(key, DefaultRegionName);            }            set           {                Set(key, value, null, DefaultRegionName);            }       }   public ObjectCache GetInstance()       {            return this;        }   public string DefaultRegionName     {     get  {    string defaultRegion= FrameworkConfiguationManager.GetConfiguration().GetAppVariable("AppFabricCacheDefaultRegion");           if (string.IsNullOrEmpty(defaultRegion))        {                   defaultRegion = "Default";         }            return defaultRegion;       }     }    }

输出缓存对于改善性能有很大好处,在ASP.NET 4.0中可以自定义输出缓存的策略,比如把输出保存在磁盘中,外部的memcached服务中等等。甚至还可以定义一些高级规则,比如为A页面使用A输出缓存策略来把数据保存于内存中,为B页面使用B输出缓存策略来把数据保存于磁盘中。.NET 4.0可扩展缓存框架的示例分析

代码例子可以参看文章http://www.buraksenyurt.com/post/AspNet-40-Custom-Cache-Provider.aspx,在web.config中配置

<caching>       <outputCache defaultProvider="AspNetInternalProvider">        <providers> <add name="DiskBasedCacheProvider" type="CustomCaching.DiskCacheProvider,CustomCaching"/>     </providers>    </outputCache>    </caching>

在ASP.NET 4 的默认输出缓存策略中。所有的HTTP响应、所呈现的页面和控件缓存均使用上例所示的默认输出缓存提供程序(其中defaultProvider属性值为AspNetInternalProvider)。通过为defaultProvider指定不同的提供程序。就可以更改web应用程序的默认输出缓存提供程序。

另外,还可以针对每个用户控件和各个请求选择不同的输出缓存提供程序。要为不同的Web用户控件选择不同的输出缓存提供程序,最简便的方法是设置页面或控件指令中新增加的providerName属性,如下面的示例所示:

<%@ OutputCache Duration="60" VaryByParam="None"  providerName="DiskBasedCacheProvider" %>

若要为某个HTTP请求指定不同的输出缓存提供程序,可以覆盖Global.asax文件中新增加的GetOutputCacheProviderName方法,以编程的方式指定要用于特定请求的提供程序。

看完了这篇文章,相信你对“.NET 4.0可扩展缓存框架的示例分析”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

.NET 4.0可扩展缓存框架的示例分析

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

下载Word文档

猜你喜欢

.NET 4.0可扩展缓存框架的示例分析

小编给大家分享一下.NET 4.0可扩展缓存框架的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!.NET Framework中,叫做System.Runtime.Caching,这不仅是个缓存库,还是个框架,可以在
2023-06-17

PHP Hash信息摘要扩展框架的示例分析

这篇文章主要介绍PHP Hash信息摘要扩展框架的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!PHP的Hash信息摘要扩展框架今天我们主要学习的是 PHP 中一些 Hash 散列加密相关的扩展函数的使用,而
2023-06-15

PHP中另一个高效缓存扩展Yac的示例分析

这篇文章主要介绍了PHP中另一个高效缓存扩展Yac的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。PHP的另一个高效缓存扩展:Yac之前的文章中我们已经学习过一个 P
2023-06-15

.NET框架与DLL Hell问题的示例分析

这篇文章给大家介绍.NET框架与DLL Hell问题的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。.NET框架与DLL Hell问题:版本问题 从客户的角度,最常见的版本问题就是我们所说的 DLL Hell
2023-06-17

基于OAS设计可扩展OpenAPI的示例分析

这篇文章的内容主要围绕基于OAS设计可扩展OpenAPI的示例分析进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!随着互联网行业的兴起,开发模式已逐步
2023-06-03

Redis架构中缓存雪崩的示例分析

这篇文章主要介绍Redis架构中缓存雪崩的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1 真实案例云办公系统用户实时信息查询功能优化发布之后,系统发生宕机事件(系统挂起,页面无法加载)。1.1 背景我们IM
2023-06-29

layui table组件的扩展性分析与实例展示(探讨layui table组件的可扩展性及其应用实例)

layuitable组件以其灵活性和可扩展性著称,提供丰富的API接口,允许开发者根据需要定制和增强。可以通过插件扩展、API扩展和继承扩展进行扩展。插件扩展引入插件实现额外功能,如行拖拽等;API扩展直接调用API函数操作表格;继承扩展继承table组件并重写关键方法,实现更深入的定制。此外,还可用于动态加载、条件过滤、表单提交和集成其他组件。扩展性优势在于灵活易用、模块化设计和可维护性高。
layui table组件的扩展性分析与实例展示(探讨layui table组件的可扩展性及其应用实例)
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录