`
ahuaxuan
  • 浏览: 633397 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论
阅读更多
/**
* 作者:ahuaxuan
* 日期:2009-03-08
*/

看一粒沙中的世界, 一朵野花中的天堂。 把无限握于掌中, 把永恒握于瞬间。——威廉• 布莱克

开始讨论缓存之前,让我们先来讨论讨论另外一个问题:理论和实践.从ahuaxuan接触的程序员来看,有的程序员偏实践,有的程序员偏理论,但是这都是不好的行为,理论和实践同样重要,我们在做很多核心的算法的时候,没有理论根本无从下手,而在我们多年的实践中,不总结理论就不能加深自己的理解.所以理论和实践同等重要.

缓存是当今各种软件或者硬件系统中不可缺少的技术之一,所以对每个程序员来说都显得异常重要,对ahuaxuan来说亦是如此.如果说用dfa实现文字过滤是从理论到实践,那么本文便是从实践中总结出得理论.

在讨论缓存功能之前,我们首先来了解一下缓存这个东西本身.ahuaxuan根据自己的经验把缓存问题细分为4类小问题.

1缓存为什么要存在?
2缓存可以存在于什么地方?
3缓存有哪些属性?
4缓存介质?

搞清楚这4个问题,那么我们就可以随意的通过应用的场景来判断使用何种缓存了.

下面ahuaxuan和大家一一分析这4个问题.
1. 缓存为什么要存在?
一般情况下,一个网站,或者一个应用,它的一般形式是,浏览器请求应用服务器,应用服务器做一堆计算后再请求数据库,数据库收到请求后再作一堆计算后把数据返回给应用服务器,应用服务器再作一堆计算后把数据返回给浏览器.这个是一个标准流程.但是随着互连网的普及,上网的人越来越多,网上的信息量也越来越多,在这两个越来越多的情况下,我们的应用需要支撑的并发量就越来越多.然后我们的应用服务器和数据库服务器所做的计算也越来越多,但是往往我们的应用服务器资源是有限的,数据库每秒中接受请求的次数也是有限的(谁叫俺们的硬盘转速有限呢).如果利用有限的资源来提供尽可能大的吞吐量呢,一个办法:减少计算量,缩短请求流程(减少网络io或者硬盘io),这时候缓存就可以大展手脚了.缓存的基本原理就是打破上图中所描绘的标准流程,在这个标准流程中,任何一个环节都可以被切断.请求可以从缓存里取到数据直接返回.这样不但节省了时间,提高了响应速度,而且也节省了硬件资源.可以让我们有限的硬件资源来服务更多的用户.

2  缓存可以存在于什么地方?

浏览器---浏览器和app之间---分过层的app-数据库


在上图中,我们可以看到一次请求的一般流程,下面我们重新绘制这张图,让我们的结构稍微复杂一点点.
(将app分层)
浏览器---浏览器和app之间---分过层的app-数据库


理论上来将,请求的任何一个环节都是缓存可以作用的地方.第一个环节,浏览器,如果数据存在浏览器上,那么对用户来说速度是最快的,因为这个时候根本无需网络请求.第二个环节,浏览器和app之间,如果缓存加在这个地方,那么缓存对app来说是透明的.而且这个缓存中存放的是完整的页面.第三个节点,app中本身就有几个层次,那么缓存也可以放在不同的层次上,这一部分是情况或者场景比较复杂的部分.选择缓存时需要谨慎.第四个环节,数据库中也可以有缓存,比如说mysql的querycache.

那么也就是说在整个请求流程的任何一点,我们都可以加缓存.但是是所有的数据都可以放进缓存的吗.当然不是,需要放进缓存的数据总是有一些特征的,要清楚的判断数据是否可以被缓存,可以被怎样缓存就必须要从数据的变化特征下手.

数据有哪些变化特征?最简单的就是两种,变和不变.我们都知道,不会变化的数据不需要每次都进行计算.问题是难道所有的数据理论上来讲都会变化,变化是世界永恒的主题.也就是说我们把数据分为变和不变两种是不对的,那么就让我们再加一个条件:时间.那么我们就可以把数据特征总结为一段时间内变或者不变.那么根据这个数据特征,我们就可以在合适的位置和合适的缓存类型中缓存该数据.

3缓存有哪些属性
从面向对象的角度来看,缓存就是一个对象,那么是对象,必然有属性.那么下面我们来探讨一下缓存有哪些属性.以下列举我们常用到的3个属性.
(1) 命中率
命中率是指请求缓存次数和缓存返回正确结果次数的比例.比例越高,就证明缓存的使用率越高.

命中率问题是缓存中的一个非常重要的问题,我们都希望自己缓存的命中率能达到100%,但是往往事与愿违,而且缓存命中率是衡量缓存有效性的重要指标.

(2) 最大元素
缓存中可以存放得最大元素得数量,一旦缓存中元素数量超过这个值,那么将会起用缓存清空策略,根据不同的场景合理的设置最大元素值往往可以一定程度上提高缓存的命中率.从而更有效的时候缓存.

(3) 清空策略

1 FIFO ,first in first out ,最先进入缓存得数据在缓存空间不够情况下(超出最大元素限制时)会被首先清理出去
2 LFU , Less Frequently Used ,一直以来最少被使用的元素会被被清理掉。这就要求缓存的元素有一个hit 属性,在缓存空间不够得情况下,hit 值最小的将会被清出缓存。
2 LRU ,Least Recently Used ,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。

4缓存介质
从硬件介质上来将无非就是两种,内存和硬盘(对应应用层的程序来讲不用考虑寄存器等问题).但是往往我们不会从硬件上来划分,一般的划分方法是从技术上划分,可以分成几种,内存,硬盘文件.数据库.
(1) 内存.将缓存放在内存中是最快的选择,任何程序直接操作内存都比操作硬盘要快的多,但是如果你的数据要考虑到break down的问题,因为放在内存中的数据我们称之为没有持久话的数据,如果硬盘上没有备份,机器down机之后,很难或者无法恢复.

(2) 硬盘.一般来说,很多缓存框架会结合使用内存和硬盘,比如给内存分配的空间有满了之后,会让用户选择把需要退出内存空间的数据持久化到硬盘.当然也选择直接把数据放一份到硬盘(内存中一份,硬盘中一份,down机也不怕).也有其他的缓存是直接把数据放到硬盘上.


(3) 数据库.说到数据库,可能有的人会想,之前不是讲到要减少数据库查询的次数,减少数据库计算的压力吗,现在怎么又用数据库作为缓存的介质了呢.这是因为数据库又很多种类型,比如berkleydb,这种db不支持sql语句,没有sql引擎,只是key和value的存储结构,所以速度非常的快,在当代一般的pc上,每秒中十几w次查询都是没有问题的(当然这个是根据业务特征来决定的,如果您访问的数据在分布上是均匀的,那ahuaxuan可不能保证这个速度了).

除了缓存介质之外,ahuaxuan根据缓存和应用的耦合程度将其划分为local cache和remote cache.
Local cache是指包含在应用之中的缓存组件.而remote cache指和应用解耦在应用之外的缓存组件.典型的local cache有ehcache,oscache,而remote cache有大名鼎鼎的memcached.

Localcache最大的优点是应用和cache的时候是在同一个进程内部,请求缓存非常快速,完全不需要网络开销等.所以单应用,不需要集群或者集群情况下cache node不需要相互通知的情况下使用local cache比较合适.这也是java中ehcache和oscache这么流行的原因.
但是Local cache是有一定的缺点的,一般这种缓存框架(比如java中的ehcache或者oscache)都是local cache.也就是跟着应用程序走的,多个应用程序无法直接共享缓存,应用集群的情况下这个问题更加明显,当然也有的缓存组件提供了集群节点相互通知缓存更新的功能,但是由于这个是广播,或者是环路更新,在缓存更新频繁的情况下会导致网络io开销非常大,严重的时候会影响应用的正常运行.而且如果缓存中数据量较大得情况下使用localcache意味着每个应用都有一份这么大得缓存,着绝对是对内存的浪费.

所以这个情况下,往往我们会选择remote cache,比如memcached.这样集群或者分布式的情况下各个应用都可以共享memcached中的数据,这些应用都通过socket和基于tcp/ip协议上层的memcached协议直接连接到memcached,有一个app更新了memcached中的值,所有的应用都能拿到最新的值.虽然这个时候多了很多了网络上的开销,但是往往这种方案要比localcache广播或环路更新cache节点要普遍的多,而且性能也比后者高.由于数据只需要保存一份,所以也提高了内存的使用率.

通过以上分析可以看出,不管是local cache,还是remote cache在缓存领域都有自己的一席之地,所以ahuaxuan建议在选择或者使用缓存时一定要根据缓存的特征和我们的业务场景准确判断使用何种缓存.这样才能充分发挥缓存的功能.

Ahuaxuan认为,缓存的使用是架构师的必备技能,好的架构师能够根据数据的类型,业务的场景来准确的判断出使用何种类型的缓存,并且如何使用这种类型的缓存.在缓存的世界里也没有银弹,目前还没有一种缓存可以解决任何的业务场景或者数据类型,如果这种技术出现了,那架构师就又更不值钱了.呵呵.

本文是ahuaxuan从自己的实践中总结出来的一些小小的心得,未参考任何文章,,所以可能未必好,未必全面,未必令您满意,欢迎拍砖.

最后说一说写这篇文章的初衷,周末有人让我说说我对缓存的理解,我的回答的是对缓存的理解无法用一句话来表述,起码写5篇文章.那本文只是第一篇. 待续-------------

  • 大小: 10.1 KB
分享到:
评论
7 楼 ahuaxuan 2009-03-13  
gmizr 写道
很不错,期待后续

有个小错误
ahuaxuan 写道
(1) 内存.将缓存放在数据库中是最快的选择


非常谢谢,已改正.第二说见http://www.iteye.com/topic/348671
6 楼 gmizr 2009-03-13  
很不错,期待后续

有个小错误
ahuaxuan 写道
(1) 内存.将缓存放在数据库中是最快的选择
5 楼 lijie250 2009-03-13  
写的非常好,很系统,由浅入深,全面,接下来讲一些具体的应用场景和常用的技术!
4 楼 剑事 2009-03-12  
讲得很系统 精华
3 楼 xieye 2009-03-11  
不过大师要快点写,不能十天半月的吊人胃口,
出了人命怎么办?
2 楼 xieye 2009-03-11  
听大师说话
1 楼 wubin850219 2009-03-11  
很好很强大,以前只知道模仿别人用缓存,现在了解什么情况下要用缓存,用什么缓存了!对缓存有了一个大概的了解了!什么时候出第二呢?

相关推荐

    discuz 2.2Fsp1插件加强版

    基于2.2Fsp1所以补丁就不用说了<br> 希望各位朋友在使用过程中做好我们社区的友情链接,尊重别人劳动成功~谢谢<br> <br> 增加权限查看<br> 无用数据清理<br> 注册等10秒看许可协议时间修改为0<br> 子论坛显示新方式...

    论文研究-基于预测缓存的低功耗TLB快速访问机制.pdf

    采用该机制明显降低了TLB的缺失代价,当第一级TLB缺失时访问第二级TLB的平均访问延时接近1个时钟周期,约为原有平均访问延时的20%,增加的面积开销仅为原内存管理单元的181%左右,具有低成本、低功耗的特征。

    存储篇 1:浏览器缓存机制介绍与缓存策略剖析(1).md

    至少当我确定自己的研发方向、并接到第一个性能优化任务时,我做的第一件事是向搜索引擎求助,第二件事是买书,然后开始了摸着石头过河,前后花费了大量的时间和精力。我深感性能优化实在是前端知识树中特别的一环...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    第一章 绪论 1.1. 选题背景 这几年,许多新名词涌入我们的视野:博客、圈子、播客、WAP等。这些都预示着我们进入了一个新的互联网阶段web 2.0,它是相对web 1.0的新的一类互联网应用的总称,是一次从核心内容到外部...

    华西网源码

    第一个分区为 icon_1.png 第二个分区为 icon_2.png …… 第N个分区为 icon_N.png 4)头部配色修改(包括频道和对于的分区:PS:这个默认机制是分区实现的) 需要特别说明,这次的调整,头部配色的修改方法...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    第一章 绪论 1 1.1 研究背景与意义 1 1.2国内外相关研究现状 2 1.2.1 在线认证检测平台开发现状 2 1.2.2 HTML5 3 1.2.3 Android 3 1.2.4 Android移动Web项目开发的三种解决方案:Native, Web和Hybrid优缺陷分析 4 ...

    数据库设计准则及方法论.docx

    数据库设计准则及方法论全文共5页,当前为第1页。数据库设计准则及方法论全文共5页,当前为第1页。数据库物理设计的方法论 数据库设计准则及方法论全文共5页,当前为第1页。 数据库设计准则及方法论全文共5页,当前...

    论文研究-软件定义网络中利用IMKVS结合NFV的分布式网络负载均衡策略.pdf

    该策略包含两个阶段:第一阶段设计通用的SDN负载平衡器的模块,以运行不同的负载平衡算法;第二阶段是基于IMKVS的专业化缓存,可以实现通信管理和数据复制。仿真结果表明,相比于一致性哈希,缓存服务器上的负载可...

    彩蛋篇:CDN 的缓存与回源机制解析(1).md

    至少当我确定自己的研发方向、并接到第一个性能优化任务时,我做的第一件事是向搜索引擎求助,第二件事是买书,然后开始了摸着石头过河,前后花费了大量的时间和精力。我深感性能优化实在是前端知识树中特别的一环...

    Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版.rar

    23.10 再论缓存 417 23.11 新增模板系统 421 第24章 Web 2.0 423 24.1 Prototype 423 24.2 Script.aculo.us 438 24.3 RJS模板 451 24.4 结论 456 第25章 ActionMailer 457 25.1 发送邮件 457 25.2 接收邮件 465 25.3...

    velocity:人类的DNS缓存

    例如,以下程序将在第一个请求后开始使用缓存的DNS响应。 import requests import velocity for i in range ( 10 ): requests . get ( 'https://s0md3v.github.io' ) 重要:如果使用线程,请考虑手动缓存主机名,...

    基于SSM的个人博客系统设计软件程序源码+数据库+WORD毕业设计论文文档.zip

    第一章 绪论 1 第二章 相关技术介绍 2 2.1 B/S 简介 2 2.2 JAVA 简介 2 2.3 JSP 简介 3 2.4 springMVC简介 3 第三章 可行性分析 4 3.1 技术可行性分析 4 3.2 经济可行性分析 4 3.3 操作可行性 4 3.4 法律可行性 4 第...

    论文研究-基于博弈论的机会网络激励机制的研究.pdf

    但这个固定的管理中心在缺乏基础设施的机会网络中是很难实现的,所以提出一种新的基于博弈论的激励机制——GIS(game-based incentive strategy)。该机制主要利用三次讨价还价博弈让交易双方在缺乏第三方管理的情况...

    面向分布式GIS空问数据的Key-value缓存 (2013年)

    其中,Mere-cache为第一级缓存,并采用缓存回写机制以异步方式将数据写入F-cache进行持久化存储。F-cache使用大文件存储数据,并构建了基于B树的缓存索引以加快检索速度。数据写入F-cache的位置由基于B树的空闲空间...

    基于SpringCloud的绿植养护软件的设计与实现.docx

    第一章绪论 1.1研究背景 1.2研究现状 1.3论文创新点 1.4论文内容与结构 第二章系统需求分析 2.1系统业务需求 2.1.1用户模块 2.1.2设备模块 2.1. 3设备监测模块 2.1.4设备控制模块 2.2系统架构设计 第三章软件框架与...

    asp.net知识库

    Web标准和ASP.NET - 第一部分 XHTML介绍 在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把...

    《基于Python中PyQt5实现简易浏览器的设计与实现.docx》万字、已降重、毕业论文、本科

    第一章 前言 1.1 研究背景 1.2 研究目的与意义 1.3 研究内容与方法 1.4 论文结构 第二章 PyQt5与Python基础知识 2.1 PyQt5框架介绍 2.2 Python基础知识回顾 第三章 简易浏览器设计与界面实现 3.1 系统功能需求分析 ...

    一种新的输入缓存Clos 结构及其路由/调度算法 (2007年)

    针对MmM结构,提出了分布式路由及调度算法,利用中间级交换单元向第一级交换单元提供的反馈信息为分组选路,可以较好地在中间级均衡交换网络内部的负载,减小输出端口的冲突。仿真结果表明,采用分布式路由及调度...

    可伸缩服务架构:框架与中间件 第一部分

    可伸缩和可扩展,从应用层、数据库、缓存、消息队列、大数据查询系统、分布式定时任务调度系统、微服务等层面详细讲解如何设计可伸缩、可扩展的框架,并给出在各个领域解决特定问题的方法论和实践总结。 两部分都...

    面向新型互联网架构的移动性管理关键技术研究(博士学位论文-胡章丰)

    其次,针对标识映射解析问题,提出了一种基于多级指针式缓存的标识映射解析性能优化方法,按照区分类别的方式进行标识映射信息的缓存,克服了无缓存模式下标识映射解析性能低下的问题和直接缓存模式下由于终端发生...

Global site tag (gtag.js) - Google Analytics