【cache】浅析四种常用的缓存淘汰算法 FIFO/LRU/LFU/W-TinyLFU
本文浅析淘汰策略与工作中结合使用、选取,并非针对算法本身如何实现的
文章目录
- FIFO
- LFU
- LRU
- W-TinyLFU
- 实践与优化
- 监控与调整
FIFO
first input first output , 先进先出,即最早存入的元素最先取出,
典型数据结构代表:Queue (队列)
优点:
是最简单直观的一种策略,
一般适用于随机访问、缓存的元素都是随机性或频率大致相等的;对于不常变化的数据,如配置文件、静态资源等,FIFO(先进先出)可能是一个简单且有效的选择。这些数据的访问频率通常较低,且不需要频繁更新,FIFO能确保缓存中的旧数据被定期清理,为新数据腾出空间。
缺点:对于访问频率高且经常变化的动态数据,如热点新闻等则不适用

LFU
least frequently used , 最不经常使用,即把最不经常使用的数据淘汰掉,粗略一听 是很符合逻辑的, 它可以很好的命中高访问频率数据;
我们可以假设一个场景,比如9:00秒杀手机,9:05秒杀笔记本,9:10正常开售平板,那么之前秒杀缓存的数据就显得很苍白无力,它频率确实是非常高,但由于后续业务变更(访问模式转变),变得不再那么需要访问。
LFU也能够有效的保护缓存,相对场景来说,比LRU有更好的缓存命中率。由于是以次数为基准,因此更加准确,天然能有效的保证和提升命中率。
所以LFU 优缺点总结如下:
优点:平稳业务场景来说,比LRU有更好的缓存命中率。由于是以次数为基准,因此更加准确,能有效的保证和提升命中率
缺点:由于LFU须要记录数据的访问频率,所以需要额外的空间;当访问模式改变(业务转变)的时候,算法命中率会急剧降低,这也是他最大弊端。
LRU
Least Recently Used,即最近最少使用,LRU认为 最近访问的数据 在接下来访问的频率也会更高,在平常业务中 LRU可以覆盖较广的范围
典型代表:mysql 缓冲池
mysql的缓冲池就是使用的LRU淘汰算法
我们可以看看一个简单的LRU实现方式:
来自jsonpath包下的源码: 如果值存在 就将它置顶

