温故知新ASP.NET 2.0(C#)(4) - Cache&SqlCacheDependency(缓存和SqlCacheDependency特性)

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:
[索引页]
[源码下载]



温故知新ASP.NET 2.0(C#)(4) - Cache&SqlCacheDependency(缓存和SqlCacheDependency特性)


作者: webabcd


介绍
存是在计算中广泛使用的一种技术,通过将经常访问的数据或存取开销较大的数据保留在内存或硬盘中来提高性能。在 Web 应用程序的上下文中,缓存用于在 HTTP 请求之间保留页或数据,在重用它们时可以不必耗费资源重新创建。


关键
1、@OutputCache指令中的属性:
    Duration - 缓存时间(秒)
    VaryByParam - 根据使用 POST 或 GET 发送的名称/值对来改变缓存的结果(多参数用分号隔开)
    VaryByControl - 根据用户控件中的控件来改变缓存的片段(值是控件ID,多控件用分号隔开)
    CacheProfile - 调用配置文件中设置的缓存时间

2、增加数据缓存时用Cache.Insert,可以指定缓存时间

3、替换缓存(Substitution)- 回调函数要是静态的

4、SqlCacheDependency
配置文件中的配置
<system.web> 
        <caching> 
            <sqlCacheDependency enabled="true" pollTime="轮询时间(毫秒)"> 
                <databases> 
                    <add name="名字" connectionStringName="连接字符串的名字" /> 
                </databases> 
            </sqlCacheDependency> 
            <!-- 如果是SqlServer2005的话,则只需如下设置,因为SqlServer支持基于通知的缓存失效 
            <sqlCacheDependency enabled="true" /> 
            --> 
        </caching> 
    </system.web>
 
如果不是SqlServer2005的话,应该使用aspnet_regsql注册一下
aspnet_regsql.exe -S "server" -E -d "database" -ed
aspnet_regsql.exe -S "server" -E -d "database" -et -t "table"
如果是Sql验证的话要把-E换成,-U(用户名),-P(密码)


示例
页面输出缓存
Cahce/Page.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Page.aspx.cs" 
        Inherits="Cahce_Page" Title="页面输出缓存" %> 

<%@ OutputCache Duration="10" VaryByParam="none" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 
        <p> 
                Duration="10" VaryByParam="none" 
        </p> 
        <p> 
                <%=DateTime.Now %> 
        </p> 
</asp:Content>
 
API操作缓存
Cahce/Page.aspx.cs
using System; 
using System.Data; 
using System.Configuration; 
using System.Collections; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
 
public partial  class Cahce_Page : System.Web.UI.Page 

         protected  void Page_Load( object sender, EventArgs e) 
        { 
                 /* 通过API设置缓存 不常用啊 
                 
                // 相当于@OutputCache指令中的Duration属性 
                Response.Cache.SetExpires(DateTime.Now.AddSeconds(10)); 
                // 以指定响应能由客户端和共享(代理)缓存进行缓存。 
                Response.Cache.SetCacheability(HttpCacheability.Public); 
 
                // 过期时间可调 
                Response.Cache.SetSlidingExpiration(true); 
                 
                */
 
        } 
}
 
页面输出缓存(VaryByParam)
Cahce/PageByParam.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="PageByParam.aspx.cs" 
        Inherits="Cahce_PageByParam" Title="页面输出缓存(VaryByParam)" %> 

<%@ OutputCache CacheProfile="CacheTest" VaryByParam="p1;p2" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 
        <p> 
                CacheProfile="CacheTest" VaryByParam="p1;p2" 
                <br /> 
                CacheProfile="CacheTest" - 从web.config中读信息 
                <br /> 
                get或post方式都行 
        </p> 
        <p> 
                <a href="?p1=a&p2=b">第一组</a> 
                <br /> 
                <a href="?p1=c&p2=d">第二组</a> 
                <br /> 
                <a href="?p1=e&p2=f">第三组</a> 
        </p> 
        <p> 
                <%=DateTime.Now %> 
        </p> 
</asp:Content>
 
上面页所需的web.config中的配置
<system.web> 
        <caching> 
            <outputCacheSettings> 
                <outputCacheProfiles> 
                    <add name="CacheTest" duration="10" /> 
                </outputCacheProfiles> 
            </outputCacheSettings> 
        </caching> 
    </system.web>
 
页面输出缓存(VaryByControl)
Cahce/CacheControl.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CacheControl.ascx.cs" 
        Inherits="Cahce_CacheControl" %> 
<%@ OutputCache Duration="10" VaryByControl="DropDownList1" %> 
<p> 
        <%=DateTime.Now %> 
</p> 
<p> 
        <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="XmlDataSource1" 
                DataTextField="text" DataValueField="value"> 
        </asp:DropDownList><asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/Config/DropDownListData.xml"> 
        </asp:XmlDataSource> 
</p> 
<p> 
        <asp:Button ID="btn" runat="Server" Text="提交" /> 
</p>
 
Cahce/PageByControl.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="PageByControl.aspx.cs" 
        Inherits="Cahce_PageByControl" Title="页面输出缓存(VaryByControl)" %> 

<%@ Register Src="CacheControl.ascx" TagName="CacheControl" TagPrefix="uc1" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 
        <p> 
                未经缓存设置的容器页: 
                <%=DateTime.Now %> 
        </p> 
        <p> 
                经过VaryByControl设置的用户控件,根据DropDownList的不同缓存不同的内容(用户控件中的@OutputCache指令为Duration="10" 
                VaryByControl="DropDownList1"):<br /> 
                <uc1:CacheControl ID="CacheControl1" runat="server" /> 
        </p> 
</asp:Content>
 
数据缓存
Cahce/Data.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Data.aspx.cs" 
        Inherits="Cahce_Data" Title="数据缓存" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 
        <p> 
                <asp:Label ID="lbl" runat="server" /> 
        </p> 
</asp:Content>
 
Cahce/Data.aspx.cs
using System; 
using System.Data; 
using System.Configuration; 
using System.Collections; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
 
public partial  class Cahce_Data : System.Web.UI.Page 

         protected  void Page_Load( object sender, EventArgs e) 
        { 
                 // 一看就懂 
                 if (Cache[ "key"] ==  null
                { 
                        Cache.Insert( "key", DateTime.Now,  null, DateTime.Now.AddSeconds(10), TimeSpan.Zero); 
                } 
 
                DateTime dt = (DateTime)Cache[ "key"]; 
                lbl.Text = dt.ToString(); 
        } 
}
 
替换缓存(部分区域强行不使用缓存)
Cahce/Substitution.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Substitution.aspx.cs" 
        Inherits="Cahce_Substitution" Title="替换缓存(部分区域强行不使用缓存)" %> 

<%@ OutputCache Duration="10" VaryByParam="none" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 
        <p> 
                Duration="10" VaryByParam="none" 
        </p> 
        <p> 
                <%=DateTime.Now %> 
        </p> 
        <p> 
                API 向返回当前日期的静态方法中插入动态回调,此回调在每次请求时都会执行<br /> 
                <% Response.WriteSubstitution(new HttpResponseSubstitutionCallback(GetTime)); %> 
        </p> 
        <p> 
                使用Substitution 控件插入动态内容<br /> 
                <asp:Substitution ID="Substitution1" runat="server" MethodName="GetTime" /> 
        </p> 
</asp:Content>
 
Cahce/Substitution.aspx.cs
using System; 
using System.Data; 
using System.Configuration; 
using System.Collections; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
 
public partial  class Cahce_Substitution : System.Web.UI.Page 

         protected  void Page_Load( object sender, EventArgs e) 
        { 
 
        } 
 
         // 回调函数所调的静态方法 
         public  static  string GetTime(HttpContext context) 
        { 
                 return DateTime.Now.ToString(); 
        } 
}
 
