[ASP.NET]高速缓冲存储器Cache

前言;我们在浏览网站的时候,会遇到网站反应很慢的情况,在这种情况下就不愿意等待了。那么如何提高网站的性能,提高用户的体验度呢,这篇博客将会和大家分享一下缓存Cache。

(一)简介

1.背景

如果每次进入页面的时候都查询数据库生成页面内容的话,如果访问量非常大,则网站性能会非常差。而如果只有第一次访问的时候才查询数据库生成页面内容,以后都直接输出内容,则能提高系统性能。这样无论有多少人访问都只访问一次数据库,数据库压力不变。这就是高速缓冲存储器Cache
【经常访问,但是不是经常改动的数据.】
【缓存是网站优化的一个手段】

2.内容

缓存(Cache)是一种【用空间换取时间】的技术,存在于计算机中很多地方,用来将一些慢速设备中的常用数据保存在快速设备中,取数据的时候直接从快速设备中取。比如CPU二级缓存、内存、windows文件读取缓存。

3.缓存存在失效的问题

为了保证从缓存中读取数据和慢速数据(数据库)中数据一致,则需要在慢速数据(数据库)中对应的数据发生变化的时候,清除缓存中相应的数据(缓存依赖)。

缓存是改进网站性能的第一个手段,就像索引是改进数据库性能的第一个手段一样。

(二)分类:

页面缓存(中庸)、
数据源缓存(最不灵活的)、
自定义数据缓存(灵活)这三种主要类型。

1.页面缓存

(1)给页面添加缓存:

<%@ OutputCache Duration=“15”  VaryByParam=“none”%>//Duration表示缓存时间,以秒为单位,
超过这个时间则缓存失效,再次生成以后会再缓存15秒,以此类推。

标签就可以启用页面缓存,这样整个页面的内容都会被缓存,页面中的ASP.Net代码、数据源在缓存期间都不会被运行,而是直接输出缓存的页面内容。

(2)页面缓存的应用

缓存是针对所有这个页面的访问者。这样1个访问者和1万个访问者、一次访问和100万次访问对数据库的压力是一样的。
对于看新闻页面来讲,如果如上设置的话,则会缓存在第一个看到的新闻,因为?id=2、?id=3只是页面的不同参数而已,为了能让不同的新闻各自缓存,因此可以设置VaryByParam=“id”,表示对于相同页面的不同的id参数进行单独缓存。如果有多个确定缓存的参数,则将参数名用分号隔开即可,比如VaryByParam=“id;number”。测试。

缓存可能会有过期数据的问题,因此根据需求选用。

如果想让任何不同的查询字符串都创建不同的缓存,则设置
VaryByParam="*",一般情况下设置“*”就足够。
在WebUserControl中也可以像页面缓存一样设置控件的缓存。

2.数据源缓存

设定ObjectDataSource的CacheDuration(缓存时间:秒),EnableCaching=true。
这样每隔CacheDuration指定的时间段才调用SelectMethod指定的方法来执行数据库查询,其他时候都是直接返回缓存的数据。
取数据的过程缓存,在缓存期间,绑定控件向ObjectDataSource要数据, ObjectDataSource直接将缓存的数据返回给控件,不再去向TypeName指向的类要数据。

3.缓存依赖

CacheDependency cDep = new CacheDependency(filePath);//缓存依赖于文件内容

依赖于数据库内容(轮询机制/通知机制)

一:轮询机制 –fw主动到数据库检查数据是否改变
1.使用C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727中的aspnet_regsql.exe:
注册:aspnet_regsql -S . -E -ed -d 数据库名 -et -t 表名
删除:aspnet_regsql -S . -E -d 数据库名 -dt -t 表名
取消数据库缓存依赖: aspnet_regsql -S . -E -dd 数据库名
数据库名 列出已注册表:aspnet_regsql -S . -E -d 数据库名 -lt

2.配置web.config

3.自定义缓存

protected void Page_Load(object sender, EventArgs e)
        {
            //判断缓中是否有数据
            if(Cache["UserInfoList"]==null)
            {
                UserInfoBLL userInfoBLL = new UserInfoBLL();
                List<UserInfo> list = userInfoBLL.GetList();
                //将数据放到缓存中
               // Cache["UserInfoList"] = list;//更常用
                Cache["UserInfoList"] = list;
                Cache.Insert("UserInfoList", list, null, DateTime.Now.AddSeconds(5), TimeSpan.Zero, System.Web.Caching.CacheItemPriority.Normal, RemoveCache);//过期时间一般不用
                Response.Write("数据来自数据库");
               // Cache.Remove("UserInfoList");//移除缓存
            }
            else
            {
                List<UserInfo> list = (List<UserInfo>)Cache["UserInfoList"];
                Response.Write("数据来自缓存");
            }

        }

        protected void RemoveCache(string key,object value,CacheItemRemovedReason reason)
        {
            if(reason==CacheItemRemovedReason.Expired)
            {
                //缓存移除愿意写到日志中
            }
        }

4.数据库依赖对象


SqlCacheDependency cDep =  new SqlCacheDependency("GSSMS", "Students");//GSSMS:表示配置的名字。Students:表示表名.

5.Cache.与Session的区别

每个用户都有自己单独的Session对象。
但是放在Cache中的数据是大家共享的。

总结:不得不说Cache的效率还是非常高的,不过缓存也会占用磁盘空间,会影响计算机的响应速度,因此定期清理缓存还是有必要的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值