架构设计系列(六):缓存

news2025/2/26 19:34:30

一、概述

  在应用对外提供服务的时候其稳定性,性能会受到诸多因素的影响。缓存的作用是将频繁访问的数据缓存起来,避免资源重复消耗,提升系统服务的吞吐量。

二、缓存的应用场景

在这里插入图片描述

2.1 客户端

HTTP响应可以被浏览器缓存。我们第一次通过HTTP请求数据,它在HTTP报头中返回一个过期策略;我们再次请求数据,客户端应用程序首先尝试从浏览器缓存中检索数据。

2.2 CDN

CDN缓存静态web资源。客户端可以从附近的CDN节点检索数据。

2.3 负载均衡器

负载均衡器也可以缓存资源。

2.4 消息中间件

消息中间件用于削峰,在请求量大的场景下,引入消息中间件将请求消息缓存至中间件,待消费者消费处理。

2.5 应用服务本地缓存

这里是服务中的多层缓存。如果数据没有缓存在CPU缓存中,则服务将尝试从内存中检索数据。有时,该服务具有二级缓存,用于在磁盘上存储数据。

2.6 分布式缓存

像Redis这样的分布式缓存在内存中保存了多个服务的键值对。它提供了比数据库更好的读/写性能。

2.7 全文检索

我们有时需要使用全文搜索,如Elastic Search来进行文档搜索或日志搜索。数据的副本也会在搜索引擎中建立索引。

2.8 数据库

即使在数据库中,我们也有不同级别的缓存:

  • WAL(Write Ahead Log)预写日志:在构建B树索引之前,先进行WAL。
  • Bufferpool:分配给缓存查询结果的内存区域。
  • 物化视图(Materialized View):预先计算查询结果并将其存储在数据库表中,可以提升查询性能。
  • 事务日志(Transaction Log):记录所有事务和数据库更新
  • Replication Log:用于记录数据库集群的复制状态

三、Redis

3.1 redis的工作原理

在这里插入图片描述

  • Redis是一个基于RAM存储的。RAM读写速度比随机磁盘访问至少快1000倍。
  • Redis利用IO多路复用技术和单线程执行循环来提高执行效率。
  • Redis利用了高效的底层数据结构。

3.2 redis 的使用场景

在这里插入图片描述
   以下列举的是常见的一些不单单作为缓存的应用场景:

  • Session:我们可以使用Redis在不同的服务之间共享用户会话数据。
  • Cache:我们可以使用Redis来缓存对象或页面,特别是对于热点数据。
  • 分布式锁:我们可以使用Redis字符串来获取分布式服务之间的锁。
  • 计数器:我们可以使用Redis记录文章的点赞数或阅读量。
  • 限流器:我们可以对某些用户ip应用速率限制。
  • 全局ID生成器:我们可以使用Redis 作为全局ID的生成。
  • 购物车:我们可以使用Redis Hash来表示实现购物车的功能。
  • 用户留存率:我们可以使用位图来表示用户每日登录并计算用户留存率。
  • 消息队列:使用Redis的List数据结构来实现简易化的消息队列。
  • 排名:我们可以使用ZSet对条目进行排序。

四、常用的缓存策略

设计大型系统通常需要仔细考虑缓存。下面是常用的五种缓存策略。
在这里插入图片描述

4.1 Cache-Aside 策略

流程

  • 当读取数据的时候,程序将会先去读取缓存,如果命中缓存则直接返回数据
  • 如果没有命中缓存则程序将去数据库查询数据,返回数据的同时也将缓存一份数据

总结

   Cache-Aside 策略的优点是实现简单,只有被请求的数据才会被缓存起来,减少一些不必要数据的缓存。 但程序需要管理其时效性及一致性,增加了系统的复杂度。
   该策略更多的使用在数据读取比较频繁,更新比较少的场景。

4.2 Read-Through 策略

流程

  • 程序只会读取缓存中的数据,如果命中缓存就直接返回数据。
  • 如果没有命中缓存缓存服务将会读取数据库数据加载进缓存并返回数据。

总结

   Read-Through 策略 应用程序将不与数据库进行交互,简化了读取流程,由缓存系统自己管理缓存提高了数据的一致性。但缓存的写入需要单独处理,需要与其他写策略结合使用。
   该策略适用于读写操作频繁的场景。

4.3 Write Through 策略

