1. 客户端缓存
2. 网络中缓存
3. 服务端缓存
3.1 数据库缓存
3.2 平台级缓存
3.3 应用级缓存
3.3.1缓存算法
缓存算法的几个专业术语
- 缓存命中 :客户发起一个请求时,系统收到这个请求,如果该请求的数据在缓存中,这一数据就会被使用,这一行为叫做缓存命中
- 没有命中 : 没有命中,如果此时缓存还有存储空间,那么没有命中的对象会被存储到缓存中
- 存储成本 : 当缓存没有命中时,系统会从数据库或其他数据源取出数据,然后放入缓存,把这个数据放入缓存所需要的的时间和空间,就是存储成本。
- 缓存失效 : 当存储在缓存中的数据需要更新时,就意味着缓存中的这一数据失效了
- 替代策略 : 当缓存没有命中时,并且缓存容量已经满了,就需要在缓存中去除一条旧数据,然后放入该新数据,至于去除哪条数据就由替代策略决定
替代策略的具体实现就是缓存算法,以下是主流的缓存算法
-
Least-Recently-Used(LRU)
替换掉最近被请求最少的对象,这种传统策略在实际中应用最广。在CPU缓存淘汰和虚拟内存系统中效果很好。然而直接应用与代理缓存中效果欠佳。因为Web访问的时间局部性常常变化很大。浏览器一般是用了LRU作为缓存算法,新的对象会被放在缓存的顶部,当缓存达到了容量极限,底部的对象被去除,方法就是把最新被访问的缓存对象放到缓存池的顶部。 -
Least-Frequently-Used(LFU)
替换掉访问次数最少的缓存,这一策略的意图是保留最常用的、最流行的对象,替换掉很少使用的那些数据。然而,有的数据可能有很高的使用频率,但是之后再也不会用到,传统的LFU策略并没有提供任何一处这类文件的机制,因此会导致缓存污染,阻碍了新进来的可能会流行的对象对它的替代 -
Least Recently Used(LRU2)
LRU的变种,把被两次访问过的对象放入缓存,当缓存池满了后,会把有两次最少使用的缓存对象去除,因为需要跟踪对象两次,访问负载就会随着缓存池的增加而增加 -
Two Queues(2Q)
Two Queues是LRU的另一个变种,把被访问的数据放到LRU的缓存中,如果这个对象再一次被访问,就把他转移到第二个、更大的LRU缓存,使用了多级缓存的方式。去除缓存对象是为了保持第一个缓存池是第二个缓存池的1/3.当缓存的访问负载是固定的时候,把LRU换成LRU2,就比增加缓存的容量更好 -
SIZE
替换占用空间最大的对象,这一策略通过淘汰一个大对象而不是多个小对象来提高命中率。不过可能进入缓存的小对象永远不会再被访问。SIZE策略没有提供淘汰这类对象的机制,会导致缓存污染 -
LRU - Threshold
不缓存超过某一size的对象,其他与LRU相同 -
Log(Size) + LRU
替换size最大的对象,当size相同时,按LRU进行替换 -
Hyper-G
LFU的改进版,同时考虑上次访问时间和对象size -
Pitkow/Recker
替换最近最少使用的对象,除非所有对象都是今天访问过的。如果是这样,则替换掉最大的对象。这一策略试图符合每日访问Web网页的特定模式。这一策略也被建议在每天结束时运行,以释放被“旧的”、最近最少使用的对象占用空间 -
Lowest-Latency-First
替换下载时间最少的文档,显然他的目标是最小化平均延迟 -
Hybrid Hybrid
有一个目标是减少平均延迟。对缓存中的每个文档都会计算一个保留效用,保留效用最低的对象会被替换掉,位于服务器 s 的文档 f 效用函数定义如下:
Cs是与服务器 s 的连接时间,bs是服务器 s 的带宽;frr代表 f 的使用频率;sizef是文档 f 的大小,单位字节。K1 和 K2 是常量,Cs 和 bs 是根据最近从服务器s获取文档的时间进行估计的
-
Lowest Relative Value (LRV)
LRV是基于计算缓存中文档的保留效用,然后替换保留效用最低的文档 -
Adaptive Replacement Cache
ARC介于 LRU 和 LFU之间,为了调高效果,由两个LRU组成,第一个包含的条目是最近只被使用过一次的,而第二个LRU包含的是最近被使用过两次的条目,因此,得到了新的对象和常用的对象,ARC可以自我调节,并且是低负载的 -
Most Rencently Used(MRU)
MRU 和 LRU 是相对的,移除最近最多被使用的对象。当一次访问过来的时候,有些事情是无法预测的,并且在缓存系统中找出最少最近使用的对象是一项时间复杂度非常高的运算,这时会考虑MRU,在数据库内存缓存中比较常见 -
First in First out(FIFO)
FIFO通过一个队列去跟踪所有的缓存对象,最近最常用的缓存对象放在后面,而更早的缓存对象放在前面,当容量满的时候,前面的缓存对象会被踢走,然后把新的缓存对象加进去 -
Random Cache
随机缓存就是随意的替换缓存数据,比FIFO机制好,在某些情况下,甚至比LRU好,但是通常还是LRU好