欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Oracle的LRU和MRU,你都知道多少? 有大用

也许是因为拥有Oracle与Bea认证的关系,也有可能是因为年纪大的关系,在许多架构设计的时候,总对Oracle与WebLogic的许多理念非常留恋。

今天下午技术讨论会上,在谈及分布式缓存数据迁移方案的时候,又阴差阳错的聊到了LRU与MRU两个算法。

一如既往,简单搜索下,整理下,以便于后面的查找。

就当笔记用了。

一、什么是LRU和MRU

所谓的LRU(Least recently used)算法的基本概念是当内存的剩余的可用空间不够时,缓冲区尽可能的先保留使用者最常使用的数据,换句话说就是优先清除”较不常使用的数据”,并释放其空间,之所以”较不常使用的数据”要用引号是因为这里判断所谓的较不常使用的标准是人为的、不严格的。

所谓的MRU(Most recently used)算法的意义正好和LRU算法相反.

二、从Oracle 9I 高速缓冲区的角度来聊一聊

下面我们通过Oracle 9i Cache中对LRU和MRU的使用来看一下两者在缓冲区工作机制中的作用和区别。

在Oracle 9i中有LRU List的概念我们可以把LRU List想象成是一连串的缓冲区集合,两端分别是LRU端MRU端, 当数据库从磁盘上读取数据放入缓冲区时,系统必须先确定缓冲区中有free buffers,这个时候Oracle 9i会扫描LRU List,扫描的基本原则是

1、从LRU端到MRU端;

2、当扫描到free buffer或已扫描的缓冲区数目超过临界值时,就会停止扫描动作;

如果在扫描过程顺利的在LRU List中找到了free buffer,那么Oracle 9i就把从磁盘读出的数据写到free buffer中然后把free buffer加到LRU List的MRU端。

那如果扫描过程没有在LRU List中找到free buffer怎么办?当然是从LRU List的LRU端开始清除缓冲区,如此一来就可以腾出新的空间了。

先来看一张图。

       

使用者查询数据A,初始的时候LRU List中没有数据A,于是Oracle 9i到磁盘读取A,然后放到LRU List的MRU端,使用者再从LRU List中读取数据A,同理对于 B,C…当LRU List满了以后,如果使用者查询N,此时N不在LRU List中而且LRU List中已经没有free buffer了,此时Oracle 9i就开始从LRU端淘汰A以腾出空间存放N。

我们再来看另外一种情况。

在State 3之后,恰好使用者持续的查询A—这将会导致A一直被放置在靠近MRU端的缓冲区,结果将如图State m’所示,你会发现图2的State m’与图1的State m缓冲区存放的数据完全一样但是存放位置不一样。

此时,LRU List满了,如果再放N的时候LRU List`淘汰的是B,因为A的查询率高于B,所以LRU List让A在缓冲区中呆上较长的时间而先淘汰掉”较不常用的”的B。

       

                                                                               图 2



来自 https://www.jianshu.com/p/017323e8cf64?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation



普通分类: