资讯专栏INFORMATION COLUMN

笔记|缓存

elliott_hu / 2054人阅读

摘要:缓存算法我是,我会统计每一个缓存数据的使用频率,我会把使用最少的缓存替换出缓存区。浏览器就是使用了我作为缓存算法。在缓存系统中找出最少最近的对象是需要较高的时空成本。再来一次机会的缓存算法,是对的优化。直到新的缓存对象被放入。

缓存 什么是缓存?

存贮数据(使用频繁的数据)的临时地方,因为取原始数据的代价太大了,所以我可以取得快一些。

Cache hit & Cache miss 的定义理解

Cache miss之后怎么办?

如果缓存区还有空间,可以把该次请求的数据存到缓存区

如果缓存慢了,又没有命中缓存,那么建立替换算法,将缓存区中的outdated的数据替换掉

存储成本

当缓存没有数据,我们从数据库中取得数据,存到缓存的时空成本

索引成本

为缓存构建索引的时空成本

缓存算法 Least Frequently Used (LFU)

我是LFU,我会统计每一个缓存数据的使用频率,我会把使用最少的缓存替换出缓存区。

Least Recently Used (LRU)

我会把最近最少使用的缓存数据踢走。

浏览器就是使用了我(LRU)作为缓存算法。新的对象会被放在缓存的顶部,当缓存达到了容量极限,我会把底部的对象踢走,而技巧就是:我会把最新被访问的缓存对象,放到缓存池的顶部。

所以,经常被读取的缓存对象就会一直呆在缓存池中。有两种方法可以实现我,array 或者是 linked list。

LRU22Q是我的兄弟,他们是为了完善我而存在的。

Least Recently Used 2

我会把访问过两次的对象放进缓存区。

因为需要跟踪访问对象2次,所以随着数据量增多,访问负载和存储成本都会变多。

2 Queues (2Q)

我会把访问到的对象存到LRU中,如果这个对象被再次访问,那么把他放到第二个,更大的LRU中。

我踢走缓存对象是保持第一个缓存池是第二个缓存池的1/3.

当缓存的访问负载是固定的时候,把LRU换成LRU2,会比增加LRU的容量更好。

我的性能比前两者更出色,并且我是adoptive to access模式。

Adaptive Replacement Cache

我由两个LRU组成。

第一个L1, 包含的是最近只被使用过一次的。

第二个L2, 包含的是使用过两次的对象。

我能够自调,并且是低负载的。我也保存着历史对象,这样,我就可以记住那些被移除的对象,同时,也让我可以看到被移除的对象是否可以留下,取而代之的是踢走别的对象。

Most Recently Used (MRU)

MRU是和LRU相对立的,MRU会移除最近最多使用的对象。why?

在缓存系统中找出最少最近的对象是需要较高的时空成本。

MRU是:每当有一次请求,就会把这个访问的对象放到栈顶,当栈满了,我就会用新请求的对象来替换栈顶的对象。

FIFO

低负载,低效管理的方法。

Second Chance

再来一次机会的缓存算法,是对FIFO的优化。

SC跟FIFO一样,在队首观察元素,进行踢出。

不同的是,SC对每一个对象都多了一个标志位,每次新加入队列的对象,标志位都为1。如果在队首要踢出该元素,则把他的标志位置0,重新加入队列,相当于给他第二次机会。如果该踢出元素的标志位是0,则直接将他踢出。

CLock

CLock是一个更好的环形FIFO。

Clock的头部指针指向队列中最老的对象。当缓存miss发生,同时没有存储空间时,我会首先检查指针指向的对象的标志位的状态,再决定操作,如果标志是0,我会直接用新数据替换这个老对象;如果标志是1,则会指针向前走一步,同时重复上一个步骤。直到新的缓存对象被放入。

Simple time-based

我会对新增的对象加以保存周期,同时去掉周期失效的对象。

参考

http://www.kuqin.com/shuoit/20160201/350...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/61780.html

相关文章

  • Web前端中的静态资源缓存笔记

    摘要:根据资源的分类的资源分类主要分为两大类主资源和派生资源。此时的数据时缓存到内存中的,当进程后,也就是浏览器关闭以后,数据将不存在。信息最大作用就是用于判断服务器上该的内容是否被修改。附上我的学习笔记。 根据webkit资源的分类 webkit的资源分类主要分为两大类:主资源和派生资源。 主资源:比如HTML页面,或者下载项,对应代码中的类是MainResourceLoader。 派生...

    JowayYoung 评论0 收藏0
  • output_buffering 学习笔记(一)

    摘要:输出缓存,在请求一个的过程中,实际上经过三个缓存程序缓存缓存浏览器缓存缓存的几个重要规则在服务中,如果我们开启了缓存,则数据首先放入到中如何开启有两个方法在配置这里去掉号即可在页面中使用通过打开的,则作用于所有的页面,使用打开则只作用于 output_buffering(ob,输出缓存), 在请求一个PHP的过程中,实际上经过三个缓存:1. 程序缓存2 ob缓存 3. 浏览器缓存. ...

    G9YH 评论0 收藏0
  • 【Java并发编程的艺术】第二章读书笔记之原子操作

    摘要:前言今天的笔记来了解一下原子操作以及中如何实现原子操作。概念原子本意是不能被进一步分割的最小粒子,而原子操作意为不可被中断的一个或一系列操作。处理器实现原子操作处理器会保证基本内存操作的原子性。 showImg(https://segmentfault.com/img/bVVIRA?w=1242&h=536); 前言 今天的笔记来了解一下原子操作以及Java中如何实现原子操作。 概念 ...

    olle 评论0 收藏0
  • 刷前端面经笔记(一)

    摘要:协商缓存从缓存数据库中取出缓存的标识,然后向浏览器发送请求验证请求的数据是否已经更新,如果已更新则返回新的数据,若未更新则使用缓存数据库中的缓存数据。 1.CSS的盒子模型 包含元素内容content、内边距padding、边框border、外边距marginbox-sizing:border-box;content-box;inherit;1) content-box:总宽度=mar...

    刘德刚 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<