removeThenAddKey 方法如下:
private void removeThenAddKey(String key) {this.lock.lock();try {this.queue.removeFirstOccurrence(key);this.queue.addFirst(key);} finally {this.lock.unlock();}}
W-TinyLFU
减少了LFU的内存占用,同时结合了LFU和LRU的特点,是一种比较不错的淘汰算法
典型容器代表:java中的Caffeine
maven:
<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><!-- 检查是否有最新版本 --><version>3.1.8</version></dependency>
优点结合了LRU和LFU的特点,
缺点则是算法难度本身比较复杂 ,一般使用写好的开源组件,自己实现一个优秀的算法还是比较困难的
实践与优化
监控与调整
性能监控:定期监控缓存系统的性能指标,如命中率、缓存大小、访问延迟等,以便及时发现并解决问题。
策略调整:根据业务需求和监控结果,适时调整缓存淘汰策略。例如,在访问模式发生显著变化时,可以考虑切换淘汰策略或调整策略参数。
缓存预热:在系统启动或数据更新后,主动对缓存进行预热,即提前将预计会被频繁访问的数据加载到缓存中。这可以显著提高缓存命中率,减少数据访问延迟。
相关文章:
【cache】浅析四种常用的缓存淘汰算法 FIFO/LRU/LFU/W-TinyLFU
本文浅析淘汰策略与工作中结合使用、选取,并非针对算法本身如何实现的 文章目录 FIFOLFULRUW-TinyLFU实践与优化监控与调整 FIFO first input first output , 先进先出,即最早存入的元素最先取出, 典型数据结构代表:…...
STM32的DMA技术介绍
DMA(Direct Memory Access,直接内存访问) 是一种允许外设直接与系统内存进行数据传输,而无需经过CPU的技术。在STM32微控制器中,DMA技术极大地提高了数据传输效率,降低了CPU的负担,从而提升系统…...
C++11 多线程编程-小白零基础到手撕线程池
提示:文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问: 本文目标: 一、背景 来源于b站视频 C11 多线程编程-小白零基础到手撕线程池 学习来源:https://www.bilibili.com/video/BV1d841117SH/?p2&spm_id_f…...
智源研究院与百度达成战略合作 共建AI产研协同生态
2024年9月24日,北京智源人工智能研究院(简称“智源研究院”)与北京百度网讯科技有限公司(简称“百度”)正式签署战略合作协议,双方将充分发挥互补优势,在大模型等领域展开深度合作,共…...
Flask-SQLAlchemy:在Flask应用中优雅地操作数据库
在Python的Web开发领域,Flask是一个备受欢迎的轻量级Web框架,它以简洁、灵活而著称。而当我们需要在Flask应用中与数据库进行交互时,Flask-SQLAlchemy就成为了一个强大而便捷的工具。它将Flask的简洁性与SQLAlchemy的强大数据库抽象能力完美结…...
智能巡检机器人 数据库
智能巡检机器人AI智能识别。无需人工。只需后台监控结果即可!...
Spring AOP异步操作实现
在Spring框架中,AOP(面向切面编程)提供了一种非常灵活的方式来增强应用程序的功能。异步操作是现代应用程序中常见的需求,尤其是在处理耗时任务时,它可以帮助我们提高应用程序的响应性和吞吐量。Spring提供了一种简单的…...
【2006.07】UMLS工具——MetaMap原理深度解析
文献:《MetaMap: Mapping Text to the UMLS Metathesaurus》2006 年 7 月 14 日 https://lhncbc.nlm.nih.gov/ii/information/Papers/metamap06.pdf MetaMap:将文本映射到 UMLS 元数据库 总结 解决的问题 自动概念映射问题:解决如何将文本…...
ros2 colcon build 构建后,install中的local_setup.bash 和setup.bash有什么区别
功能概述 在 ROS2 中,colcon build是用于构建软件包的工具。构建完成后会生成install文件夹,其中的setup.bash和local_setup.bash文件都与环境设置相关,但存在一些区别。setup.bash 作用范围 setup.bash文件用于设置整个工作空间的环境变量。…...
Thymeleaf基础语法
Thymeleaf 是一种用于 Web 和非 Web 环境的现代服务器端 Java 模板引擎。它能够处理 HTML、XML、JavaScript、CSS 甚至纯文本。以下是 Thymeleaf 的一些基础语法: 1. 变量表达式 <!-- 显示变量的值 --> <p th:text"${name}">Default Name&l…...
spring cloud alibaba学习路线
以下是一条学习Spring Cloud Alibaba的路线: 一、基础前置知识 1. Java基础 熟练掌握Java语言特性,包括面向对象编程、集合框架、多线程等知识。 2. Spring和Spring Boot基础深入理解Spring框架,如依赖注入(DI)、控…...
基于 Seq2Seq 的中英文翻译项目(pytorch)
项目简介 本项目旨在使用 PyTorch 构建一个基于 Seq2Seq(编码器-解码器架构)的中英文翻译模型。我们将使用双语句子对的数据进行训练,最终实现一个能够将英文句子翻译为中文的模型。项目的主要步骤包括: 数据预处理:从数据集中提取英文和中文句子,并进行初步清洗和保存。…...
部标主动安全(ADAS+DMS)对接说明
1.前言 上一篇介绍了部标(JT/T1078)流媒体对接说明,这里说一下如何对接主动安全附件服务器。 流媒体的对接主要牵扯到4个方面: (1)平台端:业务端系统,包含前端呈现界面。 &#x…...
C++ STL(1)迭代器
文章目录 一、迭代器详解1、迭代器的定义与功能2、迭代器类型3、示例4、迭代器失效4.1、vector 迭代器失效分析4.2、list 迭代器失效分析4.3、set 与 map 迭代器失效分析 5、总结 前言: 在C标准模板库(STL)中,迭代器是一个核心概念…...
uview表单校验不生效问题
最近几次使用发现有时候会不生效,具体还没排查出来什么原因,先记录一下解决使用方法 <u--formlabelPosition"top"labelWidth"auto":model"form":rules"rules"ref"uForm" ><view class"…...
前端开发设计模式——单例模式
目录 一、单例模式的定义和特点: 1.定义: 2.特点: 二、单例模式的实现方式: 1.立即执行函数结合闭包实现: 2.ES6类实现: 三、单例模式的应用场景 1.全局状态管理: 2.日志记录器: …...
行情叠加量化,占据市场先机!
A股久违的3000点,最近都没有更新,现在终于对我们的市场又来点信息。相信在座的朋友这几天都是喜笑颜开,对A股又充满信心。当前行情好起来了,很多朋友又开始重回市场,研究股票学习量化,今天我们给大家重温下…...
大厂面试真题-ConcurrentHashMap怎么保证的线程安全?
ConcurrentHashMap是Java中的一个线程安全的哈希表实现,它通过一系列精妙的机制来保证线程安全。以下是ConcurrentHashMap保证线程安全的主要方式: 分段锁(Segment Locking,Java 1.8之前): 在Java 1.8之前的…...
【RabbitMQ】消息堆积、推拉模式
消息堆积 原因 消息堆积是指在消息队列中,待处理的消息数量超过了消费者处理能力,导致消息在队列中不断堆积的现象。通常有以下几种原因: 消息生产过快:在高流量或者高负载的情况下,生产者以极高的速率发送消息&…...
MySQL常用SQL语句(持续更新中)
文章目录 数据库相关表相关索引相关添加索引 编码相关系统变量相关 收录一些经常用到的sql 数据库相关 建数据库 CREATE DATABASE [IF NOT EXISTS] <数据库名> [[DEFAULT] CHARACTER SET <字符集名>] [[DEFAULT] COLLATE <校对规则名>];例如: C…...
混元图像3.0对话P图技术解析:本地化可控生成新范式
1. 项目概述:这不是又一个“AI修图”功能,而是本地化P图工作流的临界点“腾讯混元图像3.0图生图模型上线,元宝也支持对话P图啦!”——这句话在科技圈刷屏那天,我正用本地部署的Stable Diffusion给客户改第十版电商主图…...
利用taotoken模型广场为ai应用快速进行模型选型与测试
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用Taotoken模型广场为AI应用快速进行模型选型与测试 在构建一个需要集成多种AI能力的应用时,开发者面临的首要挑战往…...
使用Taotoken后如何清晰观测API用量与成本变化
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Taotoken后如何清晰观测API用量与成本变化 对于团队管理者或开发者而言,将大模型能力集成到产品中后,资…...
2025届最火的六大AI辅助写作网站解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 这些年,“论文一键生成”类工具可多了,吸引着有写作压力的学生&#…...
Go语言AI Agent框架goclaw:模块化架构与技能系统实战
1. 项目概述:一个用Go语言构建的现代化AI Agent框架如果你正在寻找一个功能全面、架构清晰,并且能让你快速上手构建智能助理的Go语言框架,那么goclaw(狗爪)绝对值得你花时间研究。我最近在评估几个开源的AI Agent框架&…...
从习题到实战:掌握随机变量及其分布的5个核心场景
1. 从杯子分球看离散型随机变量 想象你面前有4个空杯子和3个乒乓球,随手把球扔进杯子里会发生什么?这个看似简单的游戏,其实是理解离散型随机变量的绝佳案例。X代表"杯子中球的最大个数",它可能取值为1、2、3——这就是…...
从自由建模到精确设计:CAD_Sketcher如何为Blender带来工程级草图绘制能力
从自由建模到精确设计:CAD_Sketcher如何为Blender带来工程级草图绘制能力 【免费下载链接】CAD_Sketcher Constraint-based geometry sketcher for blender 项目地址: https://gitcode.com/gh_mirrors/ca/CAD_Sketcher 你是否曾在使用Blender进行机械设计时&…...
前端实战:用HTML/CSS/JS打造交互式生日蛋糕网页应用
1. 项目概述:一个用代码烘焙的生日惊喜最近给朋友准备生日礼物,不想再走寻常路,琢磨着送点特别的。作为一个整天和代码打交道的人,我决定用最熟悉的工具——HTML、CSS和JavaScript——亲手“烘焙”一个数字生日蛋糕。这个项目“Re…...
从零构建现代化前端CLI工具:以martmart-cli为例的工程实践
1. 项目概述:一个为MartMart设计的现代化CLI工具 如果你是一名前端开发者,或者正在参与一个基于现代JavaScript框架(比如React、Vue)的项目,那么你一定对“脚手架”和“命令行工具”这两个词不陌生。从早期的 create-…...
现代Web应用特性管理:从概念到工程实践
1. 项目概述:一个面向现代Web开发的特性管理工具 如果你和我一样,长期在Web应用开发的一线摸爬滚打,那你一定对“特性开关”这个概念不陌生。简单来说,它就像你家里电灯的总闸,可以随时控制某个功能是“亮”还是“灭”…...
