2021-10-08

该博客介绍了如何利用Python的collections.OrderedDict实现LRU(最近最少使用)缓存淘汰策略。LRU算法将不常使用的记录从缓存中移除。文中提供了两种实现方式,一种是基于OrderedDict,另一种是基于list,但推荐使用OrderedDict,因为其操作更高效。博客还详细解释了move_to_end和popitem(last=False)两个关键函数的用途。
摘要由CSDN通过智能技术生成

redis 缓存淘汰策略LRU算法实现

Lru,就是将缓存中近期不经常使用的记录进行淘汰清理。

import collections
                      
class LRUCache():

    def __init__(self, capacity):
        self.capacity = capacity
        self.dc = collections.OrderedDict()
        
    def get(self, key) -> int:
        if key not in self.dc:
            return -1
        self.dc.move_to_end(key)
        return self.dc.get(key)

    def put(self, key, value):
        if key in self.dc:
            self.dc.move_to_end(key)
        self.dc[key] = value
        if len(self.dc) > self.capacity:
            self.dc.popitem(last=False)

上面用到了有序字典 OrderdDict(), 实现起来非常方便,要注意的就是明白move_to_end 及 popitem(last=False) 两个函数,其他使用方式和dict类似。
move_to_end(key) 将key的键值对移动到有序队列的末尾
popitem() last=False 就表示先进先出,last=True表示后进先出。

当然使用collections之前也写了list版本的,如下:

class LRUCache:

    def __init__(self, capacity: int):
        self.capacity =  capacity
        self.queues = []

    def get(self, key: int) -> int:

        val = -1
        tmp = []
        flag = False
        for k, v in enumerate(self.queues):
            if  key in v.keys():
                val = v.get(key)
                self.queues.pop(k)
                flag = True
                break
        if flag:
            self.queues = [{key: val}] + self.queues
            print(self.queues)
            return val
        else:
            return -1



    def put(self, key: int, value: int) -> None:
        if self.capacity == len(self.queues):
            # 满了
            if self.get(key) == -1:
                self.queues.pop(-1)
                self.queues = [{key: value}] + self.queues
            else:
                # 存在并更新
                for q in range(len(self.queues)):
                    if key in self.queues[q].keys():
                        self.queues[q] = {key: value}
        else:
            # self.queues.append({key: value})
            if self.get(key) == -1:
                # 不存在插入
                self.queues = [{key: value}] + self.queues
            else:
                # 存在并更新
                for q in range(len(self.queues)):
                    if key in self.queues[q].keys():
                        self.queues[q] = {key: value}
                  
不建议使用,贴出来主要是方便理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值