免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yanyangtian4502

从案例引发的对缓存设计的思考,干货讨论,绝对不玩虚的(获奖名单已公布-2012-6-13) [复制链接]

论坛徽章:
0
发表于 2012-05-17 10:20 |显示全部楼层
回复 10# Gray1982

对,这个已经到了后面的程序后台的缓存了,等会我会谈到那里!
现在还在前端跑着。呵呵呵


   

论坛徽章:
0
发表于 2012-05-17 10:23 |显示全部楼层
加快速度把,刚刚又朋友谈到了分布缓存等内容,
那么就看看代理缓存,代理缓存基本是不需要我们的任何成本,只要我们设置了,并且代理那边可以缓存数据,就行了。
设置也非常的简单,把Cache-Control,设置为public就行了,private就只缓存在浏览器。

设置依然简单,但是用起来也是问题多多。

论坛徽章:
0
发表于 2012-05-17 10:36 |显示全部楼层
哟,依然使我回答,好吧,大家以后就把这个帖子作为缓存的一个参考资料吧,呵呵呵!

代理缓存的问题,主要出现在三个方面:
1.安全
2.地区问题
3.内容更新问题

首先,对于安全问题,这是最大的问题:因为代理会把根据URL,把整个页面的数据缓存起来,其中就包括了响应头,那么就包含了cookie信息。问题就在这里啦,如果用户A登录之后,代理缓存了页面的响应,那么用户B在此请求相同的页面的时候,那么整个响应就会给B了,这个时候,用户B就可以以A的身份进去瞎搞了。

对于这个问题,没有办法解决,但是有办法避免:把一些不需要用户登录就可以访问的页面,特别是那些静态的内容的页面,可以设置代理缓存;涉及到用户验证才能看的页面,不要设置了。

其次,就是地区问题,
因为代理缓存了整个页面,而且是根据URL来匹配的,如果咱们中国人去访问一个页面,例如www.agilesharp.com/blog/12344,这个时候,代理缓存就把这个中文的页面内容缓存,如果我们的站点是支持多语言的,那么,此时,如果美国人去访问了同一个URL,那么这个时候,或许,请求不会提交给我们的服务器,代理就会把中文的页面内容给老美,那叫一个郁闷,是吧。

怎么办?呵呵,方法虽然鲜为人知,但是依然简单。
设置头信息:Accept-Language

在发送中文响应的时候,设置为:Accept-Language: zh-cn,那么代理缓存就会缓存这个版本的内容
如果是请求的英文,那么,老美的浏览器发送的请求的这个Accept-Language的信息就是 en-US,代理一看这样版本的内容没有,那么就会把请求交给我们的服务器了。

最后的结果就是代理中缓存了同一个页面的不同版本的内容。

论坛徽章:
0
发表于 2012-05-17 10:40 |显示全部楼层
对于代理缓存,刚刚忘记说“3.内容更新问题“问题了。
这里补上。

内容更新问题:因为代理缓存了页面的所有数据,包括图片,js等等,那么即使我们的页面中的图片等更新了,但是客户端是无法知道的,除非缓存的之间过期了。这个问题,无法解决!
所以,要注意!!!!

论坛徽章:
0
发表于 2012-05-17 10:41 |显示全部楼层
本帖最后由 yanyangtian4502 于 2012-05-17 10:49 编辑

好了,现在终于开始走到服务端了。重头戏来了!
我休息一会,大家发言啊!!!!多吐干货!不玩虚的啊

论坛徽章:
0
发表于 2012-05-17 11:13 |显示全部楼层
不是一一个观点么  

提高site的性能 就是多Cache

论坛徽章:
0
发表于 2012-05-17 11:14 |显示全部楼层
回复 1# yanyangtian4502


    如果使用cache 那就要考虑cache的命中率 以及 交互式的web2.0的 实时数据

论坛徽章:
13
技术图书徽章
日期:2014-04-29 14:15:42IT运维版块每日发帖之星
日期:2015-12-12 06:20:00IT运维版块每日发帖之星
日期:2015-08-30 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-08-02 06:20:002015年亚洲杯之澳大利亚
日期:2015-04-03 15:03:12申猴
日期:2015-03-20 09:00:292015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15季节之章:冬
日期:2015-01-20 17:08:47双子座
日期:2014-11-21 16:30:31技术图书徽章
日期:2014-07-11 16:29:08
发表于 2012-05-17 11:46 |显示全部楼层
支持这样的活动!

论坛徽章:
0
发表于 2012-05-17 11:50 |显示全部楼层
回复 18# dengbao2001

多谢认可!!

   

论坛徽章:
0
发表于 2012-05-17 11:57 |显示全部楼层
本帖最后由 yanyangtian4502 于 2012-05-17 12:00 编辑

好了,现在到了服务器端了,首先看看内核缓存!
其实这个内核缓存就涉及到操作系统和宿主(IIS,Apache等)

说实在的,我对Windows操作系统和IIS比较了解,对其他的不清楚,但是我相信:原理和思想都是一样的!

我先以Windows和IIS为例子吧,说完之后,如果熟悉Liunx,Apache等其他平台的朋友,可以一并分享一下。

首先看一个图:
20120517115322.png

当一个请求被HTTP监听者(HTTP.sys)接受之后,它根据请求的URL进行匹配,然后马上就把请求放在一个内核模式的不同的队列中,以便这些请求可以被用户模式中的应用程序池中工作进程获取,然后处理。这里之所以要把请求放在队列中是为了快速的释放HTTP监听线程,从而使得HTTP.sys可以接受其他更多的请求。另外,请求被放在不同的队列,主要是根据请求的URL来分组的,并且应用程序池中也配置了处理何种URL。              

当响应产生之后,响应会被再次发送给HTTP.sys(大家可以看到图中第5个步骤),然后再把响应发送给客户端。HTTP.sys可以基于一些配置将响应进行缓存,我们会在后面进一步的讨论。
               

这里有一点非常中的就是:HTTP.sys将响应缓存在内核中,并且这个内核中的这个缓存空间是不分页的。
不分页就意味着HTTP.sys总是将响应的内容缓存物理的内存中,而且这一块内存不会被交换出去,就是说不会被分页到磁盘上面。这涉及到了Windows操作系统的内存管理机制,大家自学去吧,呵呵。

当请求的响应被缓存在了内核模式之后,下次再次请求的时候,可以直接的读取缓存,而后续的步骤全部跳过,这会极大的提升性能。


另外,有一点我这里要提到的就是一个传说“很多人常常说要使用静态,或者伪静态”。 我常常也在面试中问别人:为什么要这么搞?
很多人就是支支吾吾,瞎扯一通,最让我崩溃的回答就是“网上说的”。

大家想知道答案吗?
呵呵 我稍后回复

我提示一点:这一内核缓存相关
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP