LRU-缓存算法

作者: yunpiao | 来源:发表于2018-07-24 00:36 被阅读59次
    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
    

    相关文章

      网友评论

        本文标题:LRU-缓存算法

        本文链接:https://www.haomeiwen.com/subject/poismftx.html