Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >后台开发必备:每个程序员都应掌握的缓存技术

后台开发必备:每个程序员都应掌握的缓存技术

作者头像
腾讯云开发者
发布于 2024-07-02 03:30:27
发布于 2024-07-02 03:30:27
1.1K0
举报
本文介绍了后台开发中使用的缓存技术,如缓存策略、缓存类型,包括本地缓存和分布式缓存,还有缓存淘汰策略,以及缓存使用中的常见问题,如一致性问题、缓存雪崩、缓存穿透、缓存击穿。

缓存(Cache)是一种存储技术,可以存储数据,以便快速获取数据。缓存最重要的是两个特性:存储、快速获取。缓存的本质:「用空间换时间」,用快速存储的介质保存数据,以提升数据访问的速度。

在计算机的世界里,缓存被广泛应用于硬件(如 CPU 高速缓存、寄存器)和软件中(如浏览器缓存、CDN、应用程序中的缓存等)。

后台中的缓存

后台开发中,缓存的使用场景一般有:

  • 提升接口响应速度:缓存相比 IO 请求、数据库查询速度要快得多,适当使用缓存提升响应速度
  • 降低数据源服务的负载压力:将需要高并发读取的数据缓存起来,当相同请求进来时返回缓存数据,减轻数据源服务(如数据库、上游系统)的负载压力
  • 减少计算资源的浪费:将需要复杂且耗时计算的结果缓存起来,减少相同请求导致的重复计算资源浪费

01、缓存策略

缓存策略通常分为两种,通读缓存和旁路缓存。

1.1 通读(read-through)缓存

在使用通读缓存时,应用程序会尝试从缓存中获取数据。如果该数据已存在于缓存中,那么缓存会直接返回该数据。若缓存中并未包含所需数据,那么缓存会自行访问数据源来获取数据,并将获取的数据返回给应用程序,同时将这份数据保存在缓存中。如此一来,当应用程序下次需要同样的数据时,就能够直接从 read-through 缓存中获取,无需再次访问数据源。

通读缓存的应用有很多,比如 CDN:

CDN(Content Delivery Network)即内容分发网络,是一种分布式的网络架构。依赖于服务商提供的广泛分布于各地的 CDN 服务器,通过把数据分发并缓存到各地的 CDN 服务器上,当用户请求数据时,CDN 会匹配离用户距离最近的节点并返回缓存数据,以此来提高用户访问资源的速度。CDN 一般用来加速静态资源的传输,比如图片、CSS、HTML 等内容。而动态的内容,如搜索结果、单据信息等则不合适,这类数据需要应用服务器实时计算后才能返回。

腾讯云 CDN 具有海量资源储备、全球智能调度、一键接入、丰富功能等产品优势,欢迎企业及用户了解试用:https://cloud.tencent.com/product/cdn

配图来源:seobility

1.2 旁路(cache-aside)缓存

与通读缓存不同,旁路缓存不直接与数据源打交道。应用程序尝试从旁路缓存获取数据,如果数据不存在,则返回空。应用程序自行请求数据源获取数据,并写入旁路缓存。这样下次相同的请求到达时,应用程序从旁路缓存中则会获取到数据。

通读缓存和旁路缓存这两种策略,一般来说都会灵活应用、互相包含。比如通读缓存中,对数据的查询和写缓存,使用的就是旁路缓存策略。而该实现被整体封装起来,对外表现的则是通读缓存策略。

02、缓存类型

在后台服务中,缓存的类型可以分为本地缓存和分布式缓存。

2.1 本地缓存(local cache)

本地缓存,与应用程序的进程有相同的生命周期,存放于应用程序的堆空间(heap)中。

  • 优势: 使用简单;无外部依赖;读取速度快(无网络 IO 请求);
  • 缺点: 空间小:应用程序的服务器资源有限,所以本地缓存的空间小;分布式一致性问题:如果后台服务是分布式架构的,那么不同的服务实例之间的本地缓存可能会有差异;无法持久化:本地缓存会随着进程结束而被销毁,无法持久化。

2.2 分布式缓存(remote cache)

