数据缓存技术及代码详解

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;
            }
        }
    }
View Code

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

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

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();
        }
View Code

 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>
View Code

设置connectionStringName:

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

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;
            }
        }
    }
View Code

e)修改Global.asax.cs的Application_Start

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

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();
        }
View Code

 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>
View Code

后台代码:

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();
        }
    }
View Code

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>
View Code

后台代码:

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

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>
View Code

后台代码:

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

14)使用SqlDataSource

  在文件夹OutputCache中新建SqlDataSourceCache.aspx

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

原文地址:https://www.cnblogs.com/eric-qin/p/4057066.html