流程

  • 程序在接收到写入数据请求时,直接于缓存系统交互,写入缓存系统,然后缓存系统立即写入数据库。

总结

   Read-Through 策略保证了数据的一致性,读取时总是能够在缓存中获取到最新的数据。但是每次写操作都需要更新两处数据储存,写入性能低。由于经常更新缓存对缓存的资源需求较高。
   该策略适用于数据一致性要求比较高或者写操作比较低,读操作比较高的操作。

4.4 Write Back 策略

流程

  • 程序在接收到写入数据请求时,直接于缓存系统交互,写入缓存系统,但不会立即写入数据库,而是等待触发条件(如缓存满了,或者到达一定的时间间隔)之后才会批量一次性写入数据库。

总结

   Write Back 策略 由于只更新缓存,所有对性能的提升显著,同时批量写入减少对数据的操作,减少资源的消耗。但存在数据不一致的风险,同时需要实现缓存的淘汰机制及批量会写数据的策略
   该策略适用于写操作频繁并且对数据一致性要求不高的场景。

4.5 Write Around 策略

流程

  • 程序在接收到写入数据请求时,直接写入数据库
  • 在读取时程序先读取缓存,如缓存不命中,则程序从数据库读取,并更新缓存

总结

   Write Around 策略避免了将不常用的数据写入缓存。但其首次读取数据都需要从数据库中加载,读取性能低,同时缓存命中率也低。
  该策略适用于写操作频繁但读操作不频繁的场景。

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

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

相关文章

个人电脑小参数GPT预训练、SFT、RLHF、蒸馏、CoT、Lora过程实践——MiniMind图文版教程

最近看到Github上开源了一个小模型的repo,是真正拉低LLM的学习门槛,让每个人都能从理解每一行代码, 从零开始亲手训练一个极小的语言模型。开源地址: GitHub - jingyaogong/minimind: 🚀🚀 「大模型」2小时…

格式工厂 FormatFactory v5.18.便携版 ——多功能媒体文件转换工具

格式工厂 FormatFactory v5.18.便携版 ——多功能媒体文件转换工具 功能:视频 音频 图片 文档PDF格式 各种转换,同格式调整压缩比例,调整大小 特色:果风图标 好看; 支持多任务队列,完成自动关机 下载地址&#xff1…

KafkaTool

Offset Explorer 第一次打开需要配置kafka相关配置连接 随便先启动一个Kafka(先启动zookeeper) 设置key value 记得刷新

基于C++“简单且有效”的“数据库连接池”

前言 数据库连接池在开发中应该是很常用的一个组件,他可以很好的节省连接数据库的时间开销;本文基使用C实现了一个简单的数据库连接池,代码量只有400行只有,但是压力测试效果很好;欢迎收藏 关注,本人将会…

国产编辑器EverEdit - 洞察秋毫!文件比较功能!

1 文件比较 1.1 应用场景 项目开发过程中,可能不同的部分会由不同的人在负责,存在一个文件多人编辑的情况,用户需要寻找差异,并将文档进行合并,比较专业的文本比较工具为BeyondCompare,WinMerge等。   如…

QARepVGG--含demo实现

文章目录 前言引入Demo实现总结 前言 在上一篇博文RepVGG中,介绍了RepVGG网络。RepVGG 作为一种高效的重参数化网络,通过训练时的多分支结构(3x3卷积、1x1卷积、恒等映射)和推理时的单分支合并,在精度与速度间取得了优…

kotlin 知识点 七 泛型的高级特性

对泛型进行实化 泛型实化这个功能对于绝大多数Java 程序员来讲是非常陌生的,因为Java 中完全没有这个概 念。而如果我们想要深刻地理解泛型实化,就要先解释一下Java 的泛型擦除机制才行。 在JDK 1.5之前,Java 是没有泛型功能的,…

Transformer LLaMA

一、Transformer Transformer:一种基于自注意力机制的神经网络结构,通过并行计算和多层特征抽取,有效解决了长序列依赖问题,实现了在自然语言处理等领域的突破。 Transformer 架构摆脱了RNNs,完全依靠 Attention的优…

Qt学习 网络编程 TPC通信

一 基本网络端口 1 网络编程基本概念 通讯方式:信息的通讯时通过网络来进行,通讯方式有两种,TCP和UDP通信,TCP通讯是专用通道,指定某个信息只能走某个通道,UDP则是非专用通道,比如一个车队&am…

