缓存系列文章--3.缓存常用更新策略对比(一致性)。

HashMap实现LRU(最近最少使用)缓存更新算法 最近阿里巴巴电话面试被问到了如何使用固定容量的HashMap,实现LRU算法。当时一脸懵逼,平时用HashMap也就用来快速存取数据而已,容量都是不限的。 想了半天,想到对node节点进行扩展,加入引用计数,然后到达指定容量后,删除引用计数最少的。 面试官质疑这样效率太低了,能不能优化下。 想到删除时,需要遍历所有元素,代价为O(n),太大了。想到可以用最小堆来进行筛选。被问到建堆的节点值是什么,... 阅读详情

转载请注明出处哈:http://carlosfu.iteye.com/blog/2269678


 一、缓存的几种更新策略

 

  从下面的表格看,缓存的更新策略大致分为三种,本文将从一致性和维护成本两个方面对于三种缓存更新策略进行简要说明,因为这些东西比较理论和抽象,如哪里说得不对,欢迎拍砖。

   

  注:

  (1) 一致性:缓存和真实数据源(例如mysql, hbase, elasticsearch等等)是否存在一段时间数据的不一致。

  (2) 维护成本: 开发人员的开发和维护成本。

策略一致性维护成本
LRU/LIRS/FIFO算法剔除最差低
超时剔除较差较低
主动更新强高

 

二、LRU/LFU/FIFO算法剔除

 

1. 使用场景:

    通常用于缓存使用量超过了预设的最大值时候(缓存空间不够),如何对现有的数据进行清理。例如FIFO会把最新进入缓存的数据清理出去, LRU会把最近最少使用的数据清理掉。

例如:Memcache使用的是LRU,具体Memcache如何实现的,这里就不在赘述了,网上资料多的是。

例如:Redis使用maxmemory-policy这个配置作为内存最大值后对于数据的更新策略。

配置名含义默认值
maxmemory最大可用内存不使用该配置,也就对内存使用无限制
maxmemory-policy内存不够时,淘汰策略volatile-lru
  • volatile-lru -> 用lru算法删除过期的键值
  • allkeys-lru -> 用lru算法删除所有键值
  • volatile-random -> 随机删除过期的键值
  • allkeys-random -> 随机删除任何键值
  • volatile-ttl -> 删除最近要到期的键值
  • noeviction -> 不删除键,只返回一个错误

 

2. 常用算法:

这里不再赘述,常用的算法有如下几种:

FIFO[first in first out] 

LFU[Less Frequently Used] 

LRU[Least Recently used] 

 

 

3. 一致性

可以想象,要清理哪些数据,不是由开发者决定(只能决定大致方向:策略算法),数据的一致性是最差的。

 

4. 维护成本

这些算法不需要开发者自己来实现,通常只需要配置最大maxmemory和对应的策略即可。

开发者只需要有这个东西,知道是什么意思,选择自己需要的算法,算法的实现是由缓存服务器实现的。

 

 

三、超时剔除

 

1. 使用场景:

   就是我们通常做的缓存数据过期时间设置,例如redis和memcache都提供了expire这样的API,来设置K-V的过期时间。

   一般来说业务可以容忍一段时间内(例如一个小时),缓存数据和真实数据(例如:mysql, hbase等等)数据不一致(一般来说,缓存可以提高访问速度降低后端负载),那么我们可以对一个数据设置一定时间的过期时间,在数据过期后,再从真实数据源获取数据,重新放到缓存中,继续设置过期时间。

   例如: 一个视频的描述信息,我们可以容忍一个小时内数据不一致,但是涉及到钱的方面,如果不一致可想而知。

   

2. 一致性:

    一段时间内(取决于过期时间)存在数据一致性问题,即缓存数据和真实数据源数据不一致。

 

3. 维护成本

      用户的维护成本不是很高,只需要设置expire过期时间即可(前提是你的业务允许这段时间可能发生的数据不一致)。

 

四、主动更新

 

