缓存淘汰算法

一、SLRU

在这里插入图片描述
可以这么理解:先进入淘汰段,淘汰段也是一个LRU算法,当淘汰段满了,移除最早进来的,如果有重复的就会进入保护段,当保护段满了,进了新的元素,会吧数据挤到淘汰段里面去。

二、近似计数器

在这里插入图片描述
在这里插入图片描述

对一个数进行多次Hash运行,得到对应的下标位置,然后将下标位置加1,当统计某个key的出现次数时,只需要找到他所有的下标位置所对应的数,取出最小的那一个。

在这里插入图片描述

三、window-Tiny-LFU

在这里插入图片描述
在这里插入图片描述
元素先进入窗口缓存,窗口缓存数据比较少,使用LRU,被挤出的元素,和淘汰段LRU的元素比对,怎么比对,从LRU最容易淘汰的元素比较,然后找到这个元素在布隆过滤最少的数值,对比。如果输了,就淘汰,赢了,就进入淘汰段。

在这里插入图片描述

在这里插入图片描述

### LRU缓存淘汰算法的实现与原理 #### 工作原理 LRU(Least Recently Used)缓存淘汰算法的核心思想是通过记录数据项的访问时间,优先保留最近被频繁访问的数据项,而淘汰那些长时间未被访问的数据项。这种策略基于一种假设:近期经常使用的数据在未来也更有可能被再次使用[^1]。 为了支持这一功能,通常需要维护两个主要结构: 1. **哈希表**:用于快速查找某个键是否存在以及其对应的值。 2. **双向链表**:用于按访问顺序排列节点,最新的访问放在头部,最久未访问的留在尾部。 每次访问一个数据项时,都会将其移动到链表头位置;当缓存达到容量上限并需新增数据时,则移除链表尾部的节点作为被淘汰的对象[^4]。 --- #### 实现方法 以下是 Python 中的一种典型实现方式: ```python from collections import OrderedDict class LRUCache: def __init__(self, capacity: int): self.cache = OrderedDict() # 使用有序字典模拟缓存 self.capacity = capacity # 定义最大容量 def get(self, key: int) -> int: if key not in self.cache: return -1 # 如果不存在该key,返回-1 else: self.cache.move_to_end(key) # 将访问过的key移到最后(表示最新) return self.cache[key] def put(self, key: int, value: int) -> None: if key in self.cache: self.cache.move_to_end(key) # 更新已有key的位置至最后 self.cache[key] = value # 插入新值 if len(self.cache) > self.capacity: self.cache.popitem(last=False) # 超过容量则删除最早加入的元素 ``` 上述代码利用 `OrderedDict` 来简化操作逻辑,其中 `move_to_end()` 方法负责调整访问频率较高的项目到队列前端,从而满足 LRU 的需求[^3]。 --- #### 运行流程分析 1. 初始化阶段定义好缓存的最大容量; 2. 对于读取请求 (`get`) ,若命中目标键值对,则更新此条目为“最近使用”,否则报告失败; 3. 针对写入命令 (`put`) ,先判断当前是否有重复录入情况发生——若有只需刷新对应数值即可完成任务;如果没有匹配成功的话再考虑是否超出限额限制,一旦突破界限便要驱逐掉那个距离现在最远的一笔交易记录以便腾出空间接纳新人进来[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信仰_273993243

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值