缓存算法

缓存目的

       a缓解网络因素瓶颈

       b降低原始服务(比如数据库)请求量

       c减小请求时延(加快响应时间)

缓存基本处理步骤

       1 接受网络请求

       2 解析请求

       3 查询本地是否有副本可用,

              如果没有,到数据库获取一份副本,保存到本地

       4检查副本实效性

              如果失效, ,到数据库获取一份副本,保存到本地

       5 发送请求回应

传统缓存算法

Least FrequentlyUsed(LFU)

       LFU算法是计算每个缓存对象计算他们被使用的频率,把最不常用的缓存对象删除

Least RecentlyUser(LRU)

       LRU算法是找到最近最少使用的缓存对象,然后删除该对象. 新的对象会被放在缓存的顶部,当缓存达到了容量极限,把底部的对象踢走,把最新被访问的缓存对象,放到缓存池的顶部。

Least RecentlyUsed 2(LRU2)

       LRU2算法是把被两次访问过的对象放入缓存池,当缓存池满了之后,把有两次最少使用的缓存对象踢走。因为需要跟踪对象2次,访问负载就会随着缓存池的增加而增加。所以这种算法不适合用在大容量的缓存池中.

Two Queues(2Q)

       2Q算法是把被访问的数据放到LRU的缓存中,如果这个对象再一次被访问,就把他转移到第二个、更大的LRU缓存。转移缓存对象是为了保持第一个缓存池是 第二个缓存池的1/3。当缓存的访问负载是固定的时候,把 LRU 换成 LRU2,就比增加缓存的容量更好。这种机制比 LRU2更好.

AdaptiveReplacement Cache(ARC)

  ARC算法是由2个 LRU 组成,第一个是 L1,包含的条目是最近只被使用过一次的,第二个 LRU是 L2,包含的是最近被使用过两次的条目。L1 放的是新的对象,L2 放的是常用的对象。是性能最好的缓存算法之一,能够自调,并且是低负载的。另外,还保存着历史对象,可以记住那些被移除的对象,同时,可以知道被移除的对 象是否可以留下.

Most Recently Used(MRU)

  MRU算法是移除最近最多被使用的对象,当一次访问过来的时候,有些事情是无法预测的,并 且在缓存系统中找出最少最近使用的对象是一项时间复杂度非常高的运算,这种算法是数据库内存缓存中是最的常见的算法. 每当一次缓存记录的使用,把它放到栈的顶端。当栈满了的时候,把栈顶的对象给换成新进来的对象

First in First out(FIFO)

       FIFO算法是一个低负载的算法,并且对缓存对象的管理要求不高。通过一个队列去跟踪所有的缓存对象,最近最常用的缓存对象放在后面,而更早的缓存对象放在前面,当缓存容量满时,排在前面的缓存对象会被踢走,然后把新的缓存对象加进去。

Second Chance

       Second Chance算法是通过FIFO修改而来的,比FIFO好的地方是改善了FIFO的成本.会检查即将要被踢出的对象有没有之前被使用过的标志(1一个 bit表示),没有被使用过把他踢出;否则,把这个标志位清除,然后把这个缓存对象当做新增缓存对象加入队列.可以想象就这就像一个环队列.当再一次在队 头碰到这个对象时,由于已经没有这个标志位了,所以立刻就把对象踢开了.在速度上比FIFO快.

CLock

  Clock算法是持有一个装有缓存对象的环形列表,头指针指向列表中最老的缓存对象。当缓 存miss发生并且没有新的缓存空间时,通过查找指针指向的缓存对象的标志位去决定应该怎么做。如果标志是0,直接用新的缓存对象替代这个缓存对象;如果 标志位是1,把头指针递增,然后重复这个过程,直到新的缓存对象能够被放入.

Simple time-based

       simple time-based算法是通过绝对的时间周期去失效那些缓存对象.

Extendedtime-based expiration

  extendedtime-based expiration算法是通过相对时间去释放缓存对象的;对于新增的缓存对象,会保存一个特定的时间,比如是每5分钟,每天的12点.

Sliding time-basedexpiration

  slidingtime-based expiration是被管理缓存对象的生命起点是在这个缓存的最后被访问时间算起的.超过特定时间释放缓存对象.

HTTP新鲜度缓存算法

       http协议有Cache-Control字段来指定请求和响应遵循的缓存机制.如果需要确定响应是保鲜的(fresh)还是陈旧的(stale),只需要将其保鲜寿命(freshness lifetime)和年龄(age)进行比较.

       用公式表示:

              response_is_fresh= (server_freshness_limit() > current_age)

保鲜寿命计算方法

       说明:

       max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。

       实例:

              max-age=8表示最大生存期8秒,超过8秒浏览器必须去服务器重新读取,这个时间是以用户的读取页面开始计时的,

       Expires是绝对时间, 缓存过期的绝对时间,如果过了它指定的那个时间点,客户机就不获取缓存,直接去服务器重新请求一份最新的.

       Last-Modified是文档的最后修改时间.如果是静态文件,客户端会发上来它缓存里的时间,服务器用来会来比对,如果发现没有修改就直接返回一个头,状态码是304,字节数非常少,(高级版本还会增加比较Etag来确定文件是否变化).

  实际算法伪代码:

freshness_lifetime新鲜度

if (设置Max_Age){   // 优先级一为Max_Age
   freshness_lifetime = Max_Age
}else if (设置Expires){  //  优先级二为Expires
     freshness_lifetime = Expires– 原始数据时间
}else if(设置Last_Modified){ //  优先级三为Last_Modified
     freshness_lifetime =(int)(0.1 * max(0, Last_Modified -原始数据时间))
     设置启发模式
}else{ 
     freshness_lifetime =默认最小生存周期
     设置启发模式
}

if (设置启发模式) {
     检查两个边界值
     freshness_lifetime =freshness_lifetime >默认最大生存周期? 默认最小生存周期:freshness_lifetime;
     freshness_lifetime =freshness_lifetime<默认最小生存周期? 默认最小生存周期:freshness_lifetime;
}

年龄计算方法           

          缓存数据从上次更新到现在的时间

原文地址:https://www.cnblogs.com/makar/p/3250865.html