博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python实现LRU缓存
阅读量:4188 次
发布时间:2019-05-26

本文共 1347 字,大约阅读时间需要 4 分钟。

题目描述

实现一个LRU缓存,要求线程安全。该缓存限制最大元素个数m,并提供三种方法:

  1. set:向这个缓存添加(整数key,字符串value对)
  2. get:根据指定的整数key查询其对应的字符串value。如果key不存在,则返回空字符串
  3. remove:删除指定的整数key及其对应的value

当添加键值对到缓存时,如果添加后超过了最大元素个数m,则需要淘汰一个最近未“使用”的key及其对应的value,以保持缓存内的key的最大数量为m。

使用set、get和remove对一个key进行操作或访问时,都视为“使用”这个key。

 

使用Orderdict解决

Python的Orderdict是可以记录键值对插入顺序的特殊字典,适合该场景的使用:

from threading import RLockfrom collections import OrderedDictclass LRUMap(object):    def __init__(self, size: int):        self.size = size        self.base = OrderedDict()        self.lock = RLock()    def get(self, key: int) -> str:        self.lock.acquire()        try:            value = ""            if key in self.base:                value = self.base.pop(key)                self.base[key] = value        finally:            self.lock.release()        return value    def set(self, key: int, value: str):        self.lock.acquire()        try:            if key in self.base:                self.base.pop(key)                self.base[key] = value                return            if len(self.base) >= self.size:                self.base.popitem(last=False)                self.base[key] = value                return            self.base[key] = value        finally:            self.lock.release()        return    def remove(self, key):        if key in self.base:            self.base.pop(key)        return

 

转载地址:http://idsoi.baihongyu.com/

你可能感兴趣的文章
PHPStorm配置ESlint检查代码
查看>>
树的子结构
查看>>
判断两棵二叉树是否相似
查看>>
二叉树中和为某一值的路径
查看>>
数字在排序数组中出现的次数
查看>>
两个链表的第一个公共结点
查看>>
二叉树的深度
查看>>
MySQL数据库入门(三)
查看>>
MySQL数据库入门(四)
查看>>
关于方法覆盖和属性覆盖的问题?
查看>>
JAVA中ListIterator和Iterator详解
查看>>
目标和
查看>>
跳跃游戏
查看>>
买卖股票的最佳时机 II
查看>>
分发饼干
查看>>
最低票价
查看>>
删列造序
查看>>
使括号有效的最少添加
查看>>
令牌放置
查看>>
回溯法思想
查看>>