缓存便捷的技术揭秘

news/2025/10/4 21:20:23/文章来源:https://www.cnblogs.com/wzzkaifa/p/19125939

一、 什么是缓存?为什么需要它?

1. 核心概念
缓存是一个高速的素材存储层,用于存储临时性的、频繁访问的数据副本。当再次请求该材料时,可以直接从高速缓存中获取,从而避免访问速度较慢的原始数据源。

2. 为什么要用缓存?

  • 提升性能:将内容存储在访问速度更快的介质中(如内存),大幅降低数据访问延迟,加快应用响应速度。

  • 降低后端负载:减少对慢速数据源(如数据库)的直接访问次数,防止后端被高并发流量压垮。

  • 提高体系扩展性:通过分担读压力,使系统能够服务更多的用户。

  • 增强用户体验:更快的响应速度意味着更好的用户体验。


二、 缓存的工作原理与核心术语

1. 缓存的工作流程
对于一个典型的“请求-缓存-数据库”流程:

  1. 读请求:

    • 应用第一检查缓存中是否存在所需资料。

    • 缓存命中:信息存在,直接从缓存返回。

    • 缓存未命中:数据不存在,从慢速数据源(如数据库)读取数据。

    • 将从数据库读取的数据写入缓存,以便后续请求使用。

    • 返回数据。

  2. 写请求:

    • 应用向数据库写入或更新数据。同时,需要处理缓存中对应的旧数据,以确保数据一致性。这是缓存设计的难点之一。

2. 核心术语

  • 缓存命中:请求的数据在缓存中找到。

  • 缓存未命中:请求的数据不在缓存中。

  • 命中率:命中次数 / 总请求次数。这是衡量缓存效益的关键指标,命中率越高越好。

  • 缓存键: 用于在缓存中查找数据的唯一标识符,通常是字符串(如 user:12345)。

  • 缓存值:与缓存键关联的数据。

  • TTL:内容的存活时间。设置TTL可以防止数据永久占用缓存,是保证数据最终一致性的简便有效手段。

  • 缓存驱逐/淘汰:当缓存空间已满时,应该根据某种策略删除旧数据以腾出空间存放新资料。


三、 缓存的分类与常见位置

缓存可以存在于体系架构的各个层面。

  1. 客户端缓存

    • 位置:浏览器、手机App。

    • 例子: HTTP缓存头(ExpiresCache-Control)、H5的LocalStorage。用于缓存静态资源(图片、CSS、JS)或API响应。

  2. 网络缓存

    • 位置:CDN、反向代理。

    • 例子:Nginx、Varnish、CloudFlare。将内容缓存到离用户更近的边缘节点。

  3. 服务器端缓存/应用缓存

    • 位置:应用服务器内存或独立的缓存服务器。

    • 例子:RedisMemcached最常被提及的缓存,用于缓存数据库查询结果、会话等。就是。这

  4. 数据库缓存

    • 位置:数据库内部。

    • 例子:MySQL的Query Cache、InnoDB Buffer Pool。数据库自身为了加速查询而维护的缓存。


四、 经典的缓存模式

在使用应用缓存(如Redis)时,有几种经典的读写模式。

  1. Cache-Aside / Lazy Loading(旁路缓存)

    • 最常用的模式。

    • 读流程:

      1. 应用读缓存。

      2. 缓存命中,返回数据。

      3. 缓存未命中,读数据库。

      4. 从数据库取回数据后,写入缓存。

    • 写流程:

      1. 应用更新数据库。

      2. 应用删除缓存中对应的数据。

    • 优点:实现简便,缓存仅具备应用实际请求的素材。

    • 缺点:会发生缓存未命中,应该从数据库加载。

  2. Read-Through(读穿透)

    • 模式:应用将缓存作为主要数据源。当缓存未命中时,缓存服务自身负责从数据库加载数据并填充缓存,然后返回给应用。

    • 优点:对应用层更友好,代码更简洁。

    • 缺点:需要缓存支持(如一些ORM或缓存库支持此模式)。

  3. Write-Through(写穿透)

    • 模式:应用写内容时,先写缓存,然后由缓存服务同步地将数据写入数据库。

    • 优点:确保缓存和数据库的强一致性。

    • 缺点:写入延迟高,基于需要两次写操作都完成。

  4. Write-Behind / Write-Back(写回)

    • 模式:应用只写缓存,然后就返回。缓存服务会异步地、批量地将数据更新到数据库。

    • 优点:写入性能极高,能抵御写流量高峰。

    • 缺点:有数据丢失风险(缓存宕机导致数据未落库),只能保证最终一致性。


五、 缓存带来的挑战与解决方案