ESP32-S3 实战指南:BOOT-KEY 按键驱动开发全解析

一、基础知识 本篇我们使用 BOOT 按键来学习一下 GPIO 功能,首先补充一下相关术语介绍。 1、GPIO(General Purpose Input/Output) GPIO 是微控制器上的通用引脚,既可以作为输入(读取外部信号)&#xff0…

ssh配置 远程控制 远程协作 github本地配置

0.设备版本 windows11 ubuntu24.0.4 1.1 在 Linux 上启用 SSH 服务 首先,确保 Linux 计算机上安装并启用了 SSH 服务。 安装和启动 OpenSSH 服务(如果未安装) # 在终端安装 OpenSSH 服务(如果尚未安装) sudo apt …

C++知识整理day9——继承(基类与派生类之间的转换、派生类的默认成员函数、多继承问题)

文章目录 1.继承的概念和定义2.基类与派生类之间的转换3.继承中的作用域4.派生类的默认成员函数5.实现一个不能被继承的类6.继承与友元7.继承与静态成员8.多继承和菱形继承问题8.1 继承分类及菱形继承8.2 虚继承 1.继承的概念和定义 概念: 继承(inheritance)机制是⾯…

2024年国赛高教杯数学建模A题板凳龙闹元宵解题全过程文档及程序

2024年国赛高教杯数学建模 A题 板凳龙闹元宵 原题再现 “板凳龙”,又称“盘龙”,是浙闽地区的传统地方民俗文化活动。人们将少则几十条,多则上百条的板凳首尾相连,形成蜿蜒曲折的板凳龙。盘龙时,龙头在前领头&#x…

华为认证考试证书下载步骤(纸质+电子版)

华为考试证书可以通过官方渠道下载相应的电子证书,部分高级认证如HCIE还支持申请纸质证书。 一、华为电子版证书申请步骤如下: ①访问华为培训与认证网站 打开浏览器,登录华为培训与认证官方网站 ②登录个人账号 在网站首页,点…

【Android】用 chrome://inspect/#devices 调试H5页面

通常做Android开发的过程中,不可避免的需要遇到去与H5交互,甚至有时候需要去调试H5的信息。 这里分享一下Android工程里如何调试H5页面信息: 直接在浏览器地址栏输入 : chrome://inspect/#devices 直接连接手机usb,打开开发者模式…

贪心算法精品题

1.找钱问题 本题的贪心策略在于我们希望就可能的保留作用大的5元 class Solution { public:bool lemonadeChange(vector<int>& bills) {std::map<int ,int> _map;for(auto ch:bills){if(ch 5) _map[ch];else if(ch 10){if(_map[5] 0) return false;else{_m…

WEB1~6通杀

##解题思路 这六道题&#xff0c;通杀了&#xff0c;只因为是PHP的特性 来&#xff0c;看web6&#xff0c;过滤最复杂的正则&#xff0c;而且不能解析成大于999的值&#xff0c;但是&#xff0c;php是弱类型的语言&#xff0c;我只要输入任意字符数字&#xff0c;最终值就为0&…

孜然单授权系统V2.0PHP授权系统

孜然单授权V1.0系统&#xff0c;延续了2022年开发的孜然多应用授权系统V2.0 变更&#xff1a;多应用变单系统&#xff0c;去除没用的垃圾代码&#xff0c;从0开发&#xff0c;去除了一些没用的功能 完善了开发文档&#xff0c;之前那套是我写着玩的屎山代码&#xff0c;V1.0将展…

Apache SeaTunnel 构建实时数据同步管道(最新版)

文章作者 王海林 白鲸开源 数据集成引擎研发 Apache SeaTunnel Committer & PMC Member&#xff0c;Apache SkyWalking Committer&#xff0c;多年平台研发经验&#xff0c;目前专注于数据集成领域。 导读 在当今数字化快速发展的时代&#xff0c;数据已然成为企业决策…

服务器离线部署DeepSeek

目标 本次部署的目标是在本地服务器上部署DeepSeek。但是该服务不能连接外网&#xff0c;因此只能使用离线部署的方式。为了一次完成部署。现在云服务器上进行尝试。 云服务器部署尝试 云服务器配置 CentOS72080Ti 11GB 安装准备 1、上传iso并配置为本地yum源 安装前先将…