日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法 / LRU 缓存淘汰算法

發(fā)布時間:2024/10/14 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法 / LRU 缓存淘汰算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、誕生原因

緩存是一種提供數(shù)據(jù)讀取性能的技術,在硬件設計、軟件開發(fā)中有廣泛的應用,比如常見的 CPU 緩存,DB 緩存和瀏覽器緩存等。但是緩存的大小是有限的,需要一定的機制判斷哪些數(shù)據(jù)需要淘汰,即:移出緩存,從而保證緩存中的數(shù)據(jù)始終是常用的。常用的機制里面包括 LRU 緩存淘汰算法。

二、設計原則

全稱:Least?Recently Used

如果一個數(shù)據(jù)在最近一段時間沒有被訪問到,那么在將來它被訪問的可能性也很小。所以淘汰的數(shù)據(jù)應該是許久沒有訪問到的數(shù)據(jù)。

三、所用的數(shù)據(jù)結構

  • 雙向鏈表:用于串聯(lián)緩存數(shù)據(jù)。
  • 紅黑樹(散列表):用于索引緩存數(shù)據(jù)。
  • 四、執(zhí)行過程

    假設 data 中包含 key 和 value。

    節(jié)點為 node(指針)。

    1、增加緩存數(shù)據(jù)時,

    若緩存已滿,double list 尾部數(shù)據(jù) delete 掉,將新 data 壓入雙向鏈表頭部;

    將新 data 壓入到紅黑樹中,key 值為 data 中的 key,value 為 node。

    2、獲取緩存數(shù)據(jù)時,

    先從紅黑樹中根據(jù) key 找到 node,將 node 放到雙向鏈表的頭部,最后返回 node 中 data。

    五、代碼栗子

    github

    六、優(yōu)化

    節(jié)選:https://www.cnblogs.com/goodAndyxublog/p/11757134.html

    以下方案來源與 MySQL InnoDB LRU 改進算法

    將鏈表拆分成兩部分,分為熱數(shù)據(jù)區(qū),與冷數(shù)據(jù)區(qū),如圖所示。

    改進之后算法流程將會變成下面一樣:

  • 訪問數(shù)據(jù)如果位于熱數(shù)據(jù)區(qū),與之前 LRU 算法一樣,移動到熱數(shù)據(jù)區(qū)的頭結點。
  • 插入數(shù)據(jù)時,若緩存已滿,淘汰尾結點的數(shù)據(jù)。然后將數(shù)據(jù)插入冷數(shù)據(jù)區(qū)的頭結點。
  • 處于冷數(shù)據(jù)區(qū)的數(shù)據(jù)每次被訪問需要做如下判斷:
    • 若該數(shù)據(jù)已在緩存中超過指定時間,比如說 1 s,則移動到熱數(shù)據(jù)區(qū)的頭結點。
    • 若該數(shù)據(jù)存在在時間小于指定的時間,則位置保持不變。

    對于偶發(fā)的批量查詢,數(shù)據(jù)僅僅只會落入冷數(shù)據(jù)區(qū),然后很快就會被淘汰出去。熱門數(shù)據(jù)區(qū)的數(shù)據(jù)將不會受到影響,這樣就解決了 LRU 算法緩存命中率下降的問題。

    ?

    參考:極客時間《數(shù)據(jù)結構與算法之美》王爭

    這門課真心推薦,內(nèi)容很經(jīng)典、栗子很形象,里面還包含了很多面試題目。真是居家旅行必備良藥。

    ?

    (SAW:Game Over!)

    總結

    以上是生活随笔為你收集整理的数据结构与算法 / LRU 缓存淘汰算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。