国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

不吹不黑,這個算法,你肯定不會

開發 后端 算法
我們常用緩存提升數據查詢速度,由于緩存容量有限,當緩存容量到達上限,就需要刪除部分數據挪出空間,這樣新數據才可以添加進來。緩存數據不能隨機刪除,一般情況下我們需要根據某種算法刪除緩存數據。常用淘汰算法有 LRU,LFU,FIFO,這篇文章我們聊聊 LRU 算法。
[[280896]]

01、前言

我們常用緩存提升數據查詢速度,由于緩存容量有限,當緩存容量到達上限,就需要刪除部分數據挪出空間,這樣新數據才可以添加進來。緩存數據不能隨機刪除,一般情況下我們需要根據某種算法刪除緩存數據。常用淘汰算法有 LRU,LFU,FIFO,這篇文章我們聊聊 LRU 算法。

02、LRU 簡介

LRU 是 Least Recently Used 的縮寫,這種算法認為最近使用的數據是熱門數據,下一次很大概率將會再次被使用。而最近很少被使用的數據,很大概率下一次不再用到。當緩存容量滿的時候,優先淘汰最近很少使用的數據。

假設現在緩存內部數據如圖所示:

不吹不黑,這個算法,你肯定不會

這里我們將列表第一個節點稱為頭結點,最后一個節點為尾結點。

當調用緩存獲取 key=1 的數據,LRU 算法需要將 1 這個節點移動到頭結點,其余節點不變,如圖所示。

不吹不黑,這個算法,你肯定不會

然后我們插入一個 key=8 節點,此時緩存容量到達上限,所以加入之前需要先刪除數據。由于每次查詢都會將數據移動到頭結點,未被查詢的數據就將會下沉到尾部節點,尾部的數據就可以認為是最少被訪問的數據,所以刪除尾結點的數據。

不吹不黑,這個算法,你肯定不會

然后我們直接將數據添加到頭結點。

不吹不黑,這個算法,你肯定不會

這里總結一下 LRU 算法具體步驟:

  • 新數據直接插入到列表頭部
  • 緩存數據被命中,將數據移動到列表頭部
  • 緩存已滿的時候,移除列表尾部數據。

03、LRU 算法實現

上面例子中可以看到,LRU 算法需要添加頭節點,刪除尾結點。而鏈表添加節點/刪除節點時間復雜度 O(1),非常適合當做存儲緩存數據容器。但是不能使用普通的單向鏈表,單向鏈表有幾點劣勢:

  1. 每次獲取任意節點數據,都需要從頭結點遍歷下去,這就導致獲取節點復雜度為 O(N)。
  2. 移動中間節點到頭結點,我們需要知道中間節點前一個節點的信息,單向鏈表就不得不再次遍歷獲取信息。

針對以上問題,可以結合其他數據結構解決。

使用散列表存儲節點,獲取節點的復雜度將會降低為 O(1)。節點移動問題可以在節點中再增加前驅指針,記錄上一個節點信息,這樣鏈表就從單向鏈表變成了雙向鏈表。

綜上使用雙向鏈表加散列表結合體,數據結構如圖所示:

不吹不黑,這個算法,你肯定不會

在雙向鏈表中特意增加兩個『哨兵』節點,不用來存儲任何數據。使用哨兵節點,增加/刪除節點的時候就可以不用考慮邊界節點不存在情況,簡化編程難度,降低代碼復雜度。

