关于缓存中Cookie,Session,Cache的使用

文章来源:http://canann.iteye.com/blog/1941173

以前实现数据的缓存有很多种方法,有客户端的Cookie,有服务器端的Session和Application

其中Cookie是保存在客户端的一组数据,主要用来保存用户名等个人信息。

Session则保存对话信息。Application则是保存在整个应用程序范围内的信息,相当于全局变量。

Session

Session用来保存每一个用户的专有信息

Session的生存期是用户持续请求时间加上一段时间(一般是20分钟左右)

Session信息是保存在Web服务器内存中的,保存数据量可大可小
由于用户停止使用应用程序之后它仍在内存中存留一段时间,因此这种方法效率较低

代码:

Session[“UserID”]=”test”;
String UserName=Session[“UserID”].ToString();

Cookie

Cookie用来保存客户浏览器请求服务器页面的请求信息

我们可以存放非敏感的用户信息,保存时间可以根据需要设置

如果没有设置Cookie失效日期,它的生命周期保存到关闭浏览器为止

Cookie对象的Expires属性设置为MinValue表示永不过期

Cookie存储的数据量受限制,大多数的浏览器为4K因此不要存放大数据

由于并非所有的浏览器都支持Cookie,数据将以明文的形式保存在客户端

代码:

Resopnse.Cookies[“UserID”]=”test”;
String UserName= Resopnse.Cookies [“UserID”].ToString();

Cache

Cache用于在Http请求期间保存页面或者数据

Cache的使用可以大大的提高整个应用程序的效率

它允许将频繁访问的服务器资源存储在内存中,当用户发出相同的请求后,服务器不是再次处理而是将Cache中保存的数据直接返回给用户

可以看出Cache节省的是时间—服务器处理时间

Cache实例是每一个应用程序专有的,其生命周期==该应用程序周期

应用程序重启将重新创建其实例

注意:如果要使用缓存的清理、到期管理、依赖项等功能必须使用Insert 或者Add方法方法添加信息

代码:

Cache[”ID”]=”cc”;或者Cache.Insert(“ID”,”test”);
String ID =Cache[“ID”].ToString();

通常使用最频繁的是Session,那么Session和Cache又有什么区别呢?

Session缓存和Cache缓存的区别。

(1)最大的区别是Cache提供缓存依赖来更新数据,而Session只能依靠定义的缓存时间来判断缓存数据是否有效。

(2)即使应用程序终止,只要Cache.Add方法中定义的缓存时间未过期,下次开启应用程序时,缓存的数据依然存在。而Session缓存只是存在于一次会话中,会话结束后,数据也就失效了。

(3)Session容易丢失,导致数据的不确定性,而Cache不会出现这种情况。

(4)由于Session是每次会话就被加载,所以不适宜存放大量信息,否则会导致服务器的性能降低。而Cache则主要用来保存大容量信息,如数据库中的多个表。

(5)Session目前只能保存在内存中,对其性能有影响。

 

 

      Session:为当前用户会话提供信息。还提供对可用于存储信息的会话范围的缓存的访问,以及控制如何管理会话的方法。它存储在服务器的内存中,因此与在数据库中存储和检索信息相比,它的执行速度更快。与不特定于单个用户会话的应用程 序状态不同,会话状态应用于单个的用户和会话。因此,应用程序状态非常适合存储那些数量少、随用户的变化而变化的常用数据。而且由于其不发生服务器-客户 端数据传输,Session还适合存储关于用户的安全数据,如购物车信息。
      Session的关键特性有:存储于服务器内存中,与会话相关,在会话的整个生存期中存在即不会被主动丢弃,不被序列化,不发生服务器-客户端数据传输。
      Cache:它存储于 服务器的内存中,允许您自定义如何缓存项以及将它们缓存多长时间。例如,当缺乏系统内存时,缓存会自动移除很少使用的或优先级较低的项以释放内存。该技术 也称为清理,这是缓存确保过期数据不使用宝贵的服务器资源的方式之一。它不与会话相关,所以它是多会话共享的,因此使用它可以提高网站性能,但是可能泄露 用户的安全信息,还由于在服务器缺乏内存时可能会自动移除Cache因此需要在每次获取数据时检测该Cache项是否还存在。
