• [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能


    [.net 面向对象程序设计进阶] (15) 缓存(Cache)(利用缓存提升程序性能

    本节导读:

    上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种.NET中特别重要的缓布技术Cache.利用Cache提升程序性能。

    1. 缓存Cache的命名空间

    .NET中对缓存有两个命名空间

    命名空间1:System.Web.Caching 

    命名空间2:System.Runtime.Caching

    引用范围:这两个命名空间,都可以在Web和非WEB应用程序中引用.

    生命周期:理论上来说是一直存在,我们可以设置过期时间。但当内存开销紧张的时候,也会清理缓存释放空间。因此我们后面的程序应用中会判断Cache的对象是否存在,不存在的情况下,重新创建来解决失效问题。

    下面介绍一下缓存的具体使用方法。

    2. 创建和读取缓存

    缓存也是对向对象的,我们先创建一个实体类,还是比较熟悉的 “武功高手”类: 

    /// <summary>
    /// 类:武林高手
    /// MartialArtsMaster
    /// </summary>
        public class MartialArtsMaster
    {
        /// <summary>
        /// 编号
        /// </summary>
        public int id { get; set; }
    
        /// <summary>
        /// 姓名
        /// </summary>
        public string name { get; set; }
    
    
        /// <summary>
        /// 门派
        /// </summary>
        public string menpai { get; set; }           
        /// <summary>
        /// 武功
        /// </summary>
        public string kongFu { get; set; }
    
    }

    下面我们创建一个缓存,并读缓存,遍历对象 

    //增加几个武林高手
    List<MartialArtsMaster> masterList = new List<MartialArtsMaster>() {
        new MartialArtsMaster(){ id=1, name="段誉", menpai="天龙寺", kongFu="六脉神剑"},
        new MartialArtsMaster(){ id=2, name="乔峰", menpai="丐帮", kongFu="降龙十八掌"},
        new MartialArtsMaster(){ id=3, name="虚竹", menpai="逍遥派", kongFu="北冥神功"}
    };
    //缓存的创建
    System.Web.Caching.Cache objCache = HttpRuntime.Cache;
    objCache.Insert("MyCache", masterList);
    //缓存的读取
    (objCache["MyCache"] as List<MartialArtsMaster>).ForEach(m => Console.WriteLine("名字:" + m.name + " 门派:" + m.menpai + " 武功:" + m.kongFu));

    运行结果如下:

    3. 常见的缓存在工厂反射模式中的应用

    我们这里先不讨论设计模式,但是在使用很多代码生成器的时候,对于工厂反射模式动态创建多个数据层接口时,常常使用了缓存技术,将动态反射 创建的类缓存起来,提高下次访问效率。

    下面是简单工厂反射模式中的缓存应用代码片段:

    object objType = GetCache(ClassName);//从缓存读取
    if (objType == null)
    {
        try
        {
            objType = Assembly.Load(AssemblyPath).CreateInstance(ClassName);//反射创建
            SetCache(ClassNamespace, objType);// 写入缓存
        }
        catch(Exception ex)
        { }
    }

    4. 缓存的使用原则

    缓存有效的提高了程序效率,但也要合理使用,下面是几种使用的原则:

    第一,数据可能会被频繁的被使用,这种数据可以缓存。

    第二,数据的访问频率非常高,或者一个数据的访问频率不高,但是它的生存周期很长,这样的数据最好也缓存起来。

    第三是在Asp.net中,如果缓存过大的话也会报内存溢出错误,特别是如果缓存大的DataSet对象的时候。

    根据实际情况来合理利用。如:cache用得过多也会增大服务器的压力。整页输出缓存,又会影响数据的更新。 如果真的需要缓存很大量的数据,可以考虑静态技术。

     5. 通用缓存类

    最后惯例,整理一个缓存的通用类,以供小伙伴们调用  

    命名空间:KaJiMao.Common  

    类名:CacheHelper  

    文件名:CacheHelper .cs 

    using System;
    using System.Web;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace KaJiMao.Common
    {
    
        /// <summary>
        /// Cache通用类
        /// Yubinfeng
        /// Date:2015/07/16
        public class CacheHelper
        {
            /// <summary>
            /// 获取数据缓存
            /// </summary>
            /// <param name="CacheKey"></param>
            public static object GetCache(string CacheKey)
            {
                System.Web.Caching.Cache objCache = HttpRuntime.Cache;
                return objCache[CacheKey];
            }
    
            /// <summary>
            /// 设置数据缓存
            /// </summary>
            public static void SetCache(string CacheKey, object objObject)
            {
                System.Web.Caching.Cache objCache = HttpRuntime.Cache;
                objCache.Insert(CacheKey, objObject);
            }
    
            /// <summary>
            /// 设置数据缓存
            /// </summary>
            public static void SetCache(string CacheKey, object objObject, TimeSpan Timeout)
            {
                System.Web.Caching.Cache objCache = HttpRuntime.Cache;
                objCache.Insert(CacheKey, objObject, null, DateTime.MaxValue, Timeout, System.Web.Caching.CacheItemPriority.NotRemovable, null);
            }
    
            /// <summary>
            /// 设置数据缓存
            /// </summary>
            public static void SetCache(string CacheKey, object objObject, DateTime absoluteExpiration, TimeSpan slidingExpiration)
            {
                System.Web.Caching.Cache objCache = HttpRuntime.Cache;
                objCache.Insert(CacheKey, objObject, null, absoluteExpiration, slidingExpiration);
            }
    
            /// <summary>
            /// 移除指定数据缓存
            /// </summary>
            public static void RemoveAllCache(string CacheKey)
            {
                System.Web.Caching.Cache _cache = HttpRuntime.Cache;
                _cache.Remove(CacheKey);
            }
    
            /// <summary>
            /// 移除全部缓存
            /// </summary>
            public static void RemoveAllCache()
            {
                System.Web.Caching.Cache _cache = HttpRuntime.Cache;
                IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();
                while (CacheEnum.MoveNext())
                {
                    _cache.Remove(CacheEnum.Key.ToString());
                }
            }
        }
    }
    View Code

    ==============================================================================================  

     返回目录

     <如果对你有帮助,记得点一下推荐哦,如有有不明白或错误之处,请多交流>  

    <对本系列文章阅读有困难的朋友,请先看《.net 面向对象编程基础》>

    <转载声明:技术需要共享精神,欢迎转载本博客中的文章,但请注明版权及URL>

    .NET 技术交流群:467189533    .NET 程序设计

    ==============================================================================================   

  • 相关阅读:
    Atom,AtomPub 和Java 转载
    使用OData协议查询Windows日志 转
    许可协议BSD GPL MPL LGPL APL转载
    Eclipse Galileo 简介
    常见证书格式和转换
    JVM简介转
    Android Native 代码开发学习笔记转载
    echarts——各个配置项详细说明总结
    Mysql 安装服务无法启动解决方案与使用的一般使用指令
    js中如何把字符串(文本)转化为对象
  • 原文地址:https://www.cnblogs.com/yubinfeng/p/4649916.html
Copyright © 2020-2023  润新知