【轉】快取演算法
LRU與MRU-資料庫存取緩衝區的LRU與MRU演算法
原文來自:http://www.ad0.cn/netfetch/read.php/1244.htm
瞭解Oracle資料庫緩衝區的工作原理,
以及LRU演算法(最近最少使用演算法) / MRU演算法(最近最常使用演算法)
1.Cache Hit / Cache Miss
當使用者第一次向資料庫發出查詢資料的請求的時候,資料庫會先在緩衝區中查詢該資料,如果要訪問的資料恰好已經在緩衝區中(我們稱之為Cache Hit)那麼就直接用緩衝區中讀取該資料.
反之如果緩衝區中沒有使用者要查詢的資料那麼這種情況稱之為Cache Miss,在這種情況下資料庫就會先從磁碟上讀取使用者要的資料放入緩衝區,使用者再從緩衝區讀取該資料.
很顯然從感覺上來說Cache Hit會比Cache Miss時存取速度快.
2. LRU(最近最少使用演算法) / MRU(最近最常使用演算法)
LRU演算法(Least recently used)的基本概念是:當記憶體的剩餘的可用空間不夠時,緩衝區儘可能的先保留使用者最常使用的資料,換句話說就是優先清除”較不常使用的資料”,並釋放其空間.之所以”較不常使用的資料”要用引號是因為這裡判斷所謂的較不常使用的標準是人為的、不嚴格的.
MRU演算法(Most recently used)的意義正好和LRU演算法相反.
LRU與MRU兩者在緩衝區工作機制中的作用和區別
看一下Oracle 9i Cache對LRU和MRU的使用,看看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 9i Cache對LRU和MRU的使用例子
使用者查詢資料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.
Datebase Buffer Cache由3部分組成: Dirty buffers,Free buffers,Pinned Buffers
Dirty buffers 是表示 block被讀到sga中後被修改過,還沒有寫入資料檔案
Free buffers 是表示可以被覆蓋的,也就是不包含未寫入資料檔案的資料
Pinned Buffers 表示該 buffer 目前正被程式使用,這個使用可能是正在這個buffer上讀也可能是正在修改,這個buffer在被標誌為pinned之前可能是 dirty的也可能是free的,一個buffer在同一時刻只能由一個程式訪問(9i有改進 讀/讀 可以同時進行)
這是從不同的角度去描述buffer的狀態的
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16179598/viewspace-612329/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 快取、快取演算法和快取框架簡介快取演算法框架
- 分散式快取 - 快取簡介,常用快取演算法分散式快取演算法
- 轉載快取快取
- 用Java寫一個分散式快取——快取淘汰演算法Java分散式快取演算法
- ASP快取技術 (轉)快取
- (轉)快取更新的套路快取
- 快取穿透、快取擊穿、快取雪崩、快取預熱快取穿透
- Apache 設定web 快取(轉)ApacheWeb快取
- 快取穿透、快取擊穿、快取雪崩快取穿透
- 快取穿透、快取雪崩、快取擊穿快取穿透
- FIFO/LRU/LFU三種快取演算法快取演算法
- JS 實現快取演算法(FIFO/LRU)JS快取演算法
- android 快取管理及LRU演算法Android快取演算法
- Redis快取擊穿、快取穿透、快取雪崩Redis快取穿透
- HTTP快取——協商快取(快取驗證)HTTP快取
- [Redis]快取穿透/快取擊穿/快取雪崩Redis快取穿透
- 快取穿透 快取雪崩快取穿透
- 快取問題(一) 快取穿透、快取雪崩、快取併發 核心概念快取穿透
- 快取穿透、快取擊穿、快取雪崩區別快取穿透
- android快取路徑(轉載)Android快取
- 快取問題(四) 快取穿透、快取雪崩、快取併發 解決案例快取穿透
- ServiceWorker 快取與 HTTP 快取快取HTTP
- mybatis快取-二級快取MyBatis快取
- MyBatis快取機制(一級快取,二級快取)MyBatis快取
- Java 自定義實現 LRU 快取演算法Java快取演算法
- 快取淘汰、快取穿透、快取擊穿、快取雪崩、資料庫快取雙寫一致性快取穿透資料庫
- 快取演算法(頁面置換演算法)-FIFO、LFU、LRU快取演算法
- Redis詳解(十二)------ 快取穿透、快取擊穿、快取雪崩Redis快取穿透
- 面試總結 —— Redis “快取穿透”、“快取擊穿”、“快取雪崩”面試Redis快取穿透
- 快取穿透,快取擊穿,快取雪崩解決方案分析快取穿透
- 快取穿透、快取雪崩和快取擊穿是什麼?快取穿透
- Redis——快取穿透、快取擊穿、快取雪崩、分散式鎖Redis快取穿透分散式
- Redis快取穿透、快取雪崩、快取擊穿好好說說Redis快取穿透
- 什麼是redis快取雪崩、快取穿透、快取擊穿Redis快取穿透
- Web快取 – HTTP協議快取Web快取HTTP協議
- 快取工廠之Redis快取快取Redis
- 快取最佳化(快取穿透)快取穿透
- 如何設計快取系統:快取穿透,快取擊穿,快取雪崩解決方案分析快取穿透