SqlCacheDependency
页的Sql缓存
Cahce/SqlCachePage.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="SqlCachePage.aspx.cs" 
        Inherits="Cahce_SqlCachePage" Title="页的Sql缓存" %> 

<%@ OutputCache Duration="999999" SqlDependency="VS2005_Test:sqlcache" VaryByParam="none" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 
        <p> 
                Duration="999999" SqlDependency="VS2005_Test:sqlcache" VaryByParam="none"<br /> 
                如果是SqlServer2005则改成SqlDependency="CommandNotification<br /> 
                注意配置文件中的配置 
        </p> 
        <p> 
                <%=DateTime.Now %> 
        </p> 
</asp:Content>
 
数据源控件的Sql缓存
Cahce/SqlCachePage.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="SqlCacheDataSourceControl.aspx.cs" 
        Inherits="Cahce_SqlCacheDataSourceControl" Title="数据源控件的Sql缓存" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 
        <p> 
                DataSource控件设置如下属性:EnableCaching="True" SqlCacheDependency="VS2005_Test:sqlcache" 
                CacheDuration="Infinite"<br /> 
                如果是SqlServer2005则改成SqlDependency="CommandNotification<br /> 
                注意配置文件中的配置 
        </p> 
        <p> 
                <%=DateTime.Now %> 
        </p> 
        <p> 
                <asp:SqlDataSource ID="SqlDataSource1" runat="server" EnableCaching="True" SqlCacheDependency="VS2005_Test:sqlcache" 
                        CacheDuration="Infinite" ConnectionString="<%$ ConnectionStrings:SqlConnectionString %>" 
                        SelectCommand="SELECT * FROM [SqlCache]"></asp:SqlDataSource> 
                <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" AllowSorting="True"> 
                </asp:GridView> 
        </p> 
