.NET 缓存设计的使用说明

关于缓存的设计
1、什么情况下用缓存

缓存是提高应用程序性能的最好方法之一。运用缓存可以优化数据查询,避免不必要的网络数据回传,和避免执行不必要的完全相同的数据处理逻辑。在实现缓存的时候我们要确定什么时候装入缓存数据。用异步装入缓存或用批处理方式来避免出现客户端数据延迟。
一般来说在一定时间内请求了相同的业务逻辑而没有变更的话,可以采用缓存来设计。数据请求频繁的的请求不适合采用缓存,如论坛的回复,但是论坛的主题是可以采用缓存设计的。

2、缓存设计的步骤
确定缓存数据结构:即设计中哪些数据用到了缓存,设计这些数据的缓存结构
确定缓存什么数据
确定缓存过期规则和清理
确定如何装入缓存数据

3、示例 Community Server的缓存类

代码如下:

using System;
  using System.Collections;
  using System.Text.RegularExpressions;
  using System.Web;
  using System.Web.Caching;

namespace Larry.Cache
  {
      /// <summary>
     /// 缓存类 Community Server的缓存类
     /// </summary>
     public class BaseCache
     {
         /// <summary>
         /// CacheDependency 说明
         /// 如果您向 Cache 中添加某个具有依赖项的项,当依赖项更改时,
         /// 该项将自动从 Cache 中删除。例如,假设您向 Cache 中添加某项,
         /// 并使其依赖于文件名数组。当该数组中的某个文件更改时,
         /// 与该数组关联的项将从缓存中删除。
         /// [C#]
         /// Insert the cache item.
         /// CacheDependency dep = new CacheDependency(fileName, dt);
         /// cache.Insert("key", "value", dep);
         /// </summary>
         public static readonly int DayFactor = ;
         public static readonly int HourFactor = ;
         public static readonly int MinuteFactor = ;
         public static readonly double SecondFactor = 0.;

private static readonly System.Web.Caching.Cache _cache;

private static int Factor = ;

/// <summary>
         /// 单件模式
         /// </summary>
         static BaseCache()
         {
             HttpContext context = HttpContext.Current;
             if (context != null)
             {
                 _cache = context.Cache;
             }
             else
             {
                 _cache = HttpRuntime.Cache;
             }
         }

/// <summary>
         /// 一次性清除所有缓存
         /// </summary>
         public static void Clear()
         {
             IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();
             ArrayList al = new ArrayList();
             while (CacheEnum.MoveNext()) //逐个清除
             {
                 al.Add(CacheEnum.Key);
             }

foreach (string key in al)
             {
                 _cache.Remove(key);
             }

}

public static void RemoveByPattern(string pattern)
         {
             IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();
             Regex regex = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Compiled);
             while (CacheEnum.MoveNext())
             {
                 if (regex.IsMatch(CacheEnum.Key.ToString()))
                     _cache.Remove(CacheEnum.Key.ToString());
             }
         }

/// <summary>
         /// 清除特定的缓存
         /// </summary>
         /// <param name="key"></param>
         public static void Remove(string key)
         {
             _cache.Remove(key);
         }

/// <summary>
         /// 缓存OBJECT.
         /// </summary>
         /// <param name="key"></param>
         /// <param name="obj"></param>
         public static void Insert(string key, object obj)
         {
             Insert(key, obj, null, );
         }

/// <summary>
        /// 缓存obj 并建立依赖项
        /// </summary>
        /// <param name="key"></param>
        /// <param name="obj"></param>
        /// <param name="dep"></param>
        public static void Insert(string key, object obj, CacheDependency dep)
        {
            Insert(key, obj, dep, MinuteFactor * );
        }

/// <summary>
        /// 按秒缓存对象
        /// </summary>
        /// <param name="key"></param>
        /// <param name="obj"></param>
        /// <param name="seconds"></param>
        public static void Insert(string key, object obj, int seconds)
        {
            Insert(key, obj, null, seconds);
        }

/// <summary>
        /// 按秒缓存对象 并存储优先级
        /// </summary>
        /// <param name="key"></param>
        /// <param name="obj"></param>
        /// <param name="seconds"></param>
        /// <param name="priority"></param>
        public static void Insert(string key, object obj, int seconds, CacheItemPriority priority)
        {
            Insert(key, obj, null, seconds, priority);
        }

/// <summary>
        /// 按秒缓存对象 并建立依赖项
        /// </summary>
        /// <param name="key"></param>
        /// <param name="obj"></param>
        /// <param name="dep"></param>
        /// <param name="seconds"></param>
        public static void Insert(string key, object obj, CacheDependency dep, int seconds)
        {
            Insert(key, obj, dep, seconds, CacheItemPriority.Normal);
        }

/// <summary>
        /// 按秒缓存对象 并建立具有优先级的依赖项
        /// </summary>
        /// <param name="key"></param>
        /// <param name="obj"></param>
        /// <param name="dep"></param>
        /// <param name="seconds"></param>
        /// <param name="priority"></param>
        public static void Insert(string key, object obj, CacheDependency dep, int seconds, CacheItemPriority priority)
        {
            if (obj != null)
            {
                _cache.Insert(key, obj, dep, DateTime.Now.AddSeconds(Factor * seconds), TimeSpan.Zero, priority, null);
            }

}

public static void MicroInsert(string key, object obj, int secondFactor)
        {
            if (obj != null)
            {
                _cache.Insert(key, obj, null, DateTime.Now.AddSeconds(Factor * secondFactor), TimeSpan.Zero);
            }
        }

/// <summary>
        /// 最大时间缓存
        /// </summary>
        /// <param name="key"></param>
        /// <param name="obj"></param>
        public static void Max(string key, object obj)
        {
            Max(key, obj, null);
        }

/// <summary>
        /// 具有依赖项的最大时间缓存
        /// </summary>
        /// <param name="key"></param>
        /// <param name="obj"></param>
        /// <param name="dep"></param>
        public static void Max(string key, object obj, CacheDependency dep)
        {
            if (obj != null)
            {
                _cache.Insert(key, obj, dep, DateTime.MaxValue, TimeSpan.Zero, CacheItemPriority.AboveNormal, null);
            }
        }

/// <summary>
        /// Insert an item into the cache for the Maximum allowed time
        /// </summary>
        /// <param name="key"></param>
        /// <param name="obj"></param>
        public static void Permanent(string key, object obj)
        {
            Permanent(key, obj, null);
        }

public static void Permanent(string key, object obj, CacheDependency dep)
        {
            if (obj != null)
            {
                _cache.Insert(key, obj, dep, DateTime.MaxValue, TimeSpan.Zero, CacheItemPriority.NotRemovable, null);
            }
        }

public static object Get(string key)
        {
            return _cache[key];
        }

/// <summary>
        /// Return int of seconds * SecondFactor
        /// </summary>
        public static int SecondFactorCalculate(int seconds)
        {
            // Insert method below takes integer seconds, so we have to round any fractional values
            return Convert.ToInt(Math.Round((double)seconds * SecondFactor));
        }
    }
}

其实这个类就是一个单件模式的设计 和缓存的公共操作方法,其中CacheDependency表示建立缓存依赖项,CacheItemPriority表示缓存的优先级。S使用如下

代码如下:

public static CardShop.Model.Systems GetConfig()
     {
         const string cacheKey = "WebConfig";
         CardShop.Model.Systems sampleCacheTable = Larry.Cache.BaseCache.Get(cacheKey) as CardShop.Model.Systems;
         if (sampleCacheTable == null)
         {
                                   OprationCheck.Message("第一次加载使用缓存");
             sampleCacheTable = model;
             Larry.Cache.BaseCache.Insert(cacheKey, sampleCacheTable, 24 * Larry.Cache.BaseCache.MinuteFactor);
        }
        else
        {
            OprationCheck.Message("已经加载了缓存不需要再加载");
        }
        return sampleCacheTable;
    }

(0)

相关推荐

  • .NET 缓存设计的使用说明

    关于缓存的设计1.什么情况下用缓存 缓存是提高应用程序性能的最好方法之一.运用缓存可以优化数据查询,避免不必要的网络数据回传,和避免执行不必要的完全相同的数据处理逻辑.在实现缓存的时候我们要确定什么时候装入缓存数据.用异步装入缓存或用批处理方式来避免出现客户端数据延迟.一般来说在一定时间内请求了相同的业务逻辑而没有变更的话,可以采用缓存来设计.数据请求频繁的的请求不适合采用缓存,如论坛的回复,但是论坛的主题是可以采用缓存设计的. 2.缓存设计的步骤确定缓存数据结构:即设计中哪些数据用到了缓存,设

  • PHP缓存技术的使用说明

    在大部份情况下我们的网站都会使用数据库作为站点数据存储的容器.当你执行一个SQL查询时,典型的处理过程是:连接数据库->准备 SQL查询->发送查询到数据库->取得数据库返回结果->关闭数据库连接.但数据库中有些数据是完全静态的或不太经常变动的,缓存系统会通过把SQL查询的结果缓存到一个更快的存储系统中存储,从而避免频繁操作数据库而很大程度上提高了程序执行时间,而且缓存查询结果也允许你后期处理. 普遍使用的PHP缓存技术 PHP缓存技术之数据缓存: 这里所说的数据缓存是指数据库查询

  • 解析PHP缓存函数的使用说明

    flush():刷新输出程序缓存for($i = 0; $i < 5; $i++){ echo str_repeat("\n", 5000);    echo $i;    sleep(1);    flush();} ob_start(回调函数,限定长度,随时输出缓存='true'):开启,前提:output_buffer = onob_clear():刷新ob_end_clear():关闭,并刷新ob_flush():输出ob_end_flush():关闭,并输出 ob_ge

  • 简单的PHP缓存设计实现代码

    复制代码 代码如下: <?php //本功能主要是利用文件修改时间函数filemtime与现在时间作减法判断是否更新内容. $cahetime=2;//设置过期时间 $cahefile="cahe.txt";//读写文本 if(file_exists($cahefile) && time()-$cahetime< filemtime($cahefile)){ echo file_get_contents($cahefile); } else { file_p

  • 详解Java的MyBatis框架中的缓存与缓存的使用改进

    一级缓存与二级缓存 MyBatis将数据缓存设计成两级结构,分为一级缓存.二级缓存: 一级缓存是Session会话级别的缓存,位于表示一次数据库会话的SqlSession对象之中,又被称之为本地缓存.一级缓存是MyBatis内部实现的一个特性,用户不能配置,默认情况下自动支持的缓存,用户没有定制它的权利(不过这也不是绝对的,可以通过开发插件对它进行修改): 二级缓存是Application应用级别的缓存,它的是生命周期很长,跟Application的声明周期一样,也就是说它的作用范围是整个App

  • Android中的Retrofit+OkHttp+RxJava缓存架构使用

    RxJava如何与Retrofit结合 先扔出build.gradle文件的内容 dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.2.0' compile 'io.reactivex:rxjava:1.1.0' compile 'io.reactivex:rxand

  • YII Framework框架教程之缓存用法详解

    本文实例讲述了YII Framework框架缓存用法.分享给大家供大家参考,具体如下: 缓存的产生原因众所周知.于是YII作为一个高效,好用的框架,不能不支持缓存.所以YII对各种流行的缓存都提供了接口,你可以根据你的需要使用不同的缓存. 1.YII中的缓存介绍 YII中的缓存是通过组件方式定义的,具体在如下目录 /yii_dev/yii/framework/caching# tree . ├── CApcCache.php ├── CCache.php ├── CDbCache.php ├──

  • .NET Core系列之MemoryCache 缓存域

    在上一篇"<拥抱.NET Core系列:MemoryCache 缓存选项>"我们介绍了一些 MSCache 的机制,今天我们来介绍一下 MSCache 中的缓存域. MSCache项目 MSCache 目前最新的正式版是 2.0.0,预览版是2.1.0,会与 .NETCore 2.1 一起发布.本篇用了2.0.0版本 开源在 GitHub 上,仓库地址是:https://github.com/aspnet/Caching NuGet地址为:https://www.nuget

  • MySQL查询缓存的小知识

    前言 我们知道,缓存的设计思想在RDBMS数据库中无处不在,就拿号称2500w行代码,bug堆积如山的Oracle数据库来说,SQL的执行计划可以缓存在library cache中避免再次执行相同SQL发生硬解析(语法分析->语义分析->生成执行计划),SQL执行结果缓存在RESULT CACHE内存组件中,有效的将物理IO转化成逻辑IO,提高SQL执行效率. MySQL的QueryCache跟Oracle类似,缓存的是SQL语句文本以及对应的结果集,看起来是一个很棒的Idea,那为什么从My

  • Redis之sql缓存的具体使用

    目录 1.环境搭建 2.Redis配置 3.功能实现 4.缓存注解的使用说明 1.环境搭建 <!-- RedisTemplate --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> spring: redis: ho

随机推荐