引入缓存也带来了新的复杂性,必须妥善处理。

  1. 缓存穿透

    • 问题: 查询一个根本不存在的数据。由于内容不存在,每次请求都会穿透缓存直达数据库,相当于发起了没有意义的数据库查询。

    • 解决方案:

      • 缓存空对象: 即使查询不到数据,也缓存一个空值(如 null)并设置一个较短的TTL。后续请求在缓存层面就被拦截。

      • 布隆过滤器:在缓存之前加一层布隆过滤器。它能够以极小的空间代价判断一个元素是否绝对不存在于某个集合中。对于布隆过滤器判断为“不存在”的请求,直接返回,不再查询缓存和数据库。

  2. 缓存击穿

    • 问题: 某个热点key过期瞬间,有大量并发请求同时到来,这些请求同时发现缓存过期,同时去数据库加载数据,导致数据库瞬间压力过大。

    • 解决方案:

      • 设置热点资料永不过期。

      • 互斥锁:当缓存失效时,只让一个请求去数据库加载数据并重建缓存,其他请求等待,待缓存重建完成后,直接从缓存读取。

  3. 缓存雪崩

    • 问题:在同一时间,大量的缓存key同时过期,导致所有请求都涌向数据库,引起数据库压力激增甚至宕机。

    • 解决方案:

      • 设置随机的过期时间:在为缓存数据设置TTL时,增加一个随机值(如基础TTL + 随机1-5分钟),避免大量key在同一时刻到期。

      • 构建高可用的缓存集群:如使用Redis Sentinel或Cluster,防止单个缓存节点宕机导致所有流量打到数据库。

      • 服务降级与熔断:当数据库压力过大时,对非核心业务进行降级,甚至直接熔断,保护数据库。

  4. 数据一致性

    • 问题:如何保证缓存中的素材与数据库中的数据是一致的?这是一个权衡问题。

    • 解决方案:

      • 牺牲一致性换性能:采用Cache-Aside模式,更新数据库后删除缓存。这是一种最常用、最简单的最终一致性方案。在极少数并发场景下可能产生脏数据,但概率很低。

      • 追求强一致性:采用Write-Through或采用分布式事务(如2PC),但会牺牲性能。

      • 通过 Canal 等中间件异步刷新:数据库的变更日志被中间件捕获,由中间件来负责异步更新或删除缓存。对应用无侵入。


六、 缓存淘汰策略

当缓存空间不足时,应该淘汰哪些数据?

  • FIFO: 先进先出。

  • LRU:最近最少使用最常用的策略,符合“时间局部性”原理。就是。淘汰最久未被访问的材料。这

  • LFU:最不时常使用。淘汰使用频率最低的信息。

  • Random: 随机淘汰。

Redismaxmemory-policy 就支持 noeviction, allkeys-lru, volatile-lru, allkeys-random 等多种策略。

总结

一把双刃剑。运用时需要:就是缓存是提升体系性能的利器,但也

  1. 明确目标:缓存什么数据?期望达到多高的命中率?

  2. 选择模式:根据业务场景(读多写少?强一致性要求?)选择合适的缓存模式。

  3. 预见问题:必须考虑穿透、击穿、雪崩和数据一致性等问题,并提前设计好解决方案。

  4. 持续监控:监控缓存命中率、内存使用量、网络带宽等关键指标,持续优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/927567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在哪进入网站后台汽车行业网站设计

解析 一直在路径可逆上做功夫,跑偏了。 题目可以转化为一个模型:给出一张无向图,每次可以移动到未移动过的点上,不能移动者判负。 这个的做法就是判断是否完美匹配,完美匹配则后手必胜,否则先手必胜。 …

微分和积分的区别

