在合理应用缓存前,需要了解缓存领域里相关的几个常用术语:
1.1、 缓存命中:表示数据能够从缓存中获取,不需要回源
1.2、 Cache miss(缓存没有命中) :表示没有命中缓存,如果缓存内存中还有内存空间的话,会将数据加入到缓存中
1.3、 存储成本: 当没有命中缓存时,回源获取后会将数据放置到存储中,整个将数据放置到存储空间需要的时间以及空间称之为存储成本
1.4、 缓存失效: 当源数据发生变更后,意味着缓存中的数据失效
1.5、 缓存污染: 将不经常访问的数据放置到缓存存储空间中,以至于频繁访问的数据无法放置到缓存中
1.6、 替代策略: 当数据放置到缓存空间时,就需要从缓存空间中去除已有的数据,选择去除那些数据就是有替代策略决定的,常见替代策略如下:
-
Least-Recently-Used(LRU):替换掉最近被请求最少的对象,这种传统策略在实际中应用最广。在CPU缓存淘汰和虚拟内存系统中效果很好。然而在直接应用与代理缓存中效果欠佳,因为Web访问的时间局部性常常变化很大。 浏览器就一般使用了LRU作为缓存算法。新的对象会被放在缓存的顶部,当缓存达到了容量极限,底部的对象被去除,方法就是把最新被访问的缓存对象放到缓存池的顶部。
-
Least-Frequently-Used(LFU):替换掉访问次数最少的缓存,这一策略意图是保留最常用的、最流行的对象,替换掉很少使用的那些数据。然而,有的文档可能有很高的使用频率,但之后再也不会用到。传统的LFU策略没有提供任何移除这类文件的机制,因此会导致“缓存污染”,即一个先前流行的缓存对象会在缓存中驻留很长时间,这样,就阻碍了新进来可能会流行的对象对它的替代。
-
SIZE: 替换占用空间最大的对象,这一策略通过淘汰一个大对象而不是多个小对象来提高命中率。不过,可能有些进入缓存的小对象永远不会再被访问。SIZE策略没有提供淘汰这类对象的机制,也会导致“缓存污染”。
-
First in First Out(FIFO):FIFO通过一个队列去跟踪所有的缓存对象,最近最常用的缓存对象放在后面,而更早的缓存对象放在前面,当缓存容量满时,排在前面的缓存对象会被踢走,然后把新的缓存对象加进去。
由于存储空间有限,替代策略要解决的核心问题是尽量保留高频访问的缓存数据,降低缓存污染以提升缓存命中率和整体的缓存效率,难点在于需要基于数据历史访问情况,以一种合适的对未来访问情况的预估才能找到更佳的策略。

