LRU-緩存算法

  1. LRU
    1.1. 原理
    LRU(Least recently used,最近最少使用)算法根據數據的歷史訪問記錄來進行淘汰數據,其核心思想是“如果數據最近被訪問過,那么將來被訪問的幾率也更高”。

1.2. 實現
最常見的實現是使用一個鏈表保存緩存數據,詳細算法實現如下:

  1. 新數據插入到鏈表頭部;

  2. 每當緩存命中(即緩存數據被訪問),則將數據移到鏈表頭部;

  3. 當鏈表滿的時候,將鏈表尾部的數據丟棄。

1.3. 分析
【命中率】

當存在熱點數據時,LRU的效率很好,但偶發性的、周期性的批量操作會導致LRU命中率急劇下降,緩存污染情況比較嚴重。

【復雜度】

實現簡單。

【代價】

命中時需要遍歷鏈表,找到命中的數據塊索引,然后需要將數據移到頭部。

class Node():
    def __init__(self, value):
        self.value = value
        self.next = None


class Cache_LRU():
    def __init__(self,n):
        self.data = None
        self.k = n
        self.count = 0
        self.head = Node(None)
        self.last = self.head

    def data_set(self, value):
        if self.count < self.k:
            #add link
            self.last.next = Node(value)
            self.last = self.last.next
            self.count += 1
        else:
            #remove head
            self.head.next = self.head.next.next
            self.last.next = Node(value)
            self.last = self.last.next
    

    def in_cache(self, node):
        # node.value -> node.next.value
        value = node.value

        if node.next != None:
            if node.next == self.last:
                    self.last = node
            node.value = node.next.value
            tmp = node.next
            node.next = node.next.next
            self.last.next = Node(value)
            self.last = self.last.next
            
    def print_node(self):
        node = self.head
        while(node.next != None):
            print(node.value, end=" ")
            node = node.next
        print(node.value)
        
    def data_get(self,value):
        node = self.head            
        while(node):
            if node.value == value:
                self.in_cache(node)
                return True
            node = node.next
        
        self.data_set(value)
            
            
        
import random

count = 0
cache = Cache_LRU(6)
choices = ["1","ad","adw","adwv","awdwd"]
for i in range(100):
    a =  random.choice(choices)
    if cache.data_get(a):
        count += 1
count 
95
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. LRU 1.1. 原理LRU(Least recently used,最近最少使用)算法根據數據的歷史訪問記...
    AKyS佐毅閱讀 2,199評論 0 3
  • 1. LRU 1.1.原理 LRU(Leastrecentlyused,最近最少使用)算法根據數據的歷史訪問記錄來...
    安易學車閱讀 2,570評論 0 23
  • 緩存淘汰算法--LRU算法 1. LRU 1.1 原理 LRU(Least recently used,)算法根據...
    白公子是貓奴閱讀 484評論 0 0
  • 一、什么是緩存 這里說的緩存是一種廣義的概念,在計算機存儲層次結構中,低一層的存儲器都可以看做是高一層的緩存。比如...
    金戈大王閱讀 28,933評論 3 73
  • 看<<霍亂時期的愛情>>,發現外文翻譯成中文時,很多并不是按照中文的習慣來表達的。中文里的表達,通常是,先說原因,...
    BoBo很忙閱讀 146評論 0 1