摘要:所谓公共指的cache只要一创建是任何一个客户端浏览器都可以通过后台代码访问到它,它面向的是所有用户,相对而言session也是服务器上的一段内存,但他面向的是单个用户。它是服务器的一段内存块,也就是说每个cache一经创建就占用了服务器资源的。

Cache 即高速缓存 ,我想很多人对他的第一印象一定像我一样,感觉他一定能提高系统得性能和运行速度。的确。Net推出cache的初衷确实是这样的。那么cache是如何提高系统性能与运行速度呢?是不是在任何情况下用cache都能提高性能?是不是cache用的越多就越好呢?我在近期开发的项目中有所体会,写下来当作总结也希望能跟大家一起探讨探讨,有错误的地方希望大家批评指正。

1. Cache 是如何工作的。

l Cache 是分配在服务器上的一个公共的内存片。

所谓公共指的cache只要一创建是任何一个客户端浏览器都可以通过后台代码访问到它,它面向的是所有用户,相对而言session也是服务器上的一段内存,但他面向的是单个用户。它是服务器的一段内存块,也就是说每个cache一经创建就占用了服务器资源的。所以从这点来说我们就可以说:并不是cache越多越好。

l cache 是有时间限制的,超过了服务器设定的过期时间,它就会被服务器回收。

l c.cache 可以存放任何对象

2. Cache 如何创建以及如何销毁。

l 创建cache

在。Net环境下通过Cache.Insert(string key,object o)方法创建。其中key 代表cache的ID,o代表存到cache里的对象。

l 销毁cache.

通过方法Cache.Remove(string key)其中key 代表cache的 ID.

l 调用cache.

Cache支持装箱/拆箱操作。如你可以把一个DataSet对象ds通过Cache.Insert(“dsCache”,ds)的方式存到Cache中,可以通过拆箱操作 DataSet ds = (DataSet)Cache[“dsCache”]来访问它。

3. 什么时候用cache.

Cache 一般用于数据较固定,用的较频繁的地方。例如可以把进销存系统中可以把产品信息存入cache,在用户调用产品信息时通过调用cache即可,这样从很大程度上减少了用户与数据库的交互,提高了系统的性能。反之,cache不适合用在数据变动快,使用范围很窄的地方。例如把一个具体采购单存入 cache中。

4. cache 调用注意事项。

Cache是有时间限制的。超过了服务器设置的过期时间,就会被服务器回收。当cache被回收后对应的内存块就会被清空,再次通过cache[“cachekey”]访问对象时返回的就是null值。所以以下这种调用就会出现异常

DataSet ds = (DataSet)Cache[“cacheds”];

DataRow dr = ds.Table[0].Row[0]; //出错,ds为null值,不存在表0。

正确的写法应该是:

DataSet ds

If(Cache[“cacheds”] != null)

{

ds = (DataSet)Cache[“cacheds”];

}

Else

{

ds= GetDsFromDataBase();

}

DataRow dr = ds.Table[0].Row[0];

Asp.net支持三种类型的cache
1.  页面/控件cache
2.  应用程序级cache
3.  浏览器客户端cache

从实现方式来看,页面/控件cache和应用程序级cache都是存放在服务器内存里面的,随着内存的紧张程度,这些内容有可能在失效之前被提前删除。(cache的特性决定这些内容是可以放心得删除掉的)。浏览器客户端的cache是存放在客户端浏览器的cache里面 ,比如IE的临时文件夹就是起的cache的作用。每次用户请求一个页面的时候,浏览器会先从cache里面去查找一下有没有符合要求的还没有过期的cache内容,如果有的话就从cache里面直接读取跳过网络传输。

下面演示一下在Asp.net里面具体的写法:

1.       页面/控件cache可以申明在aspx,ascx文件里面,也可以在code behind里面作出申明。

<%@ OutputCache Duration="#ofseconds"

Location="Any | Client | Downstream | Server | None |

ServerAndClient "

Shared="True | False"

VaryByControl="controlname"

VaryByCustom="browser | customstring"

VaryByHeader="headers"

VaryByParam="parametername"

CacheProfile="cache profile name | ''"

NoStore="true | false"

SqlDependency="database/table name pair | CommandNotification"

%>

主要的参数是:

Duration: cache有效的时间,单位秒

Shared:只对控件有效,在控件可以同时应用与多个页面的时候,多个页面是否可以共享这一个cache而不用每个页面维护自己对这个控件的cache。

VaryByControl:cache随控件的ID变化

VaryByCustom:cache随用户自定义的一个变量来变化,该变量是在这里指定,然后应该在Global.ascx里面实现:

public override string GetVaryByCustomString (

HttpContext context,

string custom

)

该声明的custom参数就是在OutPutcache里面申明的变量。通过在这个函数里面对不同的custom参数返回不同的字符串值来表示不同的cache内容。

VaryByHeader, VaryByParam,CacheProfile也是设置不同的cache版本的。

NoStore表示不允许把cache的内容写到内存以外其它的存储设备上,这是对安全性比较高的内容的需要。

SqlDependency是和数据库相关的。

2.       应用程序级cache

只可以在code behind里面获得,特点是可以实现自己需要的任何cache逻辑。

可以通过Page.Cache获得,类的名字是System.Web.Caching.Cache

3.       浏览器客户端cache

只可以在codebehind里面获得,可以通过Response.Cache来指定,这是一个HttpCachePolicy对象。

