缓存淘汰算法

缓存Caffeine之W-TinyLFU淘汰策略 我们常见的缓存是基于内存的缓存,但是单机的内存是有限的,不能让缓存数据撑爆内存,所有需要缓存淘汰机制。中大概说明了LRU的缓存淘汰机制,以及基于LRU的著名实现guava cache。除了LRU淘汰策略外,其是常见的还有FIFO以及LFU,只是说目前用的最多的是LRU。 阅读详情

缓存淘汰策略的实现
从本质上来说,缓存算法并没有好坏之分,只有是否适用当前的业务场景。因此根据不同的业务场景设置不同的缓存算法会使缓存命中率更高。

一、FIFO

FIFO(First in First out)先进先出。可以理解为是一种类似队列的算法实现
实现概念:最先进来的数据,被认为在未来被访问的概率也是最低的,因此,当规定空间用尽且需要放入新数据的时候,会优先淘汰最早进来的数据。
优点:没什么优点
缺点:算法逻辑设计所实现的缓存的命中率是比较低,没有任何额外逻辑能够尽可能的保证常用数据不被淘汰掉。

二、LRU

LRU(The Least Recently Used)最近最久未使用算法
实现概念:如果一个数据最近很少被访问到,那么被认为在未来被访问的概率也是最低的,当规定空间用尽且需要放入新数据的时候,会优先淘汰最久未被访问的数据。
优点:LRU很好的应对了针对于突发流量涌入的情况
缺点:对于周期性、偶发性的访问数据,有大概率可能造成缓存污染,置换出去了热点数据,把这些偶发性数据留下了,从而导致LRU的数据命中率急剧下降。
例如:当一个新剧热播,流量涌入,此剧的相关缓存登顶。但当新剧热度降低趋势变得平缓,其他周期性播出的综艺类节目涌入后将新剧缓存挤出, 这是我又访问新剧,则不得不又将新剧加入缓存,这显然不合时宜,因为新剧我已经访问过很多次了

三、LFU

LFU(The Least Frequently Used)最近很少使用算法,与LRU的区别在于LRU是以时间衡量,LFU是以时间段内的次数
实现概念:如果一个数据在一定时间内被访问的次数很低,那么被认为在未来被访问的概率也是最低的,当规定空间用尽且需要放入新数据的时候,会优先淘汰时间段内访问次数最低的数据。
针对以上的实现概念可以看出,它相较于LRU其多出了访问次数的概念,可以理解为当有缓存命中时其对应该缓存的计数器会+1。
优点:LFU有效的保护了缓存,因为是以次数为基准所以更加准确,针对于访问概率差不多时,缓存命中率较高。
缺点:LFU需要额外的空间来存储计数器来记录访问频次。针对于一个数据的洪峰。后来又衰弱,由于其频率过高导致其缓存很难失效。
例如:当一个新剧热播,流量涌入,此剧的相关缓存登顶。但当新剧热度降低趋势变得平缓,但是由于其缓存命中次数过高,导致其缓存一直处于缓存队列中,一直不会失效,直到剩余所有缓存计数都超过了此缓存才将其排出。

四、W-TinyLFU

