LRU K和2Q快取演算法介紹

2021-09-23 19:09:05 字數 1306 閱讀 8073

一、lru-k演算法

1、演算法思想

lru-k中的k代表最近使用的次數,因此lru可以認為是lru-1。lru-k的主要目的是為了解決lru演算法「快取汙染」的問題,其核心思想是將「最近使用過1次」的判斷標準擴充套件為「最近使用過k次」。

2、工作原理

相比lru,lru-k需要多維護乙個佇列,用於記錄所有快取資料被訪問的歷史。只有當資料的訪問次數達到k次的時候,才將資料放入快取。當需要淘汰資料時,lru-k會淘汰第k次訪問時間距當前時間最大的資料。詳細實現如下

(1). 資料第一次被訪問,加入到訪問歷史列表;

(2). 如果資料在訪問歷史列表裡後沒有達到k次訪問,則按照一定規則(fifo,lru)淘汰;

(3). 當訪問歷史佇列中的資料訪問次數達到k次後,將資料索引從歷史佇列刪除,將資料移到快取佇列中,並快取此資料,快取佇列重新按照時間排序;

(4). 快取資料佇列中被再次訪問後,重新排序;

(5). 需要淘汰資料時,淘汰快取佇列中排在末尾的資料,即:淘汰「倒數第k次訪問離現在最久」的資料。

lru-k具有lru的優點,同時能夠避免lru的缺點,實際應用中lru-2是綜合各種因素後最優的選擇,lru-3或者更大的k值命中率會高,但適應性差,需要大量的資料訪問才能將歷史訪問記錄清除掉。

二、two queues(2q)

1、演算法思想

該演算法類似於lru-2,不同點在於2q將lru-2演算法中的訪問歷史佇列(注意這不是快取資料的)改為乙個fifo快取佇列,即:2q演算法有兩個快取佇列,乙個是fifo佇列,乙個是lru佇列。

2、工作原理

當資料第一次訪問時,2q演算法將資料快取在fifo佇列裡面,當資料第二次被訪問時,則將資料從fifo佇列移到lru佇列裡面,兩個佇列各自按照自己的方法淘汰資料。詳細實現如下:

(1). 新訪問的資料插入到fifo佇列;

(2). 如果資料在fifo佇列中一直沒有被再次訪問,則最終按照fifo規則淘汰;

(3). 如果資料在fifo佇列中被再次訪問,則將資料移到lru佇列頭部;

(4). 如果資料在lru佇列再次被訪問,則將資料移到lru佇列頭部;

(5). lru佇列淘汰末尾的資料。

yii2快取的介紹和使用

又是到我們第一步操作的時候了,我們先來配置元件。方便起見,我們的快取元件配置在common config main.php檔案,先來簡單配置下檔案快取 components cache class yii caching filecache cachepath runtime cache2 所謂的檔...

yii2快取的介紹和使用

乙個好的框架是肯定離不開快取的使用,相反,乙個沒有快取的框架也肯定不是乙個好框架,好像是乙個意思,不管了,我們先來看看yii2中是如何使用快取的吧。又是到我們第一步操作的時候了,我們先來配置元件。方便起見,我們的快取元件配置在common config main.php檔案,先來簡單配置下檔案快取 ...

Mybatis系列2 一級快取和二級快取

一級快取缺省會啟用,存在於 sqlsession 的生命週期中,在同乙個sqlsession 中查詢時,mybatis會把執行的方法和引數通過演算法生成快取的鍵值,將鍵值和查詢結果存入乙個map物件中。如果同乙個sqlsession 中執行的方法和引數完全一致,則會返回快取中的物件。任何的 inse...