• 缓存--大型网站架构不得不考虑的问题
  • Linda 发表于 2016/11/28 9:27:00 | 分类标签: 缓存设计 大型网站架构 删除缓存
  • 缓存的基本知识

    在整个计算机体系构造中(无论是硬件层面还是软件层面),缓存都是无处不在的。

    在计算机硬件构造中,由于两种介质的速度不匹配,高速介质在和低速介质交互时速度趋向低速方,这就导致了高速介质的资源闲置。而通过引入第三种介质(速度和成本介于两者中间),将低速方读写的部分内容数据保存在该介质中,高速方大多数情况下则无需和低速方直接交互,这样就能整体提升了交互的性能。这就是计算机体系中缓存的由来。比较典型的就是CPU缓存(CPU寄存器=>L1 cahce =>L2 cache =>内存=>硬盘)。

    在计算机系统和应用软件层面,缓存更是无处不在。我们在使用浏览器上网时,很多静态资源会被缓存到本地。我们在手机上采用微信聊天时,很多好友的头像等数据会被缓存到手机中。在操作系统层面,I/O操作也会被内核缓存(一般将数据缓存在文件系统的缓存页中),当然,这个可能相比前两个场景更加抽象,但缓存的目的都是一致的,为了提升读写性能。

    缓存在狭义上解决介质读写速度不匹配问题,广义上包括任何利用中间媒介提高速度的方法,包括:空间换时间,动态操作变为静态操作。 

    缓存(CACHE)和缓冲(BUFFER)

    缓存:可以共享,多种数据,大小不固定,可以重复使用,已知数据,用于提高IO效率。

    缓冲:不可以共享,单一数据,大小固定,读取后失效,命中100%,未知数据,用于减少IO次数。

    缓存的属性

    命中率:从缓存中返回正确数据的次数/总请求次数。

    容量:超过这个值启用一定的策略:转移到磁盘;转移到远端;清空部分。

    存储介质:内存、磁盘。

    成本:开发成本、部署成本、硬件成本。

    效率:SET效率、GET效率、序列化、哈希算法、分布式算法。

    缓存的限制

    由于价格的因素,缓存实现依赖的存储往往有大小限制——保存什么,舍弃什么,命中率。

    缓存往往是从无到有的——在最初阶段不能发挥作用,在不命中的时候性能颠簸。

    缓存的分类

    按照存储介质来分 :

    内存(网站进程内、同服务器独立进程、独立服务器、分布式服务器组)。

    磁盘(本地文件和数据库,独立服务器、分布式服务器组)。

    缓存可以使用磁盘而不仅仅是内存。

    按照存储的数据来分 :

    直接用于输出的整页(HTML、脚本样式、图片)。

    片段页(可供多个客户端使用的HTML、脚本样式等)。

    索引和聚合数据(空间换时间)。

    耗时查询的结果数据。

    和业务相关的大块数据(列表数据,引用数据)。

    和业务相关的小级数据(行级数据,资源数据)。

    和上下文(用户)相关的数据(活动数据)。

    按照实现方式来分 :

    框架或引擎内置的缓存(比如ORM缓存和SQL SERVER缓存)。

    安装特定的组件根据规则自动实现缓存(比如反向代理和输出缓存)。

    需要由开发以编程方式实现的缓存(比如业务数据缓存)。

    按照作用来分 :

    用于数据的读取(之后介绍的大部分内容都是基于此类缓存)

    用于(允许丢失)数据的写入——写到缓存的队列中,再由工作线程提交处理(写入存储)


    网站架构中的缓存

    浏览器缓存(HTTP缓存头)

    代理缓存(Squid Vanish CDN)

    Web服务器缓存(内核缓存、应用缓存)

    页面输出缓存(片段缓存、整页缓存)

    业务数据缓存(本地缓存,分布式缓存)

    其它缓存(ORM、数据库、搜索引擎等缓存)

     

    缓存的常见模式和策略(过期、更新、清除)

    缓存的常见模式:
    缓存的策略:

    缓存的更新策略

    A 由获取数据请求触发的被动更新

    B 由更新数据请求触发的主动更新(双写)

    C 使用独立线程主动定时更新缓存

    D 回调方式更新(过期或依赖)

    E 永远不更新?


    缓存的过期(失效)策略

    F 绝对的过期时间

    G 平滑过期(有人使用就不会过期)

    H 依赖方式(依赖数据库、依赖文件)

    I 永远不过期?

    缓存的清除(替换)策略:

    RAND 删除随机数据,不能反映局部性。

    SIZE 删除最大的数据。

    FIFO,First In First Out 删除最先进入缓存的数据,不能反映局部性。

    LFU,Least Frequently Used 删除一直以来最少被使用的数据。

    LRU,Least Recently Used 删除最近最少使用的数据。

    常见模式

    延迟加载方式:A+F

    预加载方式:B/C/E+I
  • 请您注意

    ·自觉遵守:爱国、守法、自律、真实、文明的原则

    ·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规

    ·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品

    ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任

    ·您在编程中国社区新闻评论发表的作品,本网站有权在网站内保留、转载、引用或者删除

    ·参与本评论即表明您已经阅读并接受上述条款

  • 感谢本文作者
  • 作者头像
  • 昵称:Linda
  • 加入时间:2013/7/2 0:00:00
  • TA的签名
  • 这家伙很懒,虾米都没写
  • +进入TA的空间
  • 以下内容也很赞哦
分享按钮