转自:http://www.itivy.com/ivy/archive/2012/2/18/image-storage-cache-1.html

版权声明:非商业自由转载,保留原文内容完整性,并署名作者王国峰和原文链接

前言

在上一篇中,我强行拆散了WEB服务器和图片服务器这对恋人,这样做或许有点不太厚道,但对于他们未来各自的发展绝对有好处,不久的将来,他们会感谢我的。

好了,回到今天的话题,今天这篇文章主要来谈谈缓存技术在图片存储架构中的重要地位,并一起来探索一下实现图片缓存的方案。我个人的观点是:一个性能优良的、扩展性强的大型系统,势必要缓存一切可以缓存的资源,因为没有什么比在内存中操作更快的了(CPU不算,那里可存的空间太小了)。

PS:本文部分内容将有空空老师友情出演。

为什么要缓存图片

简单的说缓存可以通过直接访问内存来提高图片读取速度,缓解因站点高访问量而带来的图片I/O瓶颈。很多时候,图片是一类不经常更新的静态资源,是典型的读远大于写的情况,因此完全满足缓存的原则:一次写入,无数次读取。当然也不是所有满足这点的都会用到缓存,比如上次写的那篇优酷网架构学习笔记中就提到,优酷网在存储视频时并没有大量采用视频缓存技术,原因有二:

1、Squid 的 write() 用户进程空间有消耗,Lighttpd 1.5 的 AIO(异步I/O) 读取文件到用户内存导致效率也比较低下,这是内存锁造成的。
2、如接到老大哥通知要把某个视频撤下来,如果在缓存里是比较麻烦的(这个是亮点,O(∩_∩)O)

但总的来说,对于像图片、视频之类的静态文件,还是非常适合做缓存的。缓存永远是架构师的美丽小三,哈哈。

图片缓存方案探究

接下来就重点来探究一下实现图片缓存的具体方案,文章尽量按人的正常思维来步步深入,从简单到复杂,一起来看看吧,希望看完后能略微提升你的设计品味。时尚的设计是一个不断推敲和磨合的过程,这个相信各位程序猿和攻城狮都深有体会吧。关于这一块,我将分2篇文章来解说,这一篇先介绍如何在IIS等web容器中设置Http Headers来实现图片的缓存。

注意:这里的web容器是指IIS、Tomcat或者其他的WEB服务器软件,下面我以IIS来举例。

IIS中的缓存分为服务器缓存和客户端缓存,对于静态资源(html、css、js、图片等),服务器缓存是默认开启的,也就是我们在向服务器请求静态资源时,服务器是先从其内存中取文件的,取不到再去硬盘中找(真累啊!),有时候开启服务器缓存很让人讨厌,后面我们会提到。客户端缓存顾名思义是把待请求的资源缓存在客户端的,用户请求资源时先从本地找,找不到再去麻烦服务器。下面先具体谈谈客户端缓存。

1、客户端缓存

如何设置呢?请看下图


(图片来源)

上图表明开启IIS的缓存模块,并设置过期时间为1天,也就是1天之内,用户访问这张图片时均可以从其本地的缓存副本中读取,而不必来服务器下载,当然1天之后,缓存失效,图片下载后又重新会被载入浏览器缓存中。当然这种方式需要你有管理IIS的权限,我想作为架构师的你这点权限算个皮毛啊。

这个什么原理呀?别急,请听我娓娓道来,小伙子要耐心

这个主要是靠Http Headers来控制的,Http Headers是HTTP请求(Request)和响应(Response)的核心,它承载了关于客户端浏览器,请求页面,服务器等相关的信息。简单地说,它是浏览器和服务器之间交互的信息牌,浏览器通过它告知服务器客户端的相关信息和请求信息(比如我是什么类型的浏览器、我是否可以接收你服务器gzip过的内容、请求的长度是多少、是否允许缓存等等内容);服务器通过它告知浏览器服务器响应这次请求的相关信息(比如服务器变量、返回的长度、cookie等信息),具体Http Headers的内容可以参看这篇文章。

了解了Http Headers,那这个缓存问题就好解释了,我的解释如下:当我屁颠屁颠地带着这个Http Headers去向服务器请求空空老师的写真图片时,服务器提取出Http Headers发现其中的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

