国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python實現的一個簡單LRU cache

2020-02-23 05:52:10
字體:
來源:轉載
供稿:網友

起因:我的同事需要一個固定大小的cache,如果記錄在cache中,直接從cache中讀取,否則從數據庫中讀取。python的dict 是一個非常簡單的cache,但是由于數據量很大,內存很可能增長的過大,因此需要限定記錄數,并用LRU算法丟棄舊記錄。key 是整型,value是10KB左右的python對象

分析:

1)可以想到,在對于cache,我們需要維護 key -> value 的關系

2)而為了實現LRU,我們又需要一個基于時間的優先級隊列,來維護   timestamp  -> (key, value) 的關系

3)當cache 中的記錄數達到一個上界maxsize時,需要將timestamp 最小的(key,value) 出隊列

4) 當一個(key, value) 被命中時,實際上我們需要將它從隊列中,移除并插入到隊列的尾部。

從分析可以看出我們的cache 要達到性能最優需要滿足上面的四項功能,對于隊表的快速移除和插入,鏈表顯然是最優的選擇,為了快速移除,最好使用雙向鏈表,為了插入尾部,需要有指向尾部的指針。

下面用python 來實現:

代碼如下:
#encoding=utf-8

class LRUCache(object):
    def __init__(self, maxsize):
        # cache 的最大記錄數
        self.maxsize = maxsize
        # 用于真實的存儲數據
        self.inner_dd = {}
        # 鏈表-頭指針
        self.head = None
        # 鏈表-尾指針
        self.tail = None

    def set(self, key, value):
        # 達到指定大小     
        if len(self.inner_dd) >= self.maxsize:
            self.remove_head_node()

        node = Node()
        node.data = (key, value)
        self.insert_to_tail(node)
        self.inner_dd[key] = node

    def insert_to_tail(self, node):
        if self.tail is None:
            self.tail = node
            self.head = node
        else:
            self.tail.next = node
            node.pre = self.tail
            self.tail = node

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 周口市| 天峨县| 枝江市| 尉氏县| 平湖市| 金门县| 万年县| 山丹县| 西华县| 资兴市| 平南县| 普定县| 岳阳县| 凤翔县| 丽水市| 灵璧县| 江津市| 北川| 沛县| 当阳市| 永宁县| 铜鼓县| 健康| 武陟县| 子洲县| 万荣县| 大竹县| 朔州市| 马鞍山市| 贡山| 东光县| 安化县| 霍林郭勒市| 孙吴县| 稷山县| 丰县| 牙克石市| 莆田市| 龙泉市| 奉贤区| 晋江市|