另外: 可以指定一个TimeSpan作为cache的时间,不用每次来折算到秒。

public TimeSpan(long ticks);

public TimeSpan(int hours, int minutes, int seconds);

public TimeSpan(int days, int hours, int minutes, int seconds);

public TimeSpan(int days, int hours, int minutes, int seconds, int milliseconds);

如果要cache保留一个小时1分1秒,可以直接

new TimeSpan(1,1,1)

而不用先计算

1小时1分1秒=3600+60+1=3661秒,然后在传入3661作为有效期。

转载于:https://www.cnblogs.com/yeemio/archive/2007/11/20/965297.html

新闻更新延时引发的学习,CACHE的利用。相关推荐

  1. 五月数据库技术通讯丨Oracle 12c因新特性引发异常Library Cache Lock等待

    每月关注:35页数据库技术干货,汇总一个月数据库行业热点事件.新的产品特性,包括重要数据库产品发布.警报.更新.新版本.补丁等. 亲爱的读者朋友: 为了及时共享行业案例,通知共性问题,达成共享和提前预 ...

  2. 密码错误频繁登录引发的“library cache lock”或“row cache lock”等待

    密码错误频繁登录引发的"library cache lock"或"row cache lock"等待 对于正常的系统,由于密码的更改,可能存在某些被遗漏的客户端 ...

  3. 【强化学习文献阅读】DRN:新闻推荐的深度强化学习框架

    Article 作者:Guanjie Zheng, Fuzheng Zhang, Zihan Zheng, Yang Xiang, Nicholas Jing Yuan, Xing Xie, Zhen ...

  4. 草稿--深度学习cache系列

    目录 <深度学习cache系列> - 2022 00-cache思考篇 01-简述cache的基本概念和使用场景 02-cache的基本概念原理扫盲 03-cache的查询原理 04-多核 ...

  5. C/C++ 由int (*p)[5]与int *p[5]引发的学习与思考

    由int (*p)[5]与int *p[5]引发的学习与思考 最近在大一上复习指针这部分时,有个C指针的特例一直困扰着我.我查阅了许多课本,也看了CSDN上许多大佬的理解.自我感觉受益匪浅,现记录下自 ...

  6. Word批量删除空格引发的学习

    Word批量删除空格引发的学习 由于近期在使用Word文档的时候需要进行空格的批量删除,于是,需求驱动了学习,其实word的功能极其强大,只是看你会不会使用了: 利用Word的"替换&quo ...

  7. 数据结构学习笔记:利用栈实现进制转换

    数据结构学习笔记:利用栈实现进制转换 一.除基倒取余法示意图 二.编写十进制转换成二进制Python程序 1.源代码 2.运行结果 其实Python提供了一

  8. 数据结构学习笔记:利用Python列表实现栈结构

    数据结构学习笔记:利用Python列表实现栈结构 利用Python列表实现栈结构.有两种实现方式: 1.将列表的末尾(rear)作为栈顶(top) 2.将列表的前端(front)作为栈顶(top) 一 ...

  9. Python学习笔记:利用timeit计算函数调用耗时

    Python学习笔记:利用timeit计算函数调用耗时 一.timeit模块简介 Timer对象包含两个参数:第一个参数是你想要计时的Python语句,第二个参数运行一次来建立测试. 默认情况time ...

最新文章

  1. 使用 RPI.GPIO 模块的脉宽调制(PWM)功能
  2. 【网络】解决‘ipconfig不是内部或外部命令,也不是可运行的程序
  3. mysql架设_主从mysql架设
  4. rsa php前台加密后台解密源码,使用RSA实现前端公钥加密后端私钥解密
  5. iPhone 12发布当天,罗永浩开“旧机发布会”:香得不行!
  6. 【maven】idea maven slf4j : StackOverflowError
  7. 超搞笑之仙桃有没有毛?
  8. c语言flappy bird代码,Flappy bird源代码(略吊)
  9. DB2 开发系列 从入门开始--概述
  10. OpenCV --- 实现两幅图像并排合并(ROI)
  11. PCIE设备与HOST之间的地址转换
  12. Visio2007画E-R图
  13. 波利亚《如何解题 How to Solve It》
  14. java html截图_Java实现网页截图/登录截图
  15. 公众平台 php,微信公众平台PHP开发(转载)
  16. Gradle同步工程下载依赖慢
  17. [原创].菜农M0助学板PDMA读取ADC样本小练(寄存器操作方式)
  18. python与工业_星球大战与Python之间的那些事
  19. 推荐一款开源物流管理系统,适合学习研究
  20. (云反馈)金蝶迷你版账套怎么转标准版?

热门文章

  1. 让sourceSafe每天自动备份及修复(适用于vss6.0和vss2005)
  2. 本期期刊主题:ASP.NET技术与JavaScript技巧,包括控件等
  3. 计算机维修实训报告模板,[计算机维修实验报告模板.doc
  4. js 获取当前gmt时间_javascript-如何将日期转换为GMT?
  5. 试分别简述udp和tcp的特点_技术帖:污水处理中曝气设备的分类及特点小结
  6. Mybatis获取已经赋值,没有问号的Sql
  7. 语言迭代发_从今天开始,每天学点R语言~
  8. Java后端学习体系(韩顺平)
  9. python树的实现
  10. mysql binlog c++_关于MySQL的日志管理(binlog)