Cache的关键特性有:存储于服务器内存中,与会话无关,根据服务器内存资源的状况随时可能被丢弃,不被序列化,不发生服务器-客户端数据传输。

Cookie:Cookie 提供了一种在 Web 应用程序中存储用户特定信息的方法。例如,当用户访问您的站点时,您可以使用 Cookie 存储用户首选项或其他信息。当该用户再次访问您的网站时,应用程序便可以检索以前存储的信息。在开发人员以编程方式设置Cookie时,需要将自己希望保 存的数据序列化为字符串(并且要注意,很多浏览器对Cookie有4096字节的限制)然后进行设置。

      Cookie的关键特性有:存储于客户端硬盘上,与用户相关,在一定时间内持久化存储,可以跨浏览器共享数据,需要被序列化,发生服务器-客户端数据传输。
 
下面这个问题很有启发性:
最近小组的同事很喜欢用Session做页面跳转,具体就是在查询页面把查询结果放到DataTable中,用Session存储这个dataTable,读取到数据之后再子页面做Session清除,这样对性能有没有什么影响?

1、session:session的确是存放在服务器的内存中(但不是4k上限,具体大小限制应该是服务器内存),而且同一个sessionid的多个 http请求会排队,也就是session对于同一个浏览器来说是同步的,用不好会极大影响性能。另外,session依赖于客户端cookie,因为 sessionid是存放在客户端浏览器进程cookie中的,因此不支持cookie的浏览器,session也会丢失(session url重写可部分解决这个问题,可参考:http://www.sungness.com/archives/48)。因此不建议用。

2、cookie,也不建议存放datatable这样的“大数据”。因为cookie不仅有4k上限,并且不是“纯存放在客户端”这么简单,要知道 cookie的值在每次web页面请求往返的过程中都是要附带在http头中的,如果太大会占用服务器和客户端之间的网络带宽(虽然只是4k,但在线人多 了可就是4k * n了)。对于b/s结构的应用来说,网络带宽是性能最主要的瓶颈之一!另外,对于datatbale转换成json字符串再存入 cookie,服务器CPU也会消耗。最可怕的是,一但你的cookie忘记删除了,那么在其有效期和作用域内,用户访问你的所有页面时都将携带这个4K 大小的http头,那就悲剧了。10000在线人数,4千兆网卡也不够你花的。

3、数据库连接,每次保存查询语句然后再查询的方式不错,不过看你的查询复杂度了,如果很费时的查询,这样调用也是不可取的。内存和cpu的矛盾你要根据 实际情况作出选择。对于具有连接池的应用来说,一次连接数据的成本并不高,经过测试差不多=10次调用取当前系统时间函数。但查询语句的复杂度就没谱了。 另外,如果并发人数很多的情况下,频繁占用数据库连接,会导致连接池没有可用连接了,那就又悲剧了。此时就不是一次连接的成本,系统整体性能将毁灭性的下 降,反应迟钝。

4、cache:一个不错的选择,不过它可同样是占用服务器内存哦,只是比session多了一些灵活性。不过我也不建议你用于存放传递参数的地方。要知 道session就算内存满了也不会丢失你的参数值(会抛异常),可cache可不是,它会直接删掉你的参数值,甚至内存极度不足时都不会让你进去(也不 会报错)。换句话说,可能上一行代码刚存进去,下一行代码去读就丢了。很可怕吧~

5、form表单:最为提倡的方式,http协议中原本页面间传值的方法就是这样的,只是有时不太方便,能用之则用之。
6、自定义存储机制:如果你对性能要求很苛刻,或者非要精益求精的话。那么还是自己写一个存储机制吧。例如我自己就是写了自己的XSession对象,它 的用法与session使用类似,但是存储机制都是我自己封装的,既有cache的优点、又有session的优点,还有数据库的优点、性能看你写的算法 了、而且具有更大的使用灵活性。缺点就是需要你自己coding...
posted @ 2016-03-03 21:44  BOBO~  阅读(13514)  评论(1编辑  收藏  举报