asp.net 缓存
一:缓存概念,缓存的好处、类型
概念: 缓存是一种使用空间换取时间的的技术 通俗点说就是将你的数据放在内存里面存储一段时间 在这段时间内 如果你需要这些数据 那么不必要去访问数据库 直接从内存中读取出这些数据即可
缓存的好处: 缓存是网站性能优化的中的一种机制 可以有效的缓解数据库方面的压力 比如说 在一分钟内 有1万人访问你“联系我们” 这个页面(如果没有viewstate) 而相对来说 这个页面的内容一般是不需要进行改变的 那我们可以使用缓存 将这个页面的内容缓存起来 在缓存未过期的时间内 直接从缓存中取出你需要的数据即可 这样可以减少访问数据库的压力
缓存的类型 : 页面缓存, 数据缓存
---------------------------------------------------------------------------------------------------------------------------------------------------------------
二:缓存的处理机制
图解的自我理解
当浏览器第一次给服务器发送一个url请求的时候 会在管道事件中的第15个和第16个之间判断请求页面类的对象是否有实现 OutputCache 命令 如果有 那么会将response里面的数据缓存到服务器的内存中 同时会在响应报文头里面产生一个last-modifine(服务器响应给浏览器的时间) 还有一个Expires Expries=last-modifine +Duration的值
在第二次请求的是 同一个url的时候 会将上一次的last-modifine 赋值给 请求报文头里面的If-Modified-Since: 同时 也会产生一个last-modifine 判断浏览器时间是否小于Expires 如果小于 那么久取出缓存 执行完19个管道事件 然后将内容传回给浏览器显示 此时的状态为 304
如果当前浏览器的时间不小与Expires的时间 那么回执行第8个事件 重新创建页面类的对象 还会在第15 第16个事件中更新缓存数据 执行完19个管道事件后 就将数据返回给服务器 在传回给客户端 此时状态为200
-------------------------------------------------------------------------------------------------------------------------------------------------------------
缓存的种类
整页缓存 :
<%@ OutputCache Duration ="10" VaryByParam =“none" %>
Duration设置缓存的时间 Duration表示的是秒 VarByParam=”None”
指定ASP.NET只存储缓存页面的一个拷贝
例如: 将整页的数据缓存10秒
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="P01PageCache.aspx.cs" Inherits="Cache.P01PageCache" %> <%@ OutputCache Duration="10" VaryByParam="none" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <form id="form1" runat="server"> <%=DateTime.Now%> </form> </body> </html>
或者将缓存的指令写在配置文件中: 配置在<system.web> 节点下面
<caching> <outputCacheSettings> <outputCacheProfiles> <add name="ccach" duration="10" varyByParam="none" /> </outputCacheProfiles> </outputCacheSettings> </caching>
如果在配置文件中写了缓存的配置的节点 那么在前端是不需要在写 OutPutCache 的指令集的
通过参数来改变缓存
例如:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="P02ByParamsCache.aspx.cs" Inherits="Cache.P02ByParamsCache" %> <%@ OutputCache Duration="50" VaryByParam="id;name" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <form id="form1" runat="server"> <div> <%=DateTime.Now %> </div> </form> </body> </html>
在Duration的时间内 通过更改url:http://localhost:1172/P02ByParamsCache.aspx?id=1&name=jack 中id 和name的值 来更新缓存
控件缓存
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="P03ByControls.aspx.cs" Inherits="Cache.P03ByControls" %> <%@ OutputCache Duration="10" VaryByParam="none" VaryByControl="DropDownList1" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:DropDownList ID="DropDownList1" runat="server"> <asp:ListItem Text="男" Value="0"></asp:ListItem> <asp:ListItem Text="女" Value="1"></asp:ListItem> </asp:DropDownList> </div> <%=DateTime.Now %> </form> </body> </html>
在缓存有效期内,通过更改DropDownList1里面的选项 再刷新页面之后 会获取到更新的数据
自定义控件缓存
首先添加自定义类 然后再里面协商缓存的指令集 和需要缓存的内容
<%@ OutputCache Duration="20" VaryByParam="none" %>
这是自定义控件里面的内容:<%=DateTime.Now %>
然后再.aspx页面中 拖入自定义的控件 页面de顶端会自动生成一个register的指令集
<uc1:WebUserControl1 runat="server" ID="WebUserControl1" />(词自定义控件由外界拖入)
这是控件之外的时间:<%=DateTime.Now %>
产生的Register指令集
<%@ Register Src="~/WebUserControl1.ascx" TagPrefix="uc1" TagName="WebUserControl1" %>
运行这个页面之后 会看到自定义缓存的空间的内容是不会改变的 但是在另外一个DateTime.Now的时间会改变
数据缓存
相对过期时间:
比如你设置的过期时间是20秒 那么你在这20秒内点击一次(假设当前时间为 14:14:12) 那么过期的时间就是14:14:12+20s=14:14:32 也就是在14:14:32后缓存将会失效 每点击一次 那么久从当前的时间开始计算 在加上Duration的时间 那么就是过期的时间
绝对过期时间:
比如你设置的过期的时间是20秒 那么在这20s内 你怎么操作 都是取得是缓存里面的数据 一旦20S超过之后 那么缓存就失效
文件依赖缓存
protected void Page_Load(object sender, EventArgs e) { DateTime now; //判断当前是否存在缓存 object obj = HttpRuntime.Cache["time"]; if (obj == null) { now = DateTime.Now; System.Web.Caching.CacheDependency file = new System.Web.Caching.CacheDependency(Server.MapPath("/1.txt")); HttpRuntime.Cache.Add( "time",//缓存的键 now,//缓存里面存放的值 file,//过期策略 System.Web.Caching.Cache.NoAbsoluteExpiration,//绝对过期时间 TimeSpan.Zero,//相对过期时间 System.Web.Caching.CacheItemPriority.Normal,//缓存的缓存级别 null//缓存过期后执行的回调函数 ); obj = HttpRuntime.Cache["time"]; } Response.Write(obj.ToString()); }
数据库依赖缓存
1.0 修改web.config
<caching> <sqlCacheDependency pollTime="1000"> <databases> <add name="tb" connectionStringName="Conn"/>Conn是当前连接数据库节点的名称 </databases> </sqlCacheDependency> </caching>
2.0 使用cmd 创建一个数据库缓存依赖的表
打开CMD cd C:\Windows\Microsoft.NET\Framework\v4.0.30319 跳转到当前目录下面 aspnet_regsql.dll程序集
然后使用CMD命令
public class MgrCache { //1.0存 /// <summary> /// 相对过期时间 /// </summary> /// <param name="cacheKey"></param> /// <param name="obj"></param> public static void SetCache(string cacheKey, object obj) { HttpRuntime.Cache.Add( cacheKey,//缓存键 obj,//值 null,//过期策略 DateTime.Now.AddDays(1),//绝对过期时间 TimeSpan.Zero,//绝对过期时间 CacheItemPriority.Normal,//优先级 null//回调函数 ); } /// <summary> /// 设置数据库缓存 /// </summary> /// <param name="cacheKey"></param> /// <param name="obj"></param> /// <param name="sqlDep"></param> public static void SetCache(string cacheKey, object obj, SqlCacheDependency sqlDep) { HttpRuntime.Cache.Add( cacheKey,//缓存键 obj,//值 sqlDep,//过期策略 System.Web.Caching.Cache.NoAbsoluteExpiration,//绝对过期时间 TimeSpan.Zero,//相对过期时间 CacheItemPriority.Normal,//优先级 null//回调函数 ); } //2.0取 public static object GetCache(string cacheKey) { object obj; if (HttpRuntime.Cache[cacheKey] != null) { obj = HttpRuntime.Cache[cacheKey]; } else { obj = null; } return obj; } }
//4.0 使用
if (HttpRuntime.Cache[Kits.CacheKey] == null) { //去数据库里面查找联系我们一栏 ContentsEntity entity = Contents_BLLSub.Get_ContentsEntity(17); //给sb赋值 sb = entity.cnt_content; System.Web.Caching.SqlCacheDependency sqlDep = new System.Web.Caching.SqlCacheDependency("tb", "Contents");
//tb:是在Web.config 文件的 caching 节的 sqlCacheDependency 的databases 元素中定义的数据库的名称。
// Contents: 与 SqlCacheDependency 关联的数据库表的名称。 MgrCache.SetCache(Kits.CacheKey, entity, sqlDep); } else { ContentsEntity entity = (ContentsEntity)MgrCache.GetCache(Kits.CacheKey); sb = entity.cnt_content; }
命令aspnet_regsql -C "data source=127.0.0.1;initial catalog= cachedb;user id=sa;password=123" -ed -et -t "Contents"
以下是该工具的命令参数说明:
-? 显示该工具的帮助功能;
-S 后接的参数为数据库服务器的名称或者IP地址;
-U 后接的参数为数据库的登陆用户名;
-P 后接的参数为数据库的登陆密码;
-E 使用当前登录用户的 Windows 集成认证进行身份验证。
-d 后接参数为对哪一个数据库采用SqlCacheDependency功能;
-C 连接数据库的连接字符串。如果您指定服务器(-S)和登录(-U和-P,或 -E)信息,则此选项不是必需的,因为连接字符串已经包含这些信息。
-t 后接参数为对哪一个表采用SqlCacheDependency功能;
-ed 允许对数据库使用SqlCacheDependency功能;
-dd 禁止对数据库采用SqlCacheDependency功能;
-et 允许对数据表采用SqlCacheDependency功能;
-dt 禁止对数据表采用SqlCacheDependency功能;
-lt 列出当前数据库中有哪些表已经采用sqlcachedependency功能。