1. 使用背景:

   业务对于数据的一致性要求很高,需要在真实数据更新后,立即更新缓存数据。

   具体做法:例如可以利用消息系统或者其他方式(比如数据库触发器,或者其他数据源的listener机制来完成)通知缓存更新。

 

2.  一致性:

   可以想象一致性最高(几乎接近强一致),但是有个问题:如果主动更新发生了问题,那么这条数据很可能很长时间不会更新了(所以可以结合超时剔除一起使用,下面最佳实践会说到)

 

3. 维护成本:

   相当高,用户需要自己来完成更新(需要一定量的代码,从某种程度上加大了系统的复杂性),需要自己检查数据是否真的更新了之类的工作。

 

五、最佳实践

    其实最佳实践就是组合使用:

    1. 一般来说我们都需要配置超过最大缓存后的更新策略(例如:LRU)以及最大内存,这样可以保证系统可以继续运行(例如redis可能存在OOM问题)(极端情况下除外,数据一致性要求极高)。

    2. 一般来说我们需要把超时剔除和主动更新组合使用,那样即使主动更新出了问题,也能保证过期时间后,缓存就被清除了(不至于永远都是脏数据)。

苹果成熟度检测系统实战:从YOLO训练到前后端分离部署 目标检测是计算机视觉的核心任务,通过YOLO等单阶段算法可在图像中实时定位并分类目标,其原理基于深度卷积神经网络直接回归边界框与类别概率。然而,模型在笔记本上能跑通,并不代表能支撑一套可用的Web系统。从算法到产品,往往需要结合前后端分离架构,实现图片上传、GPU推理、结果存储与可视化展示等一系列工程化设计。本文以苹果成熟度检测为切入点,完整拆解YOLO系列模型选型与训练细节、SpringBoot后端服务构建、Vue3前端交互开发,以及如何接入DeepSeek大模型生成智能分析报告,打通从数据标注到系统上线 阅读详情

相关推荐

Python Flask的缓存更新策略

本文旨在为Flask开发者提供全面的缓存更新策略指南,涵盖从基础概念到高级实现的所有内容。我们将重点讨论在Flask应用中如何有效管理和更新缓存,以确保数据一致性和系统性能。文章首先介绍缓存的基本概念和Flask中的缓存机制,然后深入探讨各种缓存更新策略,接着通过实际案例展示实现方法,最后讨论相关工具和未来趋势。缓存(Cache): 临时存储数据的快速访问层,用于减少对慢速数据源(如数据库)的访问缓存命中(Cache Hit): 请求的数据存在于缓存中缓存未命中(Cache Miss)

AI Python 编程之道的博客 1386

【常见缓存算法原理及其C++实现】LRU篇(包含过期时间详解)

一、缓存算法简介 (一)缓存算法应用背景 缓存的应用场景和范围十分广泛,下面给出其十分常见的两种应用背景: 首先,在操作系统内部,由于内存资源十分有限,而每个进程又都希望独享一块很大的内存空间。所以诞生了一种“虚拟内存”机制,它将进程的一部分内容暂留在磁盘中,在需要时再进行数据交换将其放入内存,这个过程就需要用到缓存算法机制进行置换。 其次,对于各类应用项目开发而言,在巨大的数据量面前,Catch 是不可或缺的。因为无论是针对本地端的浏览器缓存,还...

saxon_li的博客 1万+

OCC入门指南:从零开始掌握Open CASCADE Technology

本文是Open CASCADE Technology(OCC)的入门指南,详细介绍了这款开源C++三维几何建模内核的核心概念与价值。内容涵盖从零开始搭建开发环境、编写第一个显示立方体的程序,到深入理解其几何与拓扑核心、掌握Draw测试工具及Handle内存管理等关键编程范式,旨在帮助开发者快速掌握这一工业级CAD/CAE/CAM应用开发利器。

java5的博客 1275

关于常见的几种缓存算法