分布式缓存,也可理解为远端缓存。使用外部的缓存服务,独立部署,与应用程序解藕。

  • 优势: 空间充足:外部存储一般空间都很充足;无分布式一致性问题:不同的服务实例连接同一个缓存服务,不存在一致性问题;主流的分布式缓存,如 redis,支持数据持久化和恢复,当缓存服务挂了可以恢复数据。
  • 缺点: 引入外部依赖、需要部署和运维单独的缓存服务。

2.2.1 常见的缓存服务

Redis

  • 支持多种数据结构,如:list,set,zset,hash 等数据结构。
  • 支持数据的持久化和恢复。
  • 支持多种集群模式:主从复制、哨兵模式和 Cluster 模式,保证高可用、容灾恢复、易于扩展。
  • 能提供毫秒级别的响应速度。
  • Redis 6.0 引入了多线程 IO,之前是单线程模型。

Memcache

  • 主要支持简单的键值对存储。
  • 不支持持久化和恢复。
  • 集群:可以通过客户端分片实现分布式存储
  • 多线程,非阻塞 IO 模式。
  • 能提供毫秒级别的响应速度。

选择 Redis 还是 Memcached 取决于具体的应用需求。如果需要一个轻量级、专注于缓存的解决方案,且不需要复杂的数据类型和持久化,Memcached 可能是更合适的选择。而如果应用需要利用丰富的数据类型、持久化以及构建高可用的分布式系统,Redis 将是更强大、更灵活的选择。

03、缓存淘汰策略

由于缓存的空间是有限的,如果缓慢的空间被使用完了,则需要淘汰旧的数据,腾出空间给新的数据使用。缓存淘汰常用的几种策略有如下几种。

3.1 FIFO(First In First Out)算法

FIFO 算法是最简单最好理解的,其策略是:先进先出,如果一个数据的写入时间越早,说明将来被访问的几率越低。因此 FIFO 算法优先淘汰最早写入的数据。

3.2 LRU(Least Recently Used)算法

LRU 算法,即最近最少使用算法。如果一个数据最近被访问了,那么将来被访问的几率越高。反之,如果一个数据很久都没有访问,那么将来被访问的几率越低。其淘汰策略就是:优先淘汰最久没有被使用到的数据。LRU 通常使用双向链表+哈希表来实现。

3.3 LFU(Least Frequently Used)算法

LFU 算法,即最少使用算法。如果一个数据被访问的次数越多,那么将来被访问的几率越高。反之,如果一个数据被访问的次数越少,那么将来被访问的几率越小。其淘汰策略就是:优先淘汰最少被使用的数据。LFU 算法可以使用小顶堆+哈希表来实现。

大部分本地缓存的三方库或缓存服务,都支持设置淘汰算法,无需自行实现。

04、缓存常见问题

4.1 缓存与数据源的一致性

缓存的数据是来自数据源的,当数据源被更新了,而缓存没有被更新,后台服务则会从缓存中取到脏数据,这就有数据脏读的问题。对于这个问题,主要的策略有两种。

4.1.1 过期失效

每个写入缓存中的数据,都设置一个合适的过期时间,在有效期内都返回缓存的数据。当缓存数据过期失效,则会回源到数据源,重新缓存最新的数据。这种情况会有数据脏读的问题,不过采用过期失效的数据,一般是更新不频繁的数据,比如用户信息、热门信息等,存在一定的数据延迟是可以接受的。

4.1.2 主动更新

当数据源的数据更新了,程序主动去更新缓存数据,保证缓存中的数据始终是最新的。这种策略,适合对数据的时效性要求很高的数据,比如库存、余额等等。主动更新的代价则是代码的复杂度增加,所有涉及数据更新的操作,都需要更新其缓存数据。

无论是过期失效还是主动更新,首先应该分析当前场景对数据的时效性要求是否很高?如不是,过期失效足矣。如果是,需要衡量主动更新的代价能否接受,比如代码复杂度增加。否则是否可以通过缩短失效时间而采取过期失效策略来折中处理。

4.2 缓存雪崩

缓存雪崩是指在同一时间点后台服务中的缓存大量过期失效,当服务的并发量很高时,大量的数据请求同时到达数据源服务(比如数据库或其他服务),引起数据源服务的瞬时负载增大,甚至崩溃。

引起缓存雪崩的原因一般有两种:

  • 一是大量的缓存 key 在同一时间失效
  • 二是缓存服务不可用,请求都被透传到数据库。

