缓存是当今各种软件或者硬件系统中不可缺少的技术之一,所以对每个程序员来说都显得异常重要。在讨论缓存功能之前,我们首先来了解一下缓存这个东西本身。可以把缓存问题细分为4类小问题。
① 缓存为什么要存在
② 缓存可以存在于什么地方
③ 缓存有哪些属性
④ 缓存介质
搞清楚这4个问题,那么就可以通过应用的场景来判断使用何种缓存了。
n 缓存的意义
1、 提高了响应速度,节省了硬件资源(例如:减少了 络IO和磁盘IO)
2、 服务更多的用户请求
总之,利用有限的资源尽可能使程序达到最大吞吐量。
n 缓存应用的地方
客户端到服务端要涉及的过程:浏览器——分过层的app——数据库。
第一个环节,浏览器:
若数据存在浏览器上,那么对用户来说速度是最快的,因为这个时候根本无需 络请求。
第二个环节,浏览器和app之间:
若缓存加在这个地方,那么缓存对app来说是透明的。而且这个缓存中存放的是完整的页面。
第三个节点,app中本身就有几个层次:
缓存可作用在不同的层次上,这是比较复杂的部分。需根据实际情况选择缓存方式或缓存框架。
第四个环节,数据库中也可以有缓存:
比如说mysql的querycache。
n 如何判断是否需要缓存
需要放进缓存的数据总是有一些特征的,是否被缓存和怎样缓存要从数据特征出发。
数据变化特征:在一段时间内,数据存在变和不变。
判断是否需要缓存依据:以数据变化特征为依据,在合适的位置、合适的缓存方式中缓存该数据。
缓存的术语
1) 命中率
命中率=缓存返回正确结果次数/请求缓存次数的比例。比例越高,就证明缓存的使用率越高。缓存命中率是衡量缓存有效性的重要指标。
2) 存储成本:
当没有命中时会从数据库取出数据,然后放入缓存。而把这个数据放入缓存所需要的时间和空间,就是存储成本。
3) 失效:
当存在缓存中的数据需要更新时,就意味着缓存中的这个数据失效了。
4) 替代策略:
当缓存没有命中时,并且缓存容量已经满了,就需要在缓存中踢出一个老的条目,加入一条新的条目,而到底应该踢出什么条目,就由替代策略决定。
5) 最大容量
缓存中可以存放得最大元素得数量,一旦缓存中元素数量超过这个值,那么将会起用缓存清空策略。
6) 清空策略
① FIFO:first in first out,最先进入缓存得数据在缓存空间不够情况下(超出最大元素限制时)会被首先清理出去。
② LFU:Less Frequently Used,一直以来最少被使用的元素会被被清理掉。这就要求缓存的元素有一个hit 属性,在缓存空间不够得情况下,hit 值最小的将会被清出缓存。
③ LRU:Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
缓存介质
一般划分方法是从技术上划分,可以分成几种:内存、硬盘文件、数据库。
u 内存
将缓存放在内存中是最快的选择,直接操作内存都比操作硬盘要快的多,但数据未被持久化。
u 硬盘
一般来说,很多缓存框架会结合使用内存和硬盘,当然也选择直接把数据放一份到硬盘(内存中一份,硬盘中一份,down机也不怕)。也有其他的缓存是直接把数据放到硬盘上。
u 数据库
数据库又很多种类型,比如berkleydb,这种db不支持sql语句,没有sql引擎,只是key和value的存储结构,所以速度非常的快,在当代一般的pc上,每秒中十几w次查询都是没有问题的。
缓存和应用的耦合程度划分
除了缓存介质之外,根据缓存和应用的耦合程度将其划分为local cache(本地)和remote cache(远程)。 Local cache是指包含在应用之中的缓存组件。而remote cache指和应用解耦在应用之外的缓存组件。典型的local cache有ehcache、oscache,而remote cache有大名鼎鼎的memcached。
u Local cache(本地缓存)优缺点
① 优点:
Local cache最大的优点是应用和cache的时候是在同一个进程内部,请求缓存非常快速,完全不需要 络开销等。所以单应用,不需要集群或者集群情况下cache node不需要相互通知的情况下使用local cache比较合适。这也是java中ehcache和oscache这么流行的原因。
② 缺点:
这种缓存框架(比如java中的ehcache或者oscache)都是local cache。也就是跟着应用程序走的,多个应用程序无法直接共享缓存,应用集群的情况下这个问题更加明显,当然也有的缓存组件提供了集群节点相互通知缓存更新的功能,但是由于这个是广播,或者是环路更新,在缓存更新频繁的情况下会导致 络io开销非常大,严重的时候会影响应用的正常运行。而且如果缓存中数据量较大得情况下使用localcache意味着每个应用都有一份这么大得缓存,着绝对是对内存的浪费。所以这个情况下,往往我们会选择remote cache,比如memcached。
u Remote cache(远程缓存)优缺点
这样集群或者分布式的情况下各个应用都可以共享memcached中的数据,这些应用都通过socket和基于tcp/ip协议上层的memcached协议直接连接到memcached,有一个app更新了memcached中的值,所有的应用都能拿到最新的值。虽然这个时候多了 络上的开销,但是往往这种方案要比localcache广播或环路更新cache节点要普遍的多,而且性能也比localcache高。由于数据只需要保存一份,所以也提高了内存的使用率。
u 小结
通过以上分析可以看出,不管是local cache,还是remote cache在缓存领域都有自己的一席之地,所以建议在选择或者使用缓存时一定要根据缓存的特征和我们的业务场景准确判断使用何种缓存。这样才能充分发挥缓存的功能。
总结
系统缓存是位于应用程序与物理数据源之间,用于临时存放复制数据的内存区域,目的是为了减少应用程序对物理数据源访问的次数,从而提高应用程序的运行性能. 缓存设想内存是有限的,缓存的时效性也是有限的,所以可以设定内存数量的大小,可以执行失效算法,可以在内存满了的时候,按照最少访问等算法将缓存直接移除或切换到硬盘上。
缓存的使用是架构师的必备技能,好的架构师能够根据数据的类型,业务的场景来准确的判断出使用何种类型的缓存,并且如何使用这种类型的缓存。在缓存的世界里也没有银弹,目前还没有一种缓存可以解决任何的业务场景或者数据类型,如果这种技术出现了,那架构师就又更不值钱了。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!