一次偶然的交流机会,被问到关于缓存算法的问题,结果当场蒙圈,同时也暴露了自己的不足; 结合目前的理解,也就只知道软件会结合http header头去做一些处理来控制缓存过期时间,当磁盘满后,会删除最冷的数据,至于什么是冷? 是最远的还是次数最少的? 看完下面是最常用的一些算法就会得出结论: 1. 缓存相关概念 缓存 : 凡是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构

农民工 1万+

问题:dpkg-deb: error: paste subprocess was killed by signal (Broken pipe)

 1. 问题:Ubuntu安装软件的过程中出现依赖项的问题 “E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).” 按照指示执行如下两条命令都没有解决问题。 sudo apt-get -f install sudo apt-get --fix-broken ...

gloria_littlechi的博客 2万+

ThinkBook 16 2024 Ubuntu驱动全攻略:从无线网卡到触控板

本文详细介绍了ThinkBook 16 2024在Ubuntu系统下的驱动问题解决方案,涵盖无线网卡、蓝牙、显卡和触控板等关键硬件的驱动修复步骤。通过具体命令和配置指南,帮助用户快速解决兼容性问题,提升Ubuntu在ThinkBook上的使用体验。

weixin_29200741的博客 829

常见缓存算法汇总

常见缓存算法汇总:FIFO,LRU,LFU,Random

2301_80926085的博客 2901

VLA强化学习训练:π0到π0.5的技术优化与实现

视觉语言动作模型(VLA)作为多模态强化学习的重要分支,通过融合视觉、语言和环境状态数据实现智能决策。其核心技术在于多模态特征融合与动作空间设计,其中PPO算法因其出色的训练稳定性成为首选方案。在工程实践中,延迟补偿机制和课程学习设计能显著提升模型性能,如在四足机器人项目中使避障成功率提升47%。针对实际部署中的性能下降问题,需要特别关注硬件量化参数和控制频率一致性等关键因素。本文通过π0与π0.5版本的对比实验,详细解析了VLA模型在机械臂控制等具身智能场景中的优化路径。

weixin_29041767的博客 246

【技术晨读】缓存更新的套路

看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。于是,在缓存中的数据还是老的数据,导致缓存中的数据是脏的,而且还一直这样脏下去了。 我不知道为什么这么多人用的都是这

simonGeek的专栏 1430

Allegro模块复用:从原理图到PCB的完整流程与关键细节

本文详细介绍了Allegro模块复用从原理图到PCB的完整流程与关键细节,包括DSN和MDD文件的创建、模块调用的实战技巧以及双向同步与版本控制方法。通过标准化处理和高级复用技巧,能显著提升PCB设计效率,减少重复工作时间。适用于智能硬件和工业控制等领域的工程师。

weixin_30252709的博客 332

虎符+红明谷+ctfshow渔人杯赛后复现

目录标题虎符CTFWeb-签到MISC-你会日志分析吗红明谷CTFWeb-write_shellMISC-我的心是冰冰的ctfshow渔人杯签到抽奖感受下气氛神仙姐姐阿拉丁迷飘啊飘简单二维码我跟你拼了 虎符CTF Web-签到 参考详细分析PHP源代码后门事件及其供应链安全启示 根据文章提示,添加恶意请求头 User-Agentt: zerodiumphpinfo(); 可以看到phpinfo内容 继续构造,查看根目录下的文件 User-Agentt: zerodiumsystem('ls /');

Atkx's Blog 1984

缓存系列文章--3.缓存常用更新策略对比(一致性)

转载请注明出处:http://carlosfu.iteye.com/blog/2269678 一、缓存的几种更新策略     从下面的表格看,缓存的更新策略大概氛围三种、本文将从一致性和维护成本两个方面对于三种缓存更新策略进行简要说明,因为这些东西比较理论和抽象、入哪里说得不对,欢迎拍砖 注: 1):一致性:缓存和真实数据源(例如mysql, hbase, elasticsearch等等)是否存在一段时间数据的不一致。 2):维护成本: 开发人员的开发和维护成本。 策略 一致性

stay hungry,stay foolish! 263

cartographer运行错误集合

