16.缓存(Cache)
- 如果每次进入页面的时候都查询数据库生成页面内容的话,如果访问量非常大,则网站性能会非常差。而如果只有第一次访问的时候才查询数据库生成页面内容,以后都直接输出内容,则能提高系统性能,这样无论有多少人访问都只访问一次数据库。
- 缓存是一种用空间换取时间的技术,存在于计算机中很多地方,用来将一些慢速设备中的常用数据保存在快递设备中,取数据的时候直接从快速设备中取。比如CPU的二级缓存、windows文件读取缓存。
- 缓存存在失败的问题:为了保存从缓存中读取数据和慢速数据中数据一致,则需要在慢速数据中对应的数据发生变化的时候清除缓存中相应的数据。
- 缓存是改进网站性能的第一个手段,就像索引是改进数据库性能的第一个手段一样。Asp.net缓存主要分为页面缓存、数据湖缓存和数据缓存这三种主要类型。
页面缓存:
- 经页面添加<%@ OutputCache Duration="15" VaryByParam="none" %>标签就可以启用页面缓存,这样整个页面的内容都会被缓存,页面中的Asp.net 代码、数据源在缓存期间都不会被运行,而是直接输出缓存的页面内容。Duration表示缓存时间,以秒为单位,超过这个时间则缓存失效,再次生成以后会再缓存15秒,以此类推。
- 缓存是针对所有这个页面的访问者,这样1个访问者和1万个访问者、一次访问和100万次访问对数据库的压力都是一样的。
- 对于看新闻页面来讲,如果如上设置的话,则会缓存在第一个看到的新闻,因为?id=2, ?id=3只是页面的不同参数而已,为了能让不用的新闻各自缓存,因此可以设置 VaryByParam="id",表示对于不同的id参数进行单独缓存。如果有多个确定缓存的参数,则将参数名用分号隔开即可,如VaryByParam="id;number"
- 如果想让任何不同的查询字符串都创建不同的缓存,则设置VarByParam="*",一般情况下设置"*"就足够
- 在WebUserControl中也可以像页面缓存一样设置控件的缓存。
数据源缓存:
- 设定ObjectDataSource的CacheDuration(缓存时间:秒),EnableCaching=True,这样每隔CacheDuration指定的时间段才调用SelectMethod指定的方法来执行数据库查询,其它时候都是直接返回缓存的数据,CacheDuration默认是Infinite,表示永久缓存,要改成数字就可。
- 缓存固定的时间适用于首页、文章列表等访问频繁的页面,对于看贴页面则不适合,假设有100万个帖子,如果第个帖子都是固定缓存1小时的话,假设一小时内有10万个帖子被看了,那就要缓存10万个帖子,非常占用内存,因为“百年看贴”的“坟贴”偶然被访问一次也缓存一个小时占用内存。这时候可以采用“滑动窗口”策略,比如帖子缓存10分钟,如果10分钟之内又访问了,则缓存失效时间修改为从被访问这一刻起的10分钟,以此类推。这样经常访问的帖子就可以“长期缓存”,而不经常访问的帖子也不会因为偶然访问而长期占用缓存,设置方法,数据源的CacheExpirationPolicy="Sliding".
数据缓存:
- 和Cookie有点语法相似,如 HttpContext.Current.Cache["id"] = "22";