缓存算法

来源:互联网 发布:淘宝神笔有什么用 编辑:程序博客网 时间:2024/05/21 09:39

缓存就是临时存储数据(通常是使用频繁的数据)的地方,以避免额外的开销较大的计算,并且使得获取结果的速度更快。


缓存相关的术语:

  • 命中(如果在缓存中,一个条目通过get被找到了,我们就称之为缓存命中)
  • 缓存Miss
  • 存储成本(数据放入缓存所需要的时间和空间)
  • 索引成本
  • 失效(当存在缓存中的数据需要更新时,就意味着该数据失效了)
  • 缓存算法(当缓存未命中时,且缓存容量已满,就需要从缓存中置换出一个旧的条目,添加一条新的条目)


常见的缓存算法

  • Least FrequentlyUsed(LFU,通过为每个被缓存的数据元素计算它们被使用的频率,然后把最不常用的元素置换出去
  • Least Recently User(LRU,把最近最少使用的缓存数据元素置换出去,实现中会把最新访问的元素放在缓存池的顶部,当缓存容量到达limit时,就从缓存池顶部开始将元素置换出去
  • Least Recently User 2(LRU2,又称最近最少使用twice。把两次被访问过的元素放入缓存池中,当缓存池满了,再把有两次最少使用的缓存元素置换出去。因为需要跟踪元素2次,访问负载就会随着缓存池的增加而增加,这样当在大容量的缓存池中,就会产生问题。此外还需要跟踪那些不在缓存中的元素,因为它们还没有被第二次读取。其是adoptive to access
  • Two Queues(2Q,把被访问的数据元素放到LRU的缓存中,如果这个元素再次被访问,就把它转移到第二个、更大的LRU缓存中,置换出缓存元素是为了保持第一个缓存池是第二个缓存池的1/3,缓存的访问负载是固定的时候,把LRU换成 LRU2,就比增加缓存的容量更好,其是 adoptive to access
  • Adaptive Replacement Cache(ARC,是由2个LRU组成,第一个L1包含的是最近只被使用过一次的元素,第二个L2包含的是最近被使用过两次的元素,因此L1放的是新对象,而L2放的是常用对象。所以其被认为是介于LRU和LFU之间的。被认为是性能最好的缓存算法之一,能够自调,并且是低负载的,同时也保存着历史对象,这样就可以记住那些被移除的对象,记忆力很差
  • Most Recently Used(MRU,和LRU相对应。会移除最近最多被使用的对象——当请求访问的时候,因为有些事情是无法预测的,并且在缓存系统中找出最少最近使用的元素是一项时间复杂度非常高的运算,此时就可以考虑使用MRU。在数据库内存缓存中比较常见
  • First in First out(FIFO,是先进先出,我是一个低负载的算法,并且对缓存对象的管理要求不高。我通过一个队列去跟踪所有的缓存对象,最近最常用的缓存对象放在后面,而更早的缓存对象放在前面,当缓存容量满时,排在前面的缓存对象会被踢走,然后把新的缓存对象加进去。我很快,但是我并不适用
  • Second Chance(基于FIFO,并改善了FIFO的成本。和FIFO一样也是观察队列的前端,但是和FIFO的立刻置换不同,会检查即将要被置换出去的元素有没有之前被使用过——通过一个bit标识来表示,没有被使用过的元素就把它置换出去,否则将该标志位清除,然后再把这个缓存元素当做新增缓存元素加入队列——可以想象这就是一个环形队列。当再次在队头碰到该元素时,由于它已经没有标志位了,所以可以立即将它置换出去,其速度比FIFO快
  • CLock比second chance更好,因为它不会像second chance那样把有标志的缓存元素放到队列的尾部,同时也可以达到second chance的效果。CLock持有一个装有缓存元素的环形列表,头指针指向列表中最老的缓存元素,当缓存miss发生并且没有新的缓存空间时,会查看指针指向的缓存元素的标志位以决定如何去做:如果标志位是0,直接用新的缓存元素替代这个缓存元素;  如果标志位是1,则把头指针递增,然后重复这个过程,直到新的缓存元素能够被放入
  • Simple time-based通过绝对的时间周期去失效那些缓存元素,对于新增元素会保存特定的时间。不太适用
  • Extended time-based expiration通过相对时间去失效缓存对象的,对于新增元素会保存特定的时间,比如是每5分钟,每天的12点等
  • Sliding time-based expiration与前面不同的是,缓存元素的生命周期是从这个缓存的最后被访问时间开始算起,不太适用

Random Cache:随机缓存,随意的替换缓存实体。通过这些行为,可以随意的去处理缓存实体。比FIFO机制更好,在某些情况下,甚至比LRU好,但是通常LRU更好


0 0