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端开始清除缓冲区,如此一来就可以腾出新的空间了。

先来看一张图。

Oracle的LRU和MRU,你都知道多少?_第1张图片

使用者查询数据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。

Oracle的LRU和MRU,你都知道多少?_第2张图片

                                                                               图 2

你可能感兴趣的:(Oracle的LRU和MRU,你都知道多少?)