解决办法:

  • 设置合理的缓存失效时间:合理设置过期时间,分散缓存的失效时间,避免缓存在同一时间失效。
  • 保证缓存服务的高可用:使用独立的缓存服务,尽量使用缓存集群,保证缓存服务的高可用和容灾恢复。

4.3 缓存穿透

缓存穿透是指同一时间大量的空值请求到达后台服务,空值请求是指查询数据源后无数据的请求,由于数据源返回空数据,所以缓存层没有将空值保存,导致空值请求必然会穿透缓存层,透传到数据源。

引起缓存穿透的原因,一般有:

  • 未对请求参数进行合理的校验和拦截。
  • 被精心构造的恶意请求攻击。

解决办法:

  • 设置合理的参数校验:通过设置合理的校验规则,比如 id 范围、名称正则规则等,对不合理或空值请求的参数的进行过滤和拦截。
  • 缓存空值处理:即使数据源返回空值,也在缓存层将其保存起来。可能对其数值设置一些标记,比如 value=-1 等等,方便服务识别为空值。同时,也可以为空值的缓存设置一个较短的失效时间。

4.4 缓存击穿

缓存击穿是指某个热点数据的缓存失效了,然后同一时间有大量的请求访问该热点数据,由于缓存失效,这些请求同时被透传到数据源服务,导致数据源的负载增加,甚至崩溃。

引起缓存击穿的原因,一般是:热点数据的缓存失效时,高并发请求同时访问该数据。

解决办法:

  • 使用互斥锁或者分布式锁,对数据的回源操作进行上锁,保证同一时刻只有一个请求被透传到数据源服务。
  • 热点数据的缓存永不过期,由数据源主动更新缓存。
  • 热点数据预加载:在缓存数据将要过期时,由后台服务主动更新热点数据缓存,防止缓存失效。

05、总结

本文详细地介绍了后台开发中的缓存技术,希望能对你的日常工作有所帮助和启发。熟练掌握各种缓存策略和机制,解决缓存问题,对于程序员而言至关重要,可以在很大程度上提升后台开发的效率、稳定性和用户体验。

-End-