微分和积分的区别微分和积分是互逆的两种运算,就像加法和减法、乘法和除法一样。微分就像“拆解”或“显微镜”:给你一个完整的物体(函数),你用微分去研究它在某一个极小的点上的瞬间变化率和性质(比如求瞬时速度…

网站突然排名没了网页设计服务公司

文章目录 推荐 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…

广西新农村建设工作专题网站wordpress 4.8正式版

标准模版库STL <algorithm> 算法库 max, min 用于找出一组值中的最大值和最小值 swap 用于交换两个变量的值 sort 用于对一个范围内的元素进行排序 lower_bound, upper_bound 用于在已排序的容器中查找元素的下界和上界 unique(a,an)-a 用于在一个范围内删除相邻重…

202509_QQ_secret

图片隐写,BMP,StegSolveTags:图片隐写,BMP,StegSolve,Analysis-File 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202509_QQ_secret.zip 0x01. WP…

网站开发视频教程迅雷下载凡客诚品简介

一日不见如隔三秋&#xff0c;本人觉得有界变差函数是实变函数中最容易理解且和高等数学联系最紧密的一个概念&#xff0c;其在概率论中也有非常广泛的应用&#xff0c;也和勒贝格空间有着千丝万缕的联系。什么叫有界变差函数&#xff1f;若在区间(a&#xff0c;b)中&#xff0…

创世网站网络建设鑫牛元网站建设

转自个人微信公众号【Memo_Cleon】的统计学习笔记&#xff1a;协方差分析&#xff1a;方差分析与线性回归的统一。在进行数据分析时&#xff0c;有时候我们会遇到数据基线不平的情况&#xff0c;比如两样本的t检验的示例&#xff0c;比较Labe和Meto用药13周的降压效果&#xff…

4 对拍杂谈

对拍杂谈 0 前言 关于对拍,一句话描述清楚它的重要性:相当于数学中的验算。 我们oi中不能只凭感觉来判断一个程序的正确性,而要靠对拍来确定程序正确性。 当然,对拍过了也不能说明你的程序就一定正确,毕竟数据是你…

网站美工设计详细步骤珠海市手机网站建设公司

文章目录 435.无重叠区间按右边界排序CPP代码 按左边界排序如何判断相邻区间是否重叠如何判断一下一个区间与当前相邻区间是否重叠总结CPP代码 763.划分字母区间思路伪代码实现CPP代码 56. 合并区间思路CPP代码 435.无重叠区间 力扣题目链接 文章链接&#xff1a;435.无重叠区间…

网站图片要多少像素谷歌官方网站注册

还原某个文件到指定版本 svn export -r 10520 resanaly.lua --force 设置忽略指定后缀文件&#xff0c; 例如忽略 .lc 后缀的文件, -R 是递归文件夹&#xff0c;path 为指定的起始目录 svn propset svn:ignore -R “*.lc” path svn propget svn:ignore -R 查看忽略设置 设置后…

商务网站建设与维护(专21春)深圳装修公司排名前十

总第 114 篇文章&#xff0c;本文大约 1300 字&#xff0c;阅读大约需要 4 分钟这是 2020 年的第一篇月总结&#xff0c;总结的内容和周记差不多&#xff0c;也还是从这几个方面进行总结&#xff1a;工作学习阅读&写作2月计划工作这个月的工作时间大概是2周多一点&#xff…

Matlab R2024b下载及详细安装教程,附永久免费Matlab安装包

一、MATLAB R2024b 下载 在开始安装前,请确保已下载 MATLAB R2024a 安装包,同时,确认计算机满足软件的最低系统要求,以保证安装和运行的流畅性。 夸克网盘:https://pan.quark.cn/s/3598f84971f4 迅雷网盘:https:…

网站做app开发如何用自己电脑做网站服务器吗

目录 类的定义和使用类的定义格式 类的实例化类和对象的说明 this引用this引用的特性 对象的构造及初始化就地初始化构造方法 封装包导入包中的类自定义包 static成员static修饰成员变量static修饰成员方法 代码块代码块概念及分类构造代码块静态代码块 匿名对象 类的定义和使用…

Luogu P1966

题意简化 给定两个数组 \(a,b\),求让 \(\sum{(a_i-b_i)^2}\) 尽可能小所需要的最小交换次数 分析 首先,拆解题目给出的公式(完全平方) \(\sum{(a_i-b_i)^2}=\sum {{a_i}^2+{b_i}^2-2a_ib_i}\) 可以发现,\(\sum{{a…

计算机毕业设计springboot和Vue的在线购物系统 基于SpringBoot与Vue.js的电子商务平台开发 利用SpringBoot和Vue构建的网络购物应用 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

题解:P14036 [PAIO 2025] Rooks

P14036:最短路、单调队列。如果暴力 BFS,枚举每个点之后暴力枚举同行同列的所有点,时间复杂度不会低于 \(O(nm(n+m))\),明显过不去,因此必须要以行和列为单位整体考虑。 由题意,路径上所有单元格的 \(A\) 值单调…

2025/8/26

T2 模板(monica) 这是一道矩阵求逆的题,求矩阵 \(X\) 使得 \(A\times X=B\)。由于 \(A\times A^{-1}=I\),所以 \(X=A^{-1}\times B\) . 所以只需求 \(A^{-1}\),再与 \(B\) 做矩阵乘法并取模就完成了。 代码如下:…

27 考研初试时间大约是什么时候?

考研初试的时间一般都是在每年 12 月的倒数第二个周末,最近几年的情况一直如此。所以,27 考研的时间可能就是 2026 年 12 月 19 日,相比于 26 考研,从初试时间上来看,27 考研又提前了一天:

《C++ STL:vector类(上)》:详解基础使用核心接口及经典算法题 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

伪静态网站入侵浙江江能建设有限公司网站

Azure DevOps Server (原名TFS)是微软公司的软件开发管理平台&#xff0c;也是著名的软件开发过程管理工具&#xff1b;系统中记录了软件开发过程中的需求、问题、缺陷和迭代计划等各种软件开发工作项数据。 对于工作项数据的批量操作(例如新增和编辑)&#xff0c;Excel是一个非…