W-TinyLFU(Window Tiny Least Frequently Used)是对LFU的的优化和加强
实现概念:当一个数据进来的时候,会进行筛选比较,进入W-LRU窗口队列,以此应对流量突增,经过淘汰后进入过滤器,通过访问访问频率判决是否进入缓存。如果一个数据最近被访问的次数很低,那么被认为在未来被访问的概率也是最低的,当规定空间用尽的时候,会优先淘汰最近访问次数很低的数据
它也存储一个次数,但它为什么是对LFU的优化呢,因为其存储的值为Count-Min Sketch,Count-Min Sketch是一个hash操作,它扩增为多个hash,在多个hash地址上记录缓存命中次数。这样多个hash会导致原来hash冲突的概率降低,当查询数据时,且从当多个hash取得数据,取出多个hash数据中取其中的最小值,来定义为此缓存的命中次数。也就是Count Min的含义所在。
当某一个key的的计数器大于触发值(k),则整体计数器会除以2,这样解决了LFU的缓存难失效问题。
这样我就可以使用申请固定的空间大小来存储缓存计数,就算是hash冲突也没关系,因为从概率上来说我获取的最小值是最准确的。
其类似于布隆过滤器的实现,可以将布隆过滤器看成一种概率性数据结构,本质是高效的插入和查询。相比于传统的List、Map其更高效、占用空间更少。其实现是当有变量加入布隆过滤器时,通过K个映射函数将变量映射为位图中的K个点,将K个点的值由0置为1.当有新的元素加入时候继续映射,就算是点位重复也没关系,该点位依旧为1.当查询时,元素交于K个点。
1、若k个位置有一个为0,则该元素肯定不在集合中
2、若K个位置全部为1,则该元素有可能存在集合中
优点:在空间和时间维度上拥有巨大优势。
缺点:误差率的存在,应用较少,只有Caffine使用此算法。

redis 提供 6种数据淘汰策略

通过maxmemory-policy设置策略:

  1. volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  4. allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  6. no-enviction(驱逐):禁止驱逐数据

redis 确定驱逐某个键值对后,会删除这个数据并将这个数据变更消息发布到本地(AOF 持久化)和从机(主从连接)
最好为Redis指定一种有效的数据淘汰策略以配合maxmemory设置,避免在内存使用满后发生写入失败的情况。

一般来说,推荐使用的策略是volatile-lru,并辨识Redis中保存的数据的重要性。对于那些重要的,绝对不能丢弃的数据(如配置类数据等),应不设置有效期,这样Redis就永远不会淘汰这些数据。对于那些相对不是那么重要的,并且能够热加载的数据(比如缓存最近登录的用户信息,当在Redis中找不到时,程序会去DB中读取),可以设置上有效期,这样在内存不够时Redis就会淘汰这部分数据。
配置方法:

maxmemory-policy volatile-lru   #默认是noeviction,即不进行数据淘汰
【Caffeine缓存】Caffeine缓存淘汰算法Window-TinyLFU详解 Caffeine的缓存淘汰策略是什么?Window-TinyLFU算法的原理是什么?是如何工作的?看完本文,相信你会得到答案。 阅读详情

相关推荐

阅读 redis 源码,学习缓存淘汰算法 W-TinyLFU

所有 IT 从业者都接触过缓存,一定了解基本工作原理,业界流行一句话:缓存就是万金油,哪里有问题哪里抹一下。那他的本质是什么呢? 上图代表从 cpu 到底层硬盘不同层次,不同模块的运行速度,上层多加一层 cache, 就能解决下层的速度慢的问题,这里的慢是指两点:IO 慢和 cpu 重复计算缓存中间结果 但是 cache 受限于成本,cache size 一般都是固定的,所以数据需要淘汰,由此引出一系列其它问题:缓存一致性、击穿、雪崩、污染等等,本文通过阅读 redis 源码,学习主流淘汰算..

jinggege_795的博客 5082

w-tinyLFU

缓存设计是个基础架构领域里的重要话题,本号之前也有谈论过相关话题,点击原文可以看之前的介绍。   近日,HighScalability网站刊登了一篇文章,由前Google工程师发明的W-TinyLFU——一种现代的缓存。那么,什么缓存设计能够被称作是“现代”的呢?   当数据的访问模式不随时间变化的时候,LFU的策略能够带来最佳的缓存命中率。然而LFU有两个缺点:首先,它需要给每个记录项维...

qq_25622107的博客 4134

内存缓存(cache)常用淘汰算法