原创作者 | 唐国富

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
FPGA实现高带宽NVMe SSD读写
近期实验室项目需对2GB/s的高速数字图像数据实时存储,后续数据带宽将提升至30GB/s。经调研,SATA协议的固态硬盘理论存储有效带宽为600MB/s,NVMe协议的固态硬盘理论带宽随PCIe协议而不同。NVMe协议的固态硬盘在PCIe Gen2、Gen3条件下,理论有效带宽分别为2GB/s、3.938GB/s。目前,NVMe SSD最高搭载PCIe Gen4通路,其理论有效带宽为7.877GB/s。
数字积木
2021/08/19
4.9K0
FPGA实现高带宽NVMe SSD读写
FPGA纯逻辑实现高带宽NVMeSSD读写
在两年之A前的帖子《FPGA实现高带宽NVMe SSD读写》中,我们实现了一个基于PS和PL端的高速NVMe SSD IP。这个IP在我们自己的系统中使用正常,但是由于该IP使用了PS端资源,在与其他应用系统集成时遇到了麻烦。为了保护自有的设计,需要独占PS端的一个ARM处理器,这使得该IP在与其他项目集成时,使用很不方便。除此以外,原方案IP写SSD硬盘的最大速度约为2.8GB/s,而PCIe Gen3条件下理论有效带宽为3.938GB/s,基于x86的PC测速一般为3.6GB/S,FPGA的实现方式与理论速度以及x86平台的速度存在一定的差距,因此希望进一步提高IP的硬盘的读写速率。
用户10711701
2023/08/21
1.5K0
从新手到架构师:Web服务器如何实现大文件跨节点传输
看过一个文章 HTTP 断点续传(分块传输)我了解, 但是让我按照他们做法 八股文说出,我不愿意,说不出口。
早起的鸟儿有虫吃
2025/06/28
800
从新手到架构师:Web服务器如何实现大文件跨节点传输
原来PCIe这么简单,一定要看!
硬盘是大家都很熟悉的设备,一路走来,从HDD到SSD,从SATA到NVMe,作为NVMe SSD的前端接口,PCIe再次进入我们的视野。作为x86体系关键的一环,PCIe标准历经PCI,PCI-X和PCIe,走过近30年时光。其中Host发现与查找设备的方式却一脉沿袭,今天我们先来聊一聊PCIe设备在一个系统中是如何发现与访问的。
Linux阅码场
2019/07/08
14.1K1
FDP与SSD主控创新
按:本文含两单元,前半部分介绍数据中心SSD发展趋势及FDP技术在SSD领域应用价值,后半部分介绍FADU 在SSD主控领域技术创新及发展路线.
数据存储前沿技术
2025/02/11
3460
FDP与SSD主控创新
SATA、mSATA、M.2、M.2(NVMe)、PCIE固态硬盘接口详解
固态驱动器(Solid State Drive),俗称固态硬盘,固态硬盘是用固态电子存储芯片阵列而制成的硬盘,因为台湾英语里把固体电容称之为Solid而得名。SSD由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。固态硬盘在接口的规范和定义、功能及使用方法上与普通硬盘的完全相同,在产品外形和尺寸上也完全与普通硬盘一致。被广泛应用于军事、车载、工控、视频监控、网络监控、网络终端、电力、医疗、航空、导航设备等诸多领域。
全栈程序员站长
2022/08/10
29.7K0
SATA、mSATA、M.2、M.2(NVMe)、PCIE固态硬盘接口详解
FADU:SSD主控高效能耗管理
文章主要探讨如何通过采用新型节能固态硬盘(SSD)控制器来大幅提高数据中心的整体拥有成本(TCO)。
数据存储前沿技术
2025/02/11
2630
FADU:SSD主控高效能耗管理
忆芯科技沈飞:对标Intel与三星,做不一样的“国产替代”| 镁客请讲
近年,在以日韩半导体为主力且已经稳定成型的内存产品市场中,有一匹“黑马”——固态存储(SSD)技术杀出,并因存储的稳定性和技术的先进性倍受业内人士器重。
镁客网
2019/03/04
8990
忆芯科技沈飞:对标Intel与三星,做不一样的“国产替代”| 镁客请讲
SMI:虚拟化环境下NVMe SSD性能优化
文档由Silicon Motion技术公司提供,关于如何在多虚拟环境中优化NVMe SSD I/O性能的技术。
数据存储前沿技术
2025/02/11
2690
SMI:虚拟化环境下NVMe SSD性能优化
Bill Gervasi:NVMe-Over-CXL 怎么落地?
按:本文是Bill老先生关于CXL场景和落地,在FMS-24上的发言材料,文中绝大部分直译作者观点,鹏弟延申的思考均以Note标出,建议阅读文末Bill 另两篇关于DRAM的介绍,循序渐进再来读,会更有感觉。
数据存储前沿技术
2025/02/11
2460
Bill Gervasi:NVMe-Over-CXL 怎么落地?
Samsung:大容量QLC-SSD 的若干问题
固态硬盘(SSD)作为高性能存储的主流选择,其容量也在不断突破极限。为了满足这一需求,存储行业正积极推动更高密度 NAND 闪存技术的应用,其中四层单元(QLC)技术因其更高的存储密度而备受关注。然而,QLC 技术在带来容量飞跃的同时,也带来了性能、耐用性和服务级别协议(SLA)等方面的挑战。理解这些挑战并探索相应的解决方案,对于充分发挥高容量 SSD 的潜力至关重要。本文将深入探讨高容量 QLC SSD 的技术特性、面临的挑战,以及行业为应对这些挑战所做的努力,特别是大块大小(LBS)等创新技术如何影响未来的存储格局。
数据存储前沿技术
2025/05/06
2560
Samsung:大容量QLC-SSD 的若干问题
NVMe Over CXL SSD 概念、场景与价值
早期计算机为优化性能,内存与存储分离:内存高速低延迟服务CPU即时需求,存储大容量持久保存。大数据和AI兴起,传统架构瓶颈显现,数据激增,内存需求空前,PCIe扩展受限。CXL应运而生,统一CPU、内存、加速器、存储,使NVMe SSD与内存紧密协作,SSD DRAM可扩展为HDM,提升速度、降低延迟、实现内存池化和动态分配,提高效率。本文将剖析NVMe over CXL原理、优势及应用,阐述其如何革新计算存储,尤其应对AI高性能大容量需求。
数据存储前沿技术
2025/04/13
3180
NVMe Over CXL SSD 概念、场景与价值
NVMe SSD 开发工具:NVMeVirt
文档介绍NVMeVirt,一个基于软件的虚拟NVMe设备模拟器,及其在加速存储系统研发中的应用。
数据存储前沿技术
2025/02/11
4830
NVMe SSD 开发工具:NVMeVirt
【论文阅读】DDS:基于DPU优化的分离式存储(数据库领域从事人员也可从本文获益)
今天我们来看一篇由多伦多大学、微软亚洲研究院的研究人员发表的文章《DDS: DPU-optimized Disaggregated Storage》。
霞姐聊IT
2025/06/09
1840
【论文阅读】DDS:基于DPU优化的分离式存储(数据库领域从事人员也可从本文获益)
SSD写放大与数据放置技术:从原理到实践
数据的增长速度呈指数级上升,云原生时代的到来进一步加剧了对高性能、低成本存储解决方案的需求。
数据存储前沿技术
2025/02/11
2660
SSD写放大与数据放置技术:从原理到实践
NVMe + CXL 场景案例分析
在之前整理的材料中,介绍了 NVMe 作为专门为SSD优化的存储访问接口(协议),为存储系统的高效访问提供通信基础。 CXL 是一种高速接口协议,旨在连接计算、内存和存储资源,提升数据中心的工作效率。它不仅是一个通信协议,还支持多种设备间的互操作性,允许灵活的资源分配和管理。
数据存储前沿技术
2025/02/11
3130
NVMe + CXL 场景案例分析
Marvell:数据管道与高性能SSD
过去两年,业界对AI 训练场景异常关注,随着热度不断降低,重新回顾AI整个数据生产流,前端的数据处理平台作为训练的数据源,其处理效率和准确性是后向操作的关键,应该更加关注大数据平台的长期建设和维护。
数据存储前沿技术
2025/02/11
1420
Marvell:数据管道与高性能SSD
【合集】深入理解大容量SSD设计
随着数据量的爆炸式增长,对SSD容量的需求也日益迫切。如何在有限的物理空间内,进一步提升SSD的存储容量,同时兼顾性能与成本,成为了业界亟待解决的关键问题。
数据存储前沿技术
2025/04/24
2430
【合集】深入理解大容量SSD设计
NVMe接口优化:HDD存储的未来之路
在生成式AI和大数据时代,存储系统的性能和效率变得至关重要。传统的SATA和SAS接口已经无法满足现代数据中心对高吞吐量和低延迟的需求。NVMe(非易失性内存 express)作为一种新兴的存储接口,正在逐步取代这些传统接口,特别是在大容量存储系统中。本文深入探讨了NVMe接口在HDD(硬盘驱动器)中的应用,分析了其如何通过统一存储堆栈、优化拓扑结构以及引入新技术(如eBPF、CMB、HMB等)来提升存储系统的性能、降低功耗和总拥有成本(TCO)。通过多个实际案例和技术细节,本文为读者展示了NVMe接口如何推动存储技术的革新,并为未来的数据中心和AI应用提供了强有力的支持。
数据存储前沿技术
2025/02/26
3282
NVMe接口优化:HDD存储的未来之路
一种不带CPU的DPU架构:Hyperion
人类自诞生之日起,就常常因为一些事情经常这样或那样做而形成一种惯例,我们称这种惯例为习惯。CPU就是这么一种产物,什么都可以做,灵活,好用。但随着定制化芯片的不断发展,是否真的需要CPU逐渐成为一种值得考虑的问题。尤其在定制计算领域,CPU的计算能耗比过高已经成为事实,甚至有几个数量级的差别。如本公众号之前曾发布的唤醒芯片的介绍"小爱同学"之类语音唤醒芯片相关技术介绍,都是不带CPU的超低功耗芯片。那么,在常常以功耗过大被诟病的数据中心应用日益频繁的DPU芯片,是否也可以不带CPU呢?本文介绍一篇2022年5月19日发布在https://arxiv.org/pdf/2205.08882.pdf网站上的一篇文章。
网络交换FPGA
2022/08/30
1.3K0
一种不带CPU的DPU架构:Hyperion
推荐阅读
相关推荐
FPGA实现高带宽NVMe SSD读写
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档