</asp:Content>
 
web.config中的相关配置
<connectionStrings> 
        <add name="SqlConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\VS2005_Test.mdf;Integrated Security=True;User Instance=True" 
            providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
    <system.web> 
        <caching> 
            <sqlCacheDependency enabled="true" pollTime="10000"> 
                <databases> 
                    <add name="VS2005_Test" connectionStringName="SqlConnectionString" /> 
                </databases> 
            </sqlCacheDependency> 
            <!-- 如果是SqlServer2005的话,则只需如下设置,因为SqlServer支持基于通知的缓存失效 
            <sqlCacheDependency enabled="true" /> 
            --> 
        </caching> 
    </system.web>
 
注意
Sql Server 2005 基于通知的缓存失效,不用aspnet_regsql设置,要设置属性SqlDependency="CommandNotification"。在首次执行某 SQL 查询之前,必须在应用程序某处调用 System.Data.SqlClient.SqlDependency.Start() 方法。此方法应放在 global.asax 文件的 Application_Start() 事件中。因为Sql Server 2005 基于通知的缓存失效对支持查询通知的查询语法有许多限制,所以我觉得最好先别用,而是使用轮询机制。在使用轮询机制时如本例子中的SqlCacheDependency="VS2005_Test:sqlcache",冒号前面是配置文件中配置的相关值指向数据库连接,后面是启用SqlCache的表名,注意区分大小写。


OK
[源码下载]
 
 



     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/344879,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
4月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
1月前
|
编译器 C# 开发者
C# 9.0 新特性解析
C# 9.0 是微软在2020年11月随.NET 5.0发布的重大更新,带来了一系列新特性和改进,如记录类型、初始化器增强、顶级语句、模式匹配增强、目标类型的新表达式、属性模式和空值处理操作符等,旨在提升开发效率和代码可读性。本文将详细介绍这些新特性,并提供代码示例和常见问题解答。
41 7
C# 9.0 新特性解析
|
4月前
|
缓存 弹性计算 NoSQL
【Azure Redis 缓存 Azure Cache For Redis】Redis连接池
【Azure Redis 缓存 Azure Cache For Redis】Redis连接池
|
1月前
|
C# 开发者
C# 10.0 新特性解析
C# 10.0 在性能、可读性和开发效率方面进行了多项增强。本文介绍了文件范围的命名空间、记录结构体、只读结构体、局部函数的递归优化、改进的模式匹配和 lambda 表达式等新特性,并通过代码示例帮助理解这些特性。
34 2
|
3月前
|
编译器 C# Android开发
震惊!Uno Platform 与 C# 最新特性的完美融合,你不可不知的跨平台开发秘籍!
Uno Platform 是一个强大的跨平台应用开发框架,支持 Windows、macOS、iOS、Android 和 WebAssembly,采用 C# 和 XAML 进行编程。C# 作为其核心语言,持续推出新特性,如可空引用类型、异步流、记录类型和顶级语句等,极大地提升了开发效率。要在 Uno Platform 中使用最新 C# 特性,需确保开发环境支持相应版本,并正确配置编译器选项。通过示例展示了如何在 Uno Platform 中应用可空引用类型、异步流、记录类型及顶级语句等功能,帮助开发者更好地构建高效、优质的跨平台应用。
224 59
|
1月前
|
存储 缓存 监控
利用 Redis 缓存特性避免缓存穿透的策略与方法
【10月更文挑战第23天】通过以上对利用 Redis 缓存特性避免缓存穿透的详细阐述,我们对这一策略有了更深入的理解。在实际应用中,我们需要根据具体情况灵活运用这些方法,并结合其他技术手段,共同保障系统的稳定和高效运行。同时,要不断关注 Redis 缓存特性的发展和变化,及时调整策略,以应对不断出现的新挑战。
64 10
|
2月前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
37 1
|
2月前
|
消息中间件 存储 缓存
大数据-71 Kafka 高级特性 物理存储 磁盘存储特性 如零拷贝、页缓存、mmp、sendfile
大数据-71 Kafka 高级特性 物理存储 磁盘存储特性 如零拷贝、页缓存、mmp、sendfile
71 3
|
4月前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常
【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常
110 1
|
4月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Azure Cache for Redis 服务的导出RDB文件无法在自建的Redis服务中导入
【Azure Redis 缓存】Azure Cache for Redis 服务的导出RDB文件无法在自建的Redis服务中导入