简介缓存淘汰算法不可能实现的算法 OPT无脑算法 FIFO常见算法 LRU进阶算法 2Q进阶算法 LIRS参考资料 简介 在工程实践中,完成一个项目,通常可以分两步走: 产品实现,即完成产品的编码,实现产品需求,能够提供所需的功能; 产品优化,即对产品已有功能进行优化,可以是并发度、延时、qps等各个方面的优化; 当然,也可以两步合一步走,在代码实现的同时,就将产品优化考虑进去,但实际情况,产品往往要求优先提供功能,即该产品要具有某种能力,所以开发周期比较偏短,难以将深层次代码优化一起考虑进去,实际情.

Stay Hungry, Stay Foolish 5059

缺页中断——FIFO、LRU、OPT这三种置换算法

FIFO、LRU、OPT这三种置换算法的缺页次数2缺页中断  在请求分页系统中,可以通过查询页表中的状态位类确定所要访问的页面是否存在于内存中。每当所要访问的压面不在内存时,会产生一次缺页中断,此时操作系统会根据页表中的外存地址在外存中找到所缺的一页,将其调入内存。

smile4lee的博客 9万+

LRU缓存淘汰算法

 来源公众号:算法面试题 简介   LRU,最近最少使用算法,即当要对数据进行淘汰时,先将最近最久未使用的数据淘汰(亦说最近最久未使用算法),是一种缓存淘汰算法。     意义:大家知道计算机的内存是有限的,当我们对一些数据一直缓存而不淘汰的话,那么内存总会被占满的,特别是服务器,造成的后果是可怕的。   应用场景:内存的页面淘汰、站内搜索关键字的缓存淘汰(详见:《如何应对...

Great_Eagle的博客 2879

LRU算法–缓存淘汰算法

LRU算法–缓存淘汰算法目录LRU算法缓存淘汰算法目录 什么是 LRU LRU 算法思想 为什么需要页面置换算法 分页原理图 假设使用 FIFO 先进先出 实现页面置换算法 LRU 算法原理图 使用双向链表实现LRU算法 Clock算法是公认的很好的近似LRU的算法1. 什么是 LRULRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是

多多说happy的博客 2428

Redis缓存淘汰算法详解

LRU(Least Recently Used,最近最少使用)缓存淘汰算法是一种常用的页面置换算法,用于管理缓存中的数据,确保最近最少使用的数据被优先淘汰。当缓存达到容量上限时,会删除链表尾部的节点,即最近最少使用的节点。为了获得更好的性能,特别是在需要频繁更新频率和根据频率进行排序时,可以考虑使用更复杂的数据结构,如平衡树或自定义的双向链表与哈希表的组合。综上所述,Redis的缓存淘汰算法为Redis的内存管理提供了灵活且强大的支持,通过合理的配置和调整,可以显著提高缓存的效率和性能。

wendao76的专栏 2182

缓存和Redis 淘汰算法总结

本文系统梳理了缓存淘汰算法,从基本概念到Redis实现进行了多维度解析。首先阐述了淘汰算法的本质是解决有限内存与无限数据的矛盾,核心目标是提高命中率。随后对比了FIFO、LRU、LFU等经典算法,重点分析了Redis的8种淘汰策略及其实现机制,包括近似LRU的采样淘汰和LFU的衰减机制。通过业务场景对比指出:LRU适合热点快速变化的场景,LFU更适用于稳定热点;Redis的allkeys-lru是通用推荐方案。文章最后提供了监控指标和调优建议,强调应根据业务访问模式选择算法,并通过命中率验证策略有效性。全文

几十年资深高级架构师,技术专家的技术笔记。专注C、Java、Python、微服务、云原生、AI工程化及高并发系统分布式架构实战,分享源码剖析、性能调优与架构治理经验。 995

常见的缓存淘汰算法

FIFO、LRU、LFU 和 WindowTinyLFU 是常见的缓存淘汰算法,用于决定在缓存容量不足时应该如何选择要淘汰的数据。

刘皇叔说Java的博客 1924

如何实现LRU缓存淘汰算法?

在计算机科学中,LRU(Least Recently Used)缓存淘汰算法是一种常用的策略,用于管理有限的缓存空间。当缓存已满时,LRU 算法会淘汰最近最少使用的数据,以腾出空间来存储新的数据。本文将详细介绍如何实现 LRU 缓存淘汰算法。LRU 算法的核心思想是:当需要淘汰数据时,选择最近最少使用的数据进行淘汰。这意味着,最近被访问的数据在缓存中的生存时间最长,而长时间未被访问的数据则更容易被淘汰。例如,假设有一个缓存空间可以存储三个数据项。一开始,缓存为空。当依次访问数据项 A、B、C 时,缓存中存储

yonggeit的博客 3242

LDPC码介绍:基础&编码&译码

本博客介绍了LDPC码的基本原理,其中包括校验矩阵的构造、Tanner 图和编译码的基础知识。

渺小的颗星的博客 4309

Redis缓存淘汰算法——LRU

LRU算法原理分析,手写LRU示例,redis中的lru

m0_62909831的博客 2276

别再手动画柜子了!用EPLAN导入STEP模型,5分钟搞定一个标准机柜

本文详细介绍了如何利用EPLAN Pro Panel的3D布局功能,快速将STEP模型转化为智能机柜宏,大幅提升电气工程设计效率。通过实战步骤解析,包括模型导入、智能解析、安装面定义及拼柜技巧,帮助工程师5分钟内完成标准机柜设计,避免传统手动建模的尺寸偏差问题。

weixin_26875109的博客 435

缓存淘汰算法之LRU

1.LRU1.1.原理 LRU(Leastrecentlyused,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。 1.2.实现 最常见的实现是使用一个链表保存缓存数据,详细算法实现如下: 1.新数据插入到链表头部; 2.每当缓存命中(即缓存数据被访问),则将数据移到链表头部; 3.当链表满...

weixin_30596165的博客 4525

Python自然语言处理 NLTK 库用法入门教程【经典】

@本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 本文实例讲述了Python自然语言处理 NLTK 库用法。分享给大家供大家参考,具体如下: 在这篇文章中,我们将基于 Python 讨论自然语言处理(NLP)。本教程将会使用 Python NLTK 库。NLTK 是一个当下流行的,用于自然语言处理的 Python 库。 那么 NLP 到底是什么?学习 NLP 能带来什么好处? ...

python函数基础教程 1万+

Springer期刊LaTeX模板中参考文献格式选择与编译错误的快速修复指南

本文针对Springer期刊LaTeX模板中参考文献编译后显示问号的常见问题,提供了快速修复指南。核心在于正确选择并配置与期刊匹配的参考文献格式文件(.bst),并执行标准的四步编译流程。文章详细解释了问题根源,并给出了从查找正确.bst文件到修改代码、执行编译的完整解决方案,帮助作者高效解决投稿中的技术障碍。

weixin_29266007的博客 401

ARC缓存淘汰算法

3. 如果命中,且LFU链表中没有,则将数据放入LFU链表的头部,所有LRU链表中的数据都必须至少被访问两次才会进入LFU链表。4. 如果此时缓存满了,则从LRU链表中淘汰链表尾部的数据,将数据的key放入LRU链表对应的ghost list。在这种情况下,LRU链表的长度将会被增加1,并将命中的数据key从ghost list中移除,放入LRU链表的头部。2. 在缓存中查找客户端需要访问的数据, 如果没有命中,表示缓存穿透,将需要访问的数据 从磁盘中取出,放到LRU链表的头部。

Revendell的博客 636

VisualStudio2022配置CGAL

vs2022和vs2017安装配置boost没什么区别,只需要注意boost的msvc得是14.3的,这玩意跟visualstudio版本挂钩的。压缩包解压,得到下面这两文件,然后把auxiliary这个文件挪到CGAL-5.6里面就行了。我用cgal读取一个stl模型,并输出相关信息(想可视化的话需要安装Qt,不想装Qt也可以装VTK)然后下载下面这两个压缩包。照着下面的截图填就完事了。

weixin_43850909的博客 1171

一文搞懂常用缓存淘汰算法

缓存淘汰算法用于在有限内存中优化数据保留策略。FIFO(先进先出)算法按进入顺序淘汰最早数据,实现简单但无法适应访问模式变化,适用于数据访问均匀的场景。LRU(最近最少使用)算法优先淘汰最久未访问数据,通过哈希表+双向链表实现高效操作,适合存在热点数据的场景。两种算法各有优劣:FIFO实现复杂度低但命中率不稳定,LRU能更好适应访问模式但实现较复杂。根据具体场景选择合适的算法可有效提升缓存效率。

脱发是不可能的博客 1181

树莓派5新手必看:保姆级ibus中文输入法安装与配置全流程(含.bashrc设置避坑)

本文详细介绍了在树莓派5上安装和配置ibus中文输入法的完整流程,包括系统环境准备、ibus框架安装、图形界面配置及常见问题解决方案。通过清晰的步骤说明和避坑指南,帮助新手快速实现中文输入功能,提升开发效率。

weixin_29159441的博客 527

《一》:LBE,VR 大空间系列——场景环境需求解析

当前,大量 VR 体验活动在室内场地开展。因此,对于场地照明有特定要求:除天花板外,场地的所有表面均需有照明覆盖。这是为了保证玩家无论处于场地的哪个位置,地面与墙面都不会出现明显的影子。场地内不建议安装射灯或高强度的点光源,若已安装此类灯具,需使用柔光板进行遮盖。此外,要避免在阳光下使用 VR 设备台。参考图(请忽略其中Maker标签)

unitygroup的博客 944

手写缓存之Lru缓存淘汰算法

随着近些年大型电商应用(例如京东、阿里巴巴等)的迅速发展,本地缓存和分布式缓存相关技术被大量的应用。那么这些缓存的核心算法都有哪些呢,上次给大家手写了FIFO先进先出算法的实现过程,感兴趣的可以通过手写缓存之FIFO先进先出算法来进行学习和回顾。那么今天给大家介绍的是Lru淘汰缓存算法。手写缓存之FIFO先进先出算法 Lru算法是近些年来一些大型电商平台比较推荐的一种算法,其原理是在我们的缓存满了以后按照访问数量来进行淘汰,优先淘汰那些访问次数比较低的缓存数据,大家来看下面的示例图来加深理解。 大家可以从图

m0_72106802的博客 1083

DCM07-诊断服务EcuReset ($11 )的配置和实现

文章目录1 诊断服务EcuReset ($11 )1.1 概述1.2 诊断模式声明组1.3 代码实现1.4 配置参数 传送门 ==>> AutoSAR实战系列300讲「糖果Autosar」总目录 1 诊断服务EcuReset ($11 ) 1.1 概述 该服务实现了 ECU 内的复位功能,协议的具体理论讲解请参考「FlashBootloader03【电控单元复位服务($11)】」。在接收到UDS 服务 0x11 的请求时,DCM 模块应触发 ModeDeclarationGroupPrototy

2064

三种常用缓存淘汰算法

概述 计算机读取文件(数据库)的速度相对于读取内存的数据来说,效率要低得多,因此常用缓存来提高访问效率,而内存相比较于硬盘要小的多,为了缓存更有价值的数据,淘汰算法就显得尤为重要。 FIFO 先进先出,类似于队列,在数据结构上使用队列来实现 1.新访问的数据加入FIFO队列尾部,数据在FIFO队列顺序移动 2.淘汰FIFO头部的数据 LRU 最近最少使用,如果数据最近被访问,将来访问的机率也高,...

qq_33261885的博客 1400

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: Spring是如何解决的循环依赖
下一篇: linux 防火墙命令(基于centos)
huapro.vip
博客等级 码龄15年 36粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值