LRU

作者: dalewong | 来源:发表于2020-07-28 08:06 被阅读0次

    LRU: 缓存置换算法,mysql page, redis缓存等使用
    实现一个LRU, 主要需要考虑几点:
    一个双向链表,一个hash map


    未命名.jpg
    #
    # @lc app=leetcode.cn id=146 lang=python
    #
    # [146] LRU缓存机制
    #
    
    # @lc code=start
    class DLink(object):
    
        def __init__(self, key=None, value=None, prev=None, next=None):
            self.key = key
            self.value = value
            self.prev = prev
            self.next = next
    
    
    class LRUCache(object):
    
        def __init__(self, capacity):
            """
            :type capacity: int
            """
            self.capacity = capacity
            self.head = DLink()
            self.tail = DLink()
            self.head.prev = self.tail
            self.tail.next = self.head
            self.page_cache = {}
            self.current_volumn = 0
    
        def get(self, key):
            """
            :type key: int
            :rtype: int
            """
            result = self.page_cache.get(key)
            if result:
                self.add_head(self.result)
                return result.value
            else:
                return -1
    
        def put(self, key, value):
            """
            :type key: int
            :type value: int
            :rtype: None
            """
            node = self.page_cache.get(key)
            if node:
               # 这里需要注意有node的时候,需要把node前置
                node.value = value
                self.remove_node(node)
                self.add_head(node)
                return 
    
            if self.current_volumn < self.capacity:
                node = DLink(key, value, self.tail)
                self.add_tail(node)
                self.current_volumn += 1
                self.page_cache[key] = node
    
            else:
                node = DLink(key, value, None, self.head)
                self.add_head(node)
                t = self.remove_tail()
                self.page_cache.pop(t.key)
                self.page_cache[key] = value
    
        def remove_node(node):
            node.prev.next = node.next
            node.next.prev = node.prev
    
        def add_head(node):
            node.prev = self.head
            node.next = self.head.next
            self.head.next = node
            self.head.next.prev = node
    
        def add_tail(node):
            self.remove_node(node)
            self.add_head(node)
    
        def remove_tail():
            node = self.tail.prev
            self.remove_node(node)
            return node
    

    相关文章

      网友评论

          本文标题:LRU

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