————— 兩個月前 —————程序員
用戶信息固然是存在數據庫裏。可是因爲咱們對用戶系統的性能要求比較高,顯然不能每一次請求都去查詢數據庫。算法
因此,小灰在內存中建立了一個哈希表做爲緩存,每次查找一個用戶的時候先在哈希表中查詢,以此提升訪問性能。數據庫
很快,用戶系統上線了,小灰美美地休息了幾天。緩存
一個多月以後......markdown
———————————————性能
什麼是哈希鏈表呢?spa
咱們都知道,哈希表是由若干個Key-Value所組成。在「邏輯」上,這些Key-Value是無所謂排列順序的,誰先誰後都同樣。code
在哈希鏈表當中,這些Key-Value再也不是彼此無關的存在,而是被一個鏈條串了起來。每個Key-Value都具備它的前驅Key-Value、後繼Key-Value,就像雙向鏈表中的節點同樣。orm
這樣一來,本來無序的哈希表擁有了固定的排列順序。
內存
讓咱們以用戶信息的需求爲例,來演示一下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—————
喜歡本文的朋友們,歡迎長按下圖關注訂閱號程序員小灰,收看更多精彩內容