数据缓存技术及代码详解

1.缓存概述
  •为什么使用缓存
    – 应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能
  • 缓存机制分类介绍
    – 应用程序缓存
    – 页输出缓存

2.应用程序缓存的机制
  • 应用程序缓存是由System.Web.Caching.Cache 类实现的,缓存实例(Cache 对象)是每个应用程序专
    用的,并且每个应用只有一个,通过Page类或UserControl类的Cache 属性公开
   • 缓存生存期依赖于应用程序的生存期,当重新启动应用程序后,将重新创建Cache 对象,也就是说缓存数据将被清空

3.如何将项添加到缓存中 
  • 添加缓存项
  • 设置缓存依赖项  
  • 设置缓存过期策略
  • 设置缓存优先级
4.设置缓存依赖项
  • 为什么要设置依赖项
  • 依赖项分类
    – 键依赖项
    – 文件依赖项
    –SQL 依赖项
    – 聚合依赖项
    – 自定义依赖项
  • 添加缓存项的文件依赖项
    Cache.Insert("FinanceData", "Cached Item 4",
      new System Web Caching CacheDependency(Server.MapPath( "XMLData.xml " ))); 
  • 添加缓存项的SQL 依赖项
    – 使用SqlCacheDependency 对象来创建依赖于数据库表中的记录
    – 在Web.config 文件的caching节点定义缓存使用的数据库名称及连接字符串
    – 使用代码依赖于该连接对应数据库的某个表的缓存项
      Cache.Insert("cacheitem1", "Cache Item 1", 
        new SqlCacheDependency("AdvWorks", "Product"));
5.从缓存中删除项时通知应用程序
  • CacheItemRemovedCallback 委托
    – 该委托定义编写事件处理程序时使用的签名,当对从缓存中删除项进行响应时会调用此事件处理程序
  • CacheItemRemovedReason 枚举
    – 用于指定删除缓存项的原因

6.实例演示(使用CacheDependency监视文件变化)

  a)新建一个CacheUtil类,来处理Cache的常见操作,代码如下:

public class CacheUtil
    {
        public static void AddCache()
        {
            var ds = new System.Data.DataSet();
            ds.ReadXml(HttpContext.Current.Server.MapPath("~/Employees.xml"));

            HttpContext.Current.Cache.Add("EmployeeSet", ds, new CacheDependency(HttpContext.Current.Server.MapPath("~/Employees.xml"))
                , DateTime.Now.AddHours(1), Cache.NoSlidingExpiration, CacheItemPriority.High
                , EmployeeSetCacheItemRemoved);
        }

        public static void EmployeeSetCacheItemRemoved(string key, object value, CacheItemRemovedReason reason)
        {
            switch (reason)
            {
                case CacheItemRemovedReason.DependencyChanged:
                    AddCache();
                    break;
            }
        }
    }

b)修改Global.asax.cs的Application_Start,在网站启动时,添加Cache

  void Application_Start(object sender, EventArgs e)
        {
            //在应用程序启动时运行的代码
            CacheUtil.AddCache();
        }

c)修改Default.aspx.cs的Page_Load

protected void Page_Load(object sender, EventArgs e)
        {
            if (Cache["EmployeeSet"] == null)
            {
                CacheUtil.AddCache();
            }
            var ds = (DataSet)Cache["EmployeeSet"];
            GridView1.DataSource = ds.Tables[0];
            GridView1.DataBind();
        }

 d)效果图:

  当修改Employees.xml,保存后,缓存会接到文件改变通知,重新加载数据

7.实例演示(使用SqlCacheDependency监视数据库表变化)

  a)新建一个页面SqlCacheTest.aspx,使用模板页

  b)启用数据库缓存依赖项

  此时会在数据库Student中的表Contact生成一个触发器和一堆存储过程:

  c)配置web.Config

    在  <system.web>节点下,加入:

<caching>
      <sqlCacheDependency enabled="true">
        <databases>
          <add name="Student" connectionStringName="Student"/>
        </databases>
      </sqlCacheDependency>
    </caching>

设置connectionStringName:

<connectionStrings>
    <add name="Student"
         connectionString="server=.;database=Student;Integrated Security=SSPI"
         providerName="System.Data.SqlClient" />
  </connectionStrings>

d)修改CacheUtil.cs

