————— 兩個月前 —————
使用者資訊當然是存在資料庫裡。但是由於我們對使用者系統的效能要求比較高,顯然不能每一次請求都去查詢資料庫。
所以,小灰在記憶體中建立了一個雜湊表作為快取,每次查詢一個使用者的時候先在雜湊表中查詢,以此提高訪問效能。
很快,使用者系統上線了,小灰美美地休息了幾天。
一個多月之後……
———————————————
什麼是雜湊連結串列呢?
我們都知道,雜湊表是由若干個Key-Value所組成。在“邏輯”上,這些Key-Value是無所謂排列順序的,誰先誰後都一樣。
在雜湊連結串列當中,這些Key-Value不再是彼此無關的存在,而是被一個鏈條串了起來。每一個Key-Value都具有它的前驅Key-Value、後繼Key-Value,就像雙向連結串列中的節點一樣。
這樣一來,原本無序的雜湊表擁有了固定的排列順序。
讓我們以使用者資訊的需求為例,來演示一下LRU演算法的基本思路:
1.假設我們使用雜湊連結串列來快取使用者資訊,目前快取了4個使用者,這4個使用者是按照時間順序依次從連結串列右端插入的。
2.此時,業務方訪問使用者5,由於雜湊連結串列中沒有使用者5的資料,我們從資料庫中讀取出來,插入到快取當中。這時候,連結串列中最右端是最新訪問到的使用者5,最左端是最近最少訪問的使用者1。
3.接下來,業務方訪問使用者2,雜湊連結串列中存在使用者2的資料,我們怎麼做呢?我們把使用者2從它的前驅節點和後繼節點之間移除,重新插入到連結串列最右端。這時候,連結串列中最右端變成了最新訪問到的使用者2,最左端仍然是最近最少訪問的使用者1。
4.接下來,業務方請求修改使用者4的資訊。同樣道理,我們把使用者4從原來的位置移動到連結串列最右側,並把使用者資訊的值更新。這時候,連結串列中最右端是最新訪問到的使用者4,最左端仍然是最近最少訪問的使用者1。
5.後來業務方換口味了,訪問使用者6,使用者6在快取裡沒有,需要插入到雜湊連結串列。假設這時候快取容量已經達到上限,必須先刪除最近最少訪問的資料,那麼位於雜湊連結串列最左端的使用者1就會被刪除掉,然後再把使用者6插入到最右端。
以上,就是LRU演算法的基本思路。
—————END—————
喜歡本文的朋友們,歡迎長按下圖關注訂閱號程式設計師小灰,收看更多精彩內容