播放bag的时候错误 Check failed: sensor_to_tracking->translation().norm() < 1e-5 The IMU frame must be colocated with the tracking frame. Transforming linear acceleration into the tracking frame will otherwise be imprecise tracking frame不是imu的link 修改lua文件中的.

Studying…… 2023

Redis缓存更新策略以及常见缓存问题

缓存就是数据交换的缓冲区(Cache),是存储数据的临时地方,一般读写性能较好,常见缓存:Web应用中缓存有什么作用呢?降低后端负载提高读写效率,降低响应时间数据的一致性成本代码维护成本运维成本。

buhuisuanfa的博客 2925

RK3576 USB3.0 DWC3控制器调试:PHY初始化失败排查指南

DWC3 是 Synopsys 公司推出的 USB3.0/3.1 控制器 IP,支持双角色(DRD)模式,可配置为 Host、Device 或 OTG。

小灰灰的博客 1179

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【Redis缓存同步的个人思路分析总结】----Redis缓存更新策略见解

对Redis缓存更新策略的分析总结,对主流问题,提出自己的思考和理解。

weixin_52861960的博客 5012

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Redis篇:缓存更新策略最佳实践

缓存更新是redis为了节约内存而设计出来的一个东西,主要是因为内存数据宝贵,当我们向redis插入太多数据,此时就可能会导致,所以redis会对部分数据进行更新,或者把他叫为淘汰更合适,一般有以下三种淘汰策略。

viperd的博客 3903

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Redis之缓存更新策略

本文列举了常用了几个缓存更新策略,并使用 Cache-Aside + TTL 到实例中。

专注于优雅与性能的未来架构师 1401

【Redis】缓存更新策略

这三种都有可能出现线程不安全的问题,但是方案二相对来讲出现的可能性更低。就算方案二的特殊情况真的发生了,我们将来加上一个超时时间就行了,万一写了旧数据也没关系,过一段时间就会清除。先操作数据库,再删除缓存。内存淘汰超时剔除主动更新,具体如何选择,需要看业务需求:1、低一致性需求:使用Redis自带的内存淘汰机制,最多加一个超时更新2、高一致性需求:主动更新,并以超时剔除作为兜底方案,这样才能在发生意外的时候保证数据的恢复。写回。

qq_39921135的博客 2407

Redis缓存更新策略

缓存更新的本质,是在「性能」和「数据一致性」之间做权衡最终一致性是大部分业务的最优选择:除金融、支付、核心库存等强一致性场景外,90% 以上的业务都可容忍短暂的数据不一致,优先选择缓存过期自动淘汰或更新数据库后淘汰缓存**,兼顾性能和开发效率。删除缓存是比更新缓存更安全的选择:并发写场景下,更新缓存必然导致脏数据,而删除缓存能从根本上规避该问题,这是缓存更新的核心设计技巧。异常容错是缓存更新的必备环节:任何策略都要考虑操作失败的场景(如网络超时、服务宕机),通过重试机制和过期兜底,避免脏数据无限扩散。

he_co的博客 931

Redis缓存更新策略、主动更新策略、穿透、雪崩、击穿实战

查询数据一般都是直接查询数据库,返回给前端。为了提高效率实际项目中会将基础数据等热点数据放入redis缓存中。

weixin_43811057的博客 2430

9.缓存双写一致性之更新策略

如何选择方案优先使用先更新数据库,再删除缓存的方案(先更库→后删存)。理由如下:先删除缓存值再更新数据库,有可能导致请求因缓存缺失而访问数据库,给数据库带来压力导致打满 mysql。如果业务应用中读取数据库和写缓存的时间不好估算,那么,延迟双删中的等待时间就不好设置。多补充一句:如果使用先更新数据库,再删除缓存的方案如果业务层要求必须读取一致性的数据,那么我们就需要在更新数据库时,先在 Redis 缓存客户端暂停并发读请求,等数据库更新完、缓存值。

2302_81141145的博客 707
上一篇: 缓存系列文章--2.是否真的需要缓存?
下一篇: 缓存系列文章--4.缓存的粒度控制
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值