一谈到缓存,最先想到的应该就是cookie,sessionStorage和localStorage的区别,那就先讲下他们三个吧。
- cookie:cookie就是存储在本地的一个纯文本文件。每次客户端向服务端发起请求时,服务端都会生成一个cookie返回给客户端,而这个cookie就作为缓存留在客户端,并且可以为cookie设置过期时间,时间一到cookie就失效了,就像那种你在一个页面登录了账号,但过了几个月以后你又得重新登录。cookie里会保存一些你的信息比如账号密码,让你避免每次打开网页都得重新登录;或者保存一些你的用户习惯,比如你设置的字体大小和颜色之类的信息。然而每次请求(客户端→服务端)和响应(服务端→客户端)都会携带cookie,但cookie存储信息太多的时候(但cookie其实容量很小,大概只有4kb),就会造成许多不必要的网络负担,这个时候就web storage就派上了用场。
- session storage:session storage的容量就比较大了,大概5MB的样子,而且他只是保存在本地,并不会随着请求一起发送到服务端。但是session storage不能长期存储,手动删除或浏览器窗口关闭即失效。想想这种情况,我注册一个网游账号,充了一堆钱,但几个月没玩cookie失效了,密码我又忘了,还没有绑定手机号,OMG,你是不是以为这个时候你就要原地爆炸了。不要慌,我们还有local storage。
- local storage:local storage和session storage基本相似,但local storage的好处就在于没有失效时间。可以长期存储。也就是说,只要你不手动清除缓存,这些信息就永久的保存在你本地了。哈哈哈哈哈,妈妈再也不用担心我忘记游戏账号了。
既然说到了cookie,就在谈谈cookie和session的渊源吧。上面说到,cookie是保存在客户端的,那session自然是保存在服务端的。具体的工作原理如下
cookie和session
大致分为以下几步:
- 客户端第一次给服务端发送请求,服务端发现这是客户端第一次给我发送的请求,然后就在服务端生成session(保存着该客户端的一些比如账号信息)和cookie。
- 服务端第一次响应,返回给客户端请求的信息和cookie(一般会携带一个sessionID)。
- 之后每次客户端向服务端发起请求时都会携带cookie,服务端响应时也会返回cookie。在cookie到达服务端时,服务端就会根据sessionID查询数据库,如果sessionID存在,就直接调用保存在服务端的对应用户的sessionID,如果不存在,就说明session过期了(也有可能是其他原因,笔者没有深入研究,有兴趣的小伙伴自己百度哈)。
那既然cookie每次请求响应都要带着,为什么还要有session这种东西呢?大哥,网络不要钱啊?你把每次请求和响应都带着客户所有的信息,网络早就挤爆了好么,况且cookie也就4kb,能带多少东西。session大小是无限制的,在服务端也能给session设置过期时间,只携带一个sessionID多方便啊。就和你把钱存银行一样,你只需要带张银行卡就够了。但有个问题,cookie天天在网络里面跑,一不小心就被截获了,这个时候人家拿到了你的银行卡号和密码,你不是血亏了么。所以出于安全考虑,大部分信息我们还是放在session里的。不过也不能一味的往session里面堆东西。你想想,session是放在服务器上的,一旦session数量过大的话,服务器就直接崩掉了好吗。 - 总结一下
- cookie是存放在客户端的,session是存放在服务端的。
- cookie大小是有限的(4kb),session大小是无限制的。
- 出于安全考虑应该使用session,出于服务器性能考虑应该使用cookie,两者应该相互结合,互补使用。
然后顺带提一下强缓存(本地缓存)和协商缓存。我的理解就是强缓存就是根据服务端设置的返回的资源有效时间来判断是否使用缓存,而进行这个判断是在客户端进行的,如果命中缓存,就直接使用缓存不发请求了。协商缓存就是要发送请求,然后是否使用缓存要在服务端进行判断,然后再告诉客户端。协商缓存和强缓存相关参数