LRU 算法實現代碼如下,為了簡化 key ,val 都認為 int 類型。

  1. public class LRUCache { 
  2.  
  3.  Entry head, tail; 
  4.  int capacity; 
  5.  int size
  6.  Map cache; 
  7.  
  8.  
  9.  public LRUCache(int capacity) { 
  10.  this.capacity = capacity; 
  11.  // 初始化鏈表 
  12.  initLinkedList(); 
  13.  size = 0; 
  14.  cache = new HashMap<>(capacity + 2); 
  15.  } 
  16.  
  17.  /** 
  18.  * 如果節點不存在,返回 -1.如果存在,將節點移動到頭結點,并返回節點的數據。 
  19.  * 
  20.  * @param key 
  21.  * @return 
  22.  */ 
  23.  public int get(int key) { 
  24.  Entry node = cache.get(key); 
  25.  if (node == null) { 
  26.  return -1; 
  27.  } 
  28.  // 存在移動節點 
  29.  moveToHead(node); 
  30.  return node.value; 
  31.  } 
  32.  
  33.  /** 
  34.  * 將節點加入到頭結點,如果容量已滿,將會刪除尾結點 
  35.  * 
  36.  * @param key 
  37.  * @param value 
  38.  */ 
  39.  public void put(int keyint value) { 
  40.  Entry node = cache.get(key); 
  41.  if (node != null) { 
  42.  node.value = value; 
  43.  moveToHead(node); 
  44.  return
  45.  } 
  46.  // 不存在。先加進去,再移除尾結點 
  47.  // 此時容量已滿 刪除尾結點 
  48.  if (size == capacity) { 
  49.  Entry lastNode = tail.pre; 
  50.  deleteNode(lastNode); 
  51.  cache.remove(lastNode.key); 
  52.  size--; 
  53.  } 
  54.  // 加入頭結點 
  55.  
  56.  Entry newNode = new Entry(); 
  57.  newNode.key = key
  58.  newNode.value = value; 
  59.  addNode(newNode); 
  60.  cache.put(key, newNode); 
  61.  size++; 
  62.  
  63.  } 
  64.  
  65.  private void moveToHead(Entry node) { 
  66.  // 首先刪除原來節點的關系 
  67.  deleteNode(node); 
  68.  addNode(node); 
  69.  } 
  70.  
  71.  private void addNode(Entry node) { 
  72.  head.next.pre = node; 
  73.  node.next = head.next
  74.  
  75.  node.pre = head; 
  76.  head.next = node; 
  77.  } 
  78.  
  79.  private void deleteNode(Entry node) { 
  80.  node.pre.next = node.next
  81.  node.next.pre = node.pre; 
  82.  } 
  83.  
  84.  
  85.  public static class Entry { 
  86.  public Entry pre; 
  87.  public Entry next
  88.  public int key
  89.  public int value; 
  90.  
  91.  public Entry(int keyint value) { 
  92.  this.key = key
  93.  this.value = value; 
  94.  } 
  95.  
  96.  public Entry() { 
  97.  } 
  98.  } 
  99.  
  100.  private void initLinkedList() { 
  101.  head = new Entry(); 
  102.  tail = new Entry(); 
  103.  
  104.  head.next = tail; 
  105.  tail.pre = head; 
  106.  
  107.  } 
  108.  
  109.  public static void main(String[] args) { 
  110.  
  111.  LRUCache cache = new LRUCache(2); 
  112.  
  113.  cache.put(1, 1); 
  114.  cache.put(2, 2); 
  115.  System.out.println(cache.get(1)); 
  116.  cache.put(3, 3); 
  117.  System.out.println(cache.get(2)); 
  118.  
  119.  } 

04、LRU 算法分析

緩存命中率是緩存系統的非常重要指標,如果緩存系統的緩存命中率過低,將會導致查詢回流到數據庫,導致數據庫的壓力升高。

結合以上分析 LRU 算法優缺點。

LRU 算法優勢在于算法實現難度不大,對于對于熱點數據, LRU 效率會很好。

LRU 算法劣勢在于對于偶發的批量操作,比如說批量查詢歷史數據,就有可能使緩存中熱門數據被這些歷史數據替換,造成緩存污染,導致緩存命中率下降,減慢了正常數據查詢。

05、LRU 算法改進方案

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

將鏈表拆分成兩部分,分為熱數據區,與冷數據區,如圖所示。

不吹不黑,這個算法,你肯定不會

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

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

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

其他改進方法還有 LRU-K,2Q,LIRS 算法,感興趣同學可以自行查閱。

責任編輯:華軒 來源: Java極客技術
相關推薦

2021-01-13 10:23:02

Jupyter Lab使用體驗3.0版本

2022-04-07 14:33:31

操作系統鴻蒙HarmonyOS

2022-03-23 12:18:14

網絡科學測繪科學計算機科學

2020-05-06 21:52:19

蘋果iPhone 11手機

2022-03-04 18:14:38

程序員編程

2016-08-25 10:30:34

測試Testin

2022-12-26 18:53:00

MQ宕機倉儲服務

2020-09-30 16:27:14

5G網絡技術

2019-12-27 09:29:46

負載均衡算法哈希算法

2025-03-07 14:32:59

AI模型訓練

2016-10-11 16:43:04

小米5s超聲波指紋識別

2021-08-30 07:49:33

索引ICP Mysql

2019-12-25 11:22:19

負載均衡集群算法

2016-09-12 15:15:49

戴爾

2017-09-12 16:18:22

ICO區塊鏈互聯網+

2023-05-06 16:26:28

??Vue??UI組件

2017-04-19 09:55:50

2016-03-18 09:52:40

物聯網wifi技術

2020-02-20 08:00:37

緩存降級限流
點贊
收藏

51CTO技術棧公眾號

在线不卡a资源高清| www国产无套内射com| 91九色国产在线| 美女三级99| 欧美性猛交p30| 精品国产一区二区三区成人影院 | 福利视频网站| 亚洲国产欧美自拍| 精品一区二区免费| 中国成人在线视频| 国产一区欧美一区| 影音先锋可以看的网站| 日韩欧美a级成人黄色| 在线观看免费版| 欧美va亚洲va香蕉在线| 国产网红女主播精品视频| 日韩欧美国产小视频| 黄视频在线观看免费| 久久久影视传媒| 中文字幕一区二区三区在线乱码| 噜噜噜狠狠夜夜躁精品仙踪林| 精品久久五月天| 国产成人77亚洲精品www| 亚洲精品电影在线| 九色视频网站| 91视频免费播放| 97超碰在线视| 在线日韩一区二区| 亚久久调教视频| 国产伦精品一区二区三区在线| 国产大学生校花援交在线播放| 亚洲永久免费| 在线看福利67194| 中文在线三区| 亚洲h在线观看| 欧美承认网站| 成人三级在线视频| 久久日韩精品一区二区五区| 精品日产卡一卡二卡麻豆| 美脚丝袜脚交一区二区| 亚洲黄色av一区| 日本久久久精品视频| 国内久久视频| 中文字幕在线播放不卡一区| 一区二区av在线| 久久久久久久色| 国产日韩在线| 国产精品人成在线观看免费| 好男人看片在线观看免费观看国语| 亚洲综合色网站| 亚洲欧美制服另类日韩| 国产三区二区一区久久| 99国产精品久久久久久久久久 | 91麻豆精品激情在线观看最新| 7m精品福利视频导航| 国产免费区一区二区三视频免费| 久久精品国产96久久久香蕉| 另类专区亚洲| 性色av一区二区咪爱| 香蕉人人精品| 国产日韩精品在线| 日本欧美韩国| 亚洲激情视频在线观看| 国产精品久久a| 5858s免费视频成人| 亚洲成人va| 日韩风俗一区 二区| 欧美黑人xx片| 亚洲精品乱码久久久久久金桔影视 | 蜜臀av.com| 狠狠色丁香婷婷综合影院| 亚洲国产精品久久人人爱蜜臀| www.涩涩涩| 亚洲高清在线精品| 欧美成人精品一区二区男人看| 欧美日韩中文另类| 亚洲久久中文字幕| 国产欧美综合色| 日韩免费啪啪| 日韩欧美成人激情| 青草av.久久免费一区| 欧美日韩免费观看视频| 日本午夜人人精品| 国产精品资源| 欧美精品videossex少妇| 国产精品一区二区三区久久| 国产999精品久久久久久| 蜜桃臀av在线| 91日韩在线播放| 日韩欧美视频在线| 欧美精品成人一区二区三区四区| 欧美天堂亚洲电影院在线观看| 中文字幕在线视频网| 一区二区91美女张开腿让人桶| 日本美女视频一区二区| 大色综合视频网站在线播放| 亚洲综合在线网站| 亚洲一区二区三区视频在线| 成年人视频免费看| 欧美性xxxx极品hd满灌| 主播国产精品| 超碰在线观看免费| 色综合久久88| 精品在线亚洲视频| 九色porny91| 亚洲精品综合在线| 超级碰碰不卡在线视频| 热久久免费视频精品| 天天亚洲美女在线视频| 午夜精品福利一区二区三区蜜桃| 亚洲精品乱码久久久久久| 国产成人在线视频网址| 成人黄色免费短视频| 黄色小网站在线观看| 国产美女主播在线播放| 久久久不卡影院| 大荫蒂性生交片| 欧美丝袜美女中出在线| 不卡的国产精品| 一区二区三区三区在线| 日本韩国一区二区| 欧美人成在线观看ccc36| 国产乱子夫妻xx黑人xyx真爽 | 黄色片在线免费观看| 欧美激情一区二区久久久| 中文无码久久精品| 免费观看一二区视频网站| 中文字幕亚洲综合久久| 青青草成人在线观看| 精品视频一二三| 欧美又大又硬又粗bbbbb| 欧美日韩尤物久久| 午夜日韩成人影院| 你懂的视频在线一区二区| 欧美性开放视频| 6080亚洲理论片在线观看| 真实国产乱子伦对白视频| 日韩欧美一二三| 日韩电影在线观看网站| 女女色综合影院| 国产精品美乳在线观看| 亚洲欧美日韩电影| 久久影视三级福利片| 2020中文字幕在线| 91黄色8090| 精品成人乱色一区二区| 日本久久综合| 午夜激情影院| 91精品国产一区二区三区动漫| 亚洲成人资源网| 色777狠狠狠综合伊人| 国产精品久久一区二区三区不卡| 国产精品香蕉国产| 欧美激情第8页| 二区三区在线| 91手机在线观看| 欧美成人精精品一区二区频| 久久激情中文| 9999精品成人免费毛片在线看 | 亚洲欧美一区二区在线观看| 欧美h版在线观看| 日韩视频在线免费看| 国产精品高潮呻吟久久av黑人| 依依成人精品视频| 欧美电影免费观看高清| 美女羞羞视频在线观看| 亚洲午夜精品一区二区| 亚洲男人第一网站| 91免费小视频| 亚洲国产国产| gogogogo高清视频在线| 国产av第一区| 欧美精品免费看| 亚洲精品欧美激情| 韩国久久久久| 免费在线国产视频| 狠狠97人人婷婷五月| 国产欧美在线观看| 国产丝袜一区二区三区免费视频| 国产亚洲婷婷免费| 亚洲欧洲日本mm| 波多野结衣在线观看| 日本性视频网| 91国产在线播放| 97视频免费看| 中文字幕日韩av电影| 欧美猛男gaygay网站| 日韩国产欧美区| 91成人免费电影| 欧美理论片在线| 欧美精品aⅴ在线视频| 99精品免费| 国产一级特黄a大片99| 日韩精品视频在线| 亚洲欧美乱综合| 青青草国产精品97视觉盛宴 | 欧美视频精品一区| 国产69精品久久99不卡| 91亚洲国产高清| 高清精品久久|