public class CacheUtil
    {
        public static void AddCache()
        {
            var ds = new DataSet();
            ds.ReadXml(HttpContext.Current.Server.MapPath("~/Employees.xml"));

            HttpContext.Current.Cache.Add("EmployeeSet", ds, new CacheDependency(HttpContext.Current.Server.MapPath("~/Employees.xml"))
                ,DateTime.Now.AddHours(1),Cache.NoSlidingExpiration, CacheItemPriority.High
                ,EmployeeSetCacheItemRemoved);
        }

        public static void EmployeeSetCacheItemRemoved(string key, object value, CacheItemRemovedReason reason)
        {
            switch (reason)
            {
                case CacheItemRemovedReason.DependencyChanged:
                    AddCache();
                    break;
            }
        }

        public static void AddSqlCache()
        {
            var dt = new DataTable();
            var da = new SqlDataAdapter("select * from Contact", ConfigurationManager.ConnectionStrings["Student"].ConnectionString);
            da.Fill(dt);
            HttpContext.Current.Cache.Add("Contact"
                                          , dt
                                          , new SqlCacheDependency("Student", "Contact")
                                          , DateTime.Now.AddDays(1)
                                          , Cache.NoSlidingExpiration
                                          , CacheItemPriority.High
                                          , ContactCacheItemRemoved);
        }

        public static void ContactCacheItemRemoved(string key, object value, CacheItemRemovedReason reason)
        {
            switch (reason)
            {
                case CacheItemRemovedReason.DependencyChanged:
                    AddSqlCache();
                    break;
            }
        }
    }

e)修改Global.asax.cs的Application_Start

 void Application_Start(object sender, EventArgs e)
        {
            //在应用程序启动时运行的代码
            CacheUtil.AddCache();
            CacheUtil.AddSqlCache();
        }

f)修改SqlCacheTest.aspx.cs的Page_Load

 protected void Page_Load(object sender, EventArgs e)
        {
            if (Cache["Contact"] == null)
            {
                CacheUtil.AddSqlCache();
            }
            var dt = (DataTable)Cache["Contact"];
            GridView1.DataSource = dt;
            GridView1.DataBind();
        }

 g)效果图

  当我们在SSMS中修改数据库表的数据后,停小段时间,刷新页面

8)页输出缓存概述 
  • 页输出缓存是指在缓存ASP.NET  页所生成的部分响应或所有响应
  • 提高Web应用程序的性能
  • 提高Web服务器的吞吐量
9)SqlCacheDependency 
  • System.Web.Caching.SqlCacheDependency
  – 创建依赖于数据库中表或行的缓存项
    – <%@ OutputCache Duration="30" 
      VaryByParam="none“ SqlDependency="Student:Contact" %>
10)部分页缓存 
  • 控件缓存
    – 控件缓存(也称为片段缓存),可以通过创建 控件缓存(也称为片段缓存),用户控件来包含缓存的内容,然后将用户控件
      标记为可缓存来缓存部分页输出
  • 缓存后替换
    – 以声明方式使用Substitution 控件
    – 以编程方式使用Substitution 控件API
    – 以隐式方式使用AdRotator 控件
11)DataSource 缓存
  • 启用XxxDataSource 当中的缓存
  • 缓存单个数据源控件

12)SqlCacheDependency页面输出缓存实例

  a)新建文件夹:OutputCache

  b)在文件夹OutputCache中新建SqlCacheDependency.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="SqlCacheDependency.aspx.cs" Inherits="UseCache.OutputCache.SqlCacheDependency" %>

<%@ OutputCache Duration="3600" VaryByParam="none" SqlDependency="Student:Contact" %>

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

        <br />
        <asp:GridView ID="GridView1" runat="server">
        </asp:GridView>
        <br />

</asp:Content>

后台代码:

public partial class SqlCacheDependency : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Label1.Text = DateTime.Now.ToLongTimeString();
            var dt = new DataTable();
            var da = new SqlDataAdapter("select * from Contact",
                                        ConfigurationManager.ConnectionStrings["Student"].ConnectionString);
            da.Fill(dt);
            GridView1.DataSource = dt;
            GridView1.DataBind();
        }
    }

13)使用用户控件

  a)在文件夹OutputCache中新建LableControl.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="LableControl.ascx.cs" Inherits="UseCache.OutputCache.LableControl" %>
<%@ OutputCache Duration="5" VaryByParam="none" %>

 <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

后台代码:

 protected void Page_Load(object sender, EventArgs e)
        {
            Label1.Text = DateTime.Now.ToLongTimeString();
        }

b)在文件夹OutputCache中新建PartialCachePage.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="PartialCachePage.aspx.cs" Inherits="UseCache.OutputCache.PartialCachePage" %>
<%@ Register src="LableControl.ascx" tagname="GridControl" tagprefix="uc1" %>

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br />

         LableControl用户控件缓存5秒:<uc1:GridControl ID="LableControl1" runat="server" />
</asp:Content>

后台代码:

 protected void Page_Load(object sender, EventArgs e)
        {
            Label1.Text = DateTime.Now.ToLongTimeString();
        }

14)使用SqlDataSource

  在文件夹OutputCache中新建SqlDataSourceCache.aspx

转载请注明出处:http://www.cnblogs.com/refactor

时间: 2024-08-29 04:05:15

