如何实现LRU缓存方案

本文深入探讨了LRU(最近最少使用)缓存算法的工作原理及其在虚拟页式存储管理中的应用。通过实例演示了如何使用Python实现LRU缓存,包括缓存队列的维护、页面访问处理及缓存更新机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

"""
LRU是Least Recently Used 的缩写,他的意思是"最近最少使用",LRU缓存就是用这种原理实现,简单的说就是缓存一定量的数据,当超过设定的阈值是就把一些过期的数据删除掉。
常用于页面置换算法,是虚拟页式存储管理中常用的算法。
"""


from collections import deque


class LRU:
    def __init__(self, cacheSize):
        self.cacheSize = cacheSize
        self.queue = deque()
        self.hashSet = set()

    # 判断缓存队列是否已满
    def isQueueFull(self):
        return len(self.queue) == self.cacheSize

    # 把页号为pageNum的页缓存到队列中,同时也添加到Hash表中
    def enqueue(self, pageNum):
        # 如果队列满了,需要删除队尾的缓存的页
        if self.isQueueFull():
            self.hashSet.remove(self.queue[-1])
            self.queue.pop()

        self.queue.appendleft(pageNum)
        # 把新缓存的结点同时添加到hash表中
        self.hashSet.add(pageNum)

    """当访问某一个page的时候会调用这个函数,对于访问的page有两种情况:
    1.如果page在缓存队列中,直接把这个结点移动到对首
    2.如果page不在缓存队列中,把这个page缓存到对首"""

    def accessPage(self, pageNum):
        # page不在缓存队列中, 把他缓存到队首
        if pageNum not in self.hashSet:
            self.enqueue(pageNum)
        # page已经在缓存队列中,移动到队首
        elif pageNum != self.queue[0]:
            self.queue.remove(pageNum)
            self.queue.appendleft(pageNum)

    def printQueue(self):
        while len(self.queue) > 0:
            print(self.queue.popleft())


if __name__ == '__main__':
    # 假设缓存的大小为3
    lru = LRU(3)
    # 访问page
    lru.accessPage(1)
    lru.accessPage(2)
    lru.accessPage(5)
    lru.accessPage(1)
    lru.accessPage(6)
    lru.accessPage(7)   
    # 通过上面访问序列后,缓存的信息为
    lru.printQueue()

运行结果如下:

7
6
1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值