缓存是存储使用频繁数据的临时地方,从而加快系统响应速度。缓存在构建高性能web系统有着很重要的作用。如果要对一个系统进行优化,那么使用缓存是最快最有效的手段。
缓存术语
命中(Cache hit):当客户端发起一个请求(比如说一个产品的信息)时,我们会检测这个产品是否在缓存中,如果没有的话加入到缓存中,反之我们称之为命中了。
漏掉(Cache miss):很简单,虽然在缓存中存在,但是没有客户端请求。这里需要注意亮点
1、如果还有缓存空间,那么,没有命中的对象会被存储到缓存中
2、如果缓存满了,而有没有命中缓存,那么就会按照某一种策略把旧对象清除,进而把新的对象加入缓存中。
存储成本:把数据放入缓存所需的时间和空间,就是存储成本
索引成本:和存储成本类似,只不过是在查找缓存的时候
失效:当存在缓存中的数据需要更新时,就意味着这个书库失效了
替代策略:当缓存没有命中是,并且缓存容量已经满了,就需要在清除旧对象,进而加入新对象。而到底应该清除什么样的对象,就由替代策略决定。
最有替代策略:就是想把缓存中最没用的条目给踢出去,但是未来是不能够被预知的,所以这种策略是不可能实现的。但是有很多策略,都是朝着这个目前去努力。
缓存策略的分类
基于访问时间:此类算法按缓存项的被访问时间来组织缓存队列。如LRU
基于访问频率:此类算法按缓存项的被访问频率来组织缓存队列。如LFU,2Q
访问时间与频率兼顾:通过兼顾访问时间与频率,使得在数据访问模式变化是缓存策略任由较好的性能。此类算法具有一个可调或自适应的参数,通过该参数的调节使缓存策略在基于访问时间与频率间取得一定的平衡。
常用缓存算法简介
Least Frequently Used (LFU)
计算每个缓存对象被使用的频率,把不常用的缓存对象清除。
Least Recently User (LRU)
根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”
Least Recently Used k(LRU-k)
LRU-k中的k代表最近使用的次数,一次LRU可以认为是LRU-1,此次类推。LRU-k主要的目的是为了解决LRU算法“缓存污染”的问题。其核心思想是将“最近使用过1次的的判断作战为最近使用过k次”
Two queues(2Q)
2Q算法类似于LRU-2,不同点在于2Q将LRU-2算法中的访问历史队列改成一个FIFO缓存队列,即:2Q算法有两个缓存队列,一个是FIFO队列,一个是LRU队列。
Multi Queue(MQ)
MQ算法根据访问频率将数据划分为多个队列,不同的队列具有不同的访问优先级,其核心思想是:优先缓存访问次数多的数据。