前言上一篇强行拆解了WEB服务器和图片服务器这对夫妻。这未必是善意,但对各自未来的发展却是有好处的。绝对好,他们会在不久的将来感谢我。好了回到今天的话题,今天的文章主要讲一下缓存技术在图片存储架构中的重要地位,一起探讨实现图片缓存的解决方案。我个人的观点是:一个性能优良、可扩展性强的大型系统,必然会缓存所有可以缓存的资源,因为没有什么比在内存中运行更快了(CPU不算,存储空间太大了那里)小)。PS:本文部分内容由空空老师友情播放。为什么要缓存图片简单来说,缓存可以通过直接访问内存来提高图片读取速度,缓解网站高流量带来的图片I/O瓶颈。在很多情况下,图像是一种不经常更新的静态资源。是典型的读远大于写的情况,所以完全符合缓存的原则:一次写入,无数次读取。当然,并不是所有满足这一点的都会使用缓存。比如上次写的优酷架构学习笔记中提到优酷在存储视频的时候并没有大量使用视频缓存技术。原因有二:squid的write()占用用户进程空间,Lighttpd1.5的AIO(异步I/O)读取文件到用户内存导致效率低下,这是内存锁造成的。如果收到大哥通知下架某个视频,如果在缓存里就比较麻烦了(这个是亮点,O(∩_∩)O)但是一般来说,对于图片之类的静态图片而视频文件还是很适合做缓存的。缓存永远是架构师的漂亮情妇,哈哈。探索图片缓存方案接下来,我们将着重探索实现图片缓存的具体方案。文章力图循着人的正常思维,一步步从简单到复杂,一起来看看吧。希望大家看完后,能够稍微提高自己的见识。设计有品位。时髦的设计是一个不断推敲和适应的过程,相信所有的程序员和攻城狮都深有体会。关于这部分,我会在两篇文章中进行说明。本文首先介绍如何在IIS等Web容器中设置HttpHeaders,实现图片缓存。注意:这里的web容器是指IIS、Tomcat或其他WEB服务器软件。下面我将以IIS为例。IIS中的缓存分为服务器缓存和客户端缓存。对于静态资源(html、css、js、图片等),默认开启服务器缓存,即当我们向服务器请求静态资源时,服务器首先使用其内存中取不到文件,然后去硬盘里找他们(真累!)。有时候开启服务器缓存很烦人,这个我们后面会提到。顾名思义,客户端缓存就是缓存客户端要请求的资源。用户请求资源时,首先在本地搜索,如果找不到,再去服务器端查找。让我们详细谈谈客户端缓存。1、如何设置客户端缓存?请看下图(图片来源)上图是开启了IIS的缓存模块,设置过期时间为1天,即1天内,当用户访问这张图片时,可以读取从其本地缓存副本。而不是去服务器下载,当然1天后缓存就失效了,图片下载后会重新加载到浏览器缓存中。当然,这种方法需要你有管理IIS的权限。我认为您作为建筑师的权威是肤浅的。这是什么原理?别担心,请听我说。耐心点,孩子。这个主要是由HttpHeaders控制的。HttpHeaders是HTTP请求(Request)和响应(Response)的核心。页面、服务器等信息。简单来说就是一个浏览器与服务器交互的信息板,浏览器通过它通知服务器相关信息和客户端的请求信息(比如我用的是什么类型的浏览器)am,能不能收到你们服务器的gzip压缩后的内容,请求的长度,是否允许缓存等);服务器将服务器响应本次请求的相关信息(如服务器变量、返回长度、cookie等)告知浏览器,HttpHeaders的具体内容可参见本文。理解了HttpHeaders,缓存问题就很好解释了。我的解释是这样的:当我拿着这个HttpHeaders去服务器请求空空老师的照片时,服务器提取了HttpHeaders,发现Cache-Control是public的,也就是可以缓存,然后服务器查看自己设置的缓存过期时间,发现还没有过期,那小子,你先找你本地空空老师的图片,找不到再过来问我.于是回去找,发现在我的本地真的有空空先生的照片。他没有骗我,好开心。不知道我这样解释空空迷们,你们看懂了吗?不管你懂不懂,反正我懂!当然,如果有不对的地方,请指出,谢谢。2、服务器缓存正如我上面所说,IIS中的服务器缓存是默认启用的。IIS默认会缓存静态资源,以便快速读取。当静态文件发生变化时,缓存也可以自动更新。但是有一个非常恼人的问题。如果我有大量的图片(几百万、几千万),而且都是实时更新的(比如股市行情图),就会出现这个问题。一次更新那么多图片,IIS缓存还没来得及更新(数量太TM了),所以我要访问半天的图片都是旧版本,这让我这个炒股的很苦恼。那么既然违背了缓存的原则,那我们该如何禁用呢?方法绝对没有你想的那么简单。建议你看这篇文章,就是直接修改MetaBase.xml文件。如果不熟悉服务器,是不敢随便碰这个文件的。有点小儿科,哈哈哈。通过上面的解释,我觉得聪明的你应该用最简单的方法来设置缓存。如果你真的很笨,不懂,那请用左手打右手两下。你还是不明白。然后用右手打左手两下,我就这么打到我明白了,哈哈哈。好了,以上就是关于在IIS中设置缓存的方法。空空先生这里引用了好几遍,看累了,谢谢。原文链接:http://www.itivy.com/ivy/archive/2012/2/18/image-storage-cache-1.html