数据缓存技术及代码详解的相关文章

jQuery数据缓存data(name, value)详解及实现

一. jQuery数据缓存的作用 jQuery数据缓存的作用在中文API中是这样描述的:“用于在一个元素上存取数据而避免了循环引用的风险”.如何理解这句话呢,看看我下面的举例,不知道合不合适,如果你有更好的例子可以告诉我. (1) 存在循环引用风险的例子(注意getDataByName(name)方法中的for in语句): <a href="javascript:void(0);" onclick="showInfoByName(this.innerHTML);&qu

第6章 数据存储全方案,详解持久化技术

第6章 数据存储全方案,详解持久化技术 所有的App都可以说是与数据打交道的,离开数据它们什么都不是.那么平时我们怎么存储一些关键的数据呢? 1 持久化技术简介 数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失.保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久状态的,持久化技术则是提供了一种机制可以让数据在瞬时状态和持久状态之间进行转换. Android系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件

ARM Cortex-M底层技术(2)—启动代码详解

杂谈 工作了一天,脑袋比较乱.一直想把底层的知识写成一个系列,希望可以坚持下去.为什么要写底层的东西呢?首先,工作用到了这部分内容,最近和内部Flash打交道比较多,自然而然会接触到一些底层的东西:第二,近些年来Cortex-M阵营各厂商(ST.Nordic.ATMEL……)对新产品的迭代速度越来越快,以及微控制器应用普及程度的加深,越来越多的开发者把更多精力投注在应用层开发上,花在对底层技术上的时间越来越少,更深层次的原因是走嵌入式底层没有做互联网上层赚钱.希望自己可以把嵌入式ARM Cort

JQuery选择器代码详解(三)——tokenize方法

原创文章,转载请注明出处,多谢! /* * tokenize函数是选择器解析的核心函数,它将选择器转换成两级数组groups * 举例: * 若选择器为"div.class,span",则解析后的结果为: * group[0][0] = {type:'TAG',value:'div',matches:match} * group[0][1] = {type:'CLASS',value:'.class',matches:match} * group[1][0] = {type:'TAG'

Android基础之十四数据存储 之 SQLite数据库详解

Android基础之十四数据存储 之 SQLite数据库详解 SQLite 是一款 轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百 K 的内存就足够了,因而特别适合在移动设备上使用. SQLite 不仅支持标准的 SQL 语法,还遵循了数据库的 ACID( 原子性(Atomicity) .一致性(Consistency) . 隔离性(Isolation) . 持久性(Durability))事务,所以只要你以前使用过其他的关系型数据库,就可以很快地上手 SQLite.而

20155326《网络对抗》免考项目—— 深入恶意代码之恶意代码详解

20155326<网络对抗>免考项目--深入恶意代码之恶意代码详解 什么是恶意代码 恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到另一段程序中,从而达到破坏被感染电脑数据.运行具有入侵性或破坏性的程序.破坏被感染电脑数据的安全性和完整性的目的. 恶意代码生命周期 攻击目标: 个人计算机 服务器 移动智能终端 手机.平板等 智能设备 特斯拉汽车.智能家居.智能手表等 通信设备 路由器.交换机等 安全设备等 防火墙.IDS, IPS. VDS 攻击目标范围: 定点攻击 邮件.IP.域名.

tiny_cnn代码详解(3)——层间继承关系

在上一篇博文中我们顺利将tiny_cnn的程序调试通过,在这篇博文中我们尝试从整体角度给出对tiny_cnn这个深度学习框架的解读,重点论述一下其各个层直接类封装的继承关系. 一.卷积神经网络快速入门 tiny_cnn作为卷积神经网络的一种实现形式,在探讨其框架结构之前,首先需要简要介绍一些卷积神经网络相关的知识.首先,给出经典卷积神经网络的网络结构: 这个是经典的LeNet-5的网络结构图,五层网络.最早用于支票上的手写数字识别,也是最早的商业化的深度学习模型.从上图中可以看出,卷积神经网络主

Github-jcjohnson/torch-rnn代码详解

Github-jcjohnson/torch-rnn代码详解 [email protected] http://www.cnblogs.com/swje/ 作者:Zhouwan  2016-3-18 声明: 1)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除. 2)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢. 请联系:[email protected] 或[email protected] 本研

jQuery选择器代码详解(四)——Expr.preFilter

原创文章,转载请注明出处,多谢! Expr.preFilter是tokenize方法中对ATTR.CHILD.PSEUDO三种选择器进行预处理的方法.具体如下: Expr.preFilter : { "ATTR" : function(match) { /* * 完成如下任务: * 1.属性名称解码 * 2.属性值解码 * 3.若判断符为~=,则在属性值两边加上空格 * 4.返回最终的mtach对象 * * match[1]表示属性名称, * match[1].replace(rune