图片存储架构学习:缓存,架构师的美丽小三(一)相关推荐

  1. 亿级流量、高并发与高性能场景下的电商详情页架构_2(缓存架构中的Redis)

    亿级流量.高并发与高性能场景下的电商详情页架构_2(缓存架构中的Redis) 缓存架构一定要学好的Redis,缓存架构中的高可用,高并发,海量数据,备份,随时可恢复,缓存架构要支持这些,则redis一 ...

  2. 电商详情页缓存架构(零)

    真正能支撑高并发以及高可用的复杂系统中的缓存架构有哪些东西? 亿级流量电商网站的商品详情页系统,最核心的架构就是缓存架构.面对各种高并发场景下的各种难题,缓存架构是如何设计的,其中涉及到哪些技术和解决 ...

  3. 深入理解分布式系统中的缓存架构(下)

    转载自   深入理解分布式系统中的缓存架构(下) 承接上一篇<理解分布式系统中的缓存架构(上)>,介绍了大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景,本文主要介绍缓存架构设计 ...

  4. 高性能架构学习路线图-分布式架构演进

    目录 一.分布式架构学习路线图 二.计算机软件发展历史 三.技术架构演进史 架构演进一: 早期雏形 架构演进二: 数据库开发(LAMP特长) 架构演进三:  javaweb的雏形 架构演进四:  ja ...

  5. 架构师必备,了解分层架构中缓存那点事儿

    戳蓝字"CSDN云计算"关注我们哦! 作者:贺志兵 无论是CDN缓存加速,还是CPU的三级缓存,又或者是在如今互联网时代流量红利所带来的高并发结构客户端,而不得不使用缓存架构.缓存 ...

  6. javaweb k8s_K8S微服务核心架构学习指南 ASP.NET Core微服务基于K8S 架构师必备Kubernetes教程...

    K8S微服务核心架构学习指南 ASP.NET Core微服务基于K8S 架构师必备Kubernetes教程 课程内容是关于Kubernetes微服务架构学习课程,基于K8S开展ASP.NET核心进行微 ...

  7. 不想当将军的士兵不是好士兵,努力学习成为架构师吧

    不想当将军的士兵不是好士兵,努力学习成为架构师吧 一.什么是架构? 1.1 什么是架构? 1.2 什么是生命周期 1.3 为什么会产生架构 1.4 什么是核心生命周期 1.5 什么是业务 1.5 什么 ...

  8. java架构之道-架构师应该学习哪些技能?

    既然想成为java架构师,首先你要是一个高级java攻城师,熟练使用各种框架,并知道它们实现的原理. jvm虚拟机原理.调优,懂得jvm能让你写出性能更好的代码: 池技术,什么对象池,连接池,线程池- ...

  9. 英特尔Nehalem微架构三级缓存原理学习

    英特尔Nehalem微架构包含式(Inclusive)三级缓存体系架构: 注释:包含式(inclusive)缓存指的是该缓存中包含低级缓存中的内容.包含式三级缓存即在三级缓存中有着二级缓存数据的副本. ...

最新文章

  1. Latex(一)公式自动编号与自动引用
  2. 第三章 系统指令与汇编程序设计 3.1 单片机指令系统
  3. Linux之Json20160705
  4. 巧用gmail转发邮件
  5. SQL:pgsql中查询一段时间内数据及相关时间操作
  6. 深入思考内积运算,再看傅里叶系数、伽辽金法本质
  7. 聊聊六位半万用表电路(一)——保护
  8. Ubuntu 18.04安装c++版OpenCV4
  9. QT如何给exe添加图标
  10. 机器人布里茨哪个皮肤好看_【图片】【全皮肤鉴赏系列】蒸汽机器人 布里茨【lol半价吧】_百度贴吧...
  11. ddr老化测试_老化测试标准
  12. (附源码)springboot猪场管理系统 毕业设计 160901
  13. Unity粒子系统基本
  14. WDK学习笔记_区块链项目实现_MAE
  15. MVC实现类似QQ的网页聊天功能-ajax(下)
  16. 最优化理论笔记及期末复习(《数值最优化》——高立)
  17. Sql 修改表结构的操作
  18. 怎么直接压缩图片?好用的图片压缩工具推荐
  19. 移动魔百和系统升级服务器地址,中国移动魔百盒网络连接图文教程
  20. C语言查找奥运五环色的位置

热门文章

  1. 大话“高可用”-Part1∶什么是高可用?(原创,转载请标明出处)
  2. LLMs模型速览(GPTs、LaMDA、GLM/ChatGLM、PaLM/Flan-PaLM、BLOOM、LLaMA、Alpaca)
  3. ETL使用Kettle处理银行信用卡申请项目
  4. 广西首家!云计算企业梯度科技通过可信云认证
  5. 【附源码】Java计算机毕业设计游戏账号交易平台(程序+LW+部署)
  6. 利用matlab实现一维搜索算法
  7. 二手回收战事:转转集团手机日收货量突破1.5万单
  8. 计算机性别计算公式,阮一峰的网络日志
  9. android 11.0 设置wifi白名单
  10. 向 Elastic Beanstalk 环境中添加数据库