缓存和传统缓存算法整理文档

缓存和传统缓存算法整理文档

前言

       缓存有很多种,小到cpu内部的高速缓存,内存和硬盘的缓存,大到CDN服务商.本文档讨论的缓存系统是为了解决数据库服务器和其他服务之间瓶颈问题的缓存. 当请求量很大的时候,这个瓶颈将会非常明显,每次数据库查询耗费的时间将会非常可观.通过缓存来减少过多的数据库查询和提高请求响应速度.

缓存目的

       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 outFIFO

 

       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;

}

年龄计算方法

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值