读构建可扩展分布式系统:方法与实践05分布式缓存

news2024/11/14 16:29:20

1. 分布式缓存

1.1. 缓存存在于应用程序的许多地方

  • 1.1.1. 行应用程序的CPU具有高速多级硬件缓存,可以减少相对较慢的主内存访问

  • 1.1.2. 数据库引擎可以利用主内存来缓存数据存储的内容,这样在许多情况下查询就可以不用访问速度相对较慢的磁盘

1.2. 分布式缓存是可扩展系统的重要组成部分

  • 1.2.1. 缓存使耗时的查询和计算结果能够在后续请求中低成本地重用

  • 1.2.2. 由于不必为每个请求重建缓存结果,系统的容量增加了,并且可以扩展来处理更大的工作负载

1.3. 应用缓存依赖业务逻辑,业务逻辑使用分布式缓存将预计算结果的缓存和访问结合在一起

1.4. Web缓存充分利用HTTP协议中内置的机制在网络提供的基础设施中缓存结果

1.5. 缓存是任何可扩展分布系统的重要组成部分

  • 1.5.1. 缓存将许多客户端请求的信息存储在内存中,并利用这些信息为客户端请求提供服务

1.6. 使用分布式缓存的应用缓存是可扩展系统中最常用的缓存方法

1.7. 互联网还有内建的多级缓存基础设施

  • 1.7.1. HTTP缓存使用得当的话可以显著减少下游服务和数据库的请求负载

1.8. 缓存是软件和系统的一个成熟领域

1.9. CDN本身就是一个复杂的、针对供应商的主题

  • 1.9.1. 它们适用于用户群在地理上分散、内容需要快速交付的富媒体网站

2. 应用缓存

2.1. 应用缓存旨在通过将查询和计算的结果存储在内存中来提高请求响应能力,以便为后续的请求提供服务

  • 2.1.1. 缓存可以减轻数据库读取流量的负担,因为许多查询都可以直接从缓存中获取结果

  • 2.1.2. 缓存最终效果是减少了服务和数据库的计算负担,并为更多请求创造了空间或容量

2.2. 缓存需要额外的资源和成本来存储缓存结果

  • 2.2.1. 与升级数据库和服务节点以应对更高的请求负载相比,设计良好的缓存方案成本较低

2.3. 应用级缓存采用专用的分布式缓存引擎

  • 2.3.1. 主流技术

    • 2.3.1.1. memcached

    • 2.3.1.2. Redis

    • 2.3.1.3. 两者本质上都是分布式内存哈希表,为存储代表数据库查询结果或下游服务API调用结果的任意数据(字符串、对象)而设计

2.4. 缓存常见的使用场景是存储用户会话数据、动态网页和数据库查询结果

2.5. 缓存命中

  • 2.5.1. 如果可用,它会将缓存的内容作为结果返回

  • 2.5.2. 缓存命中率应该是多少并没有一个硬性的规定,因为它取决于构建缓存内容的成本和缓存项的更新频率

    • 2.5.2.1. 理想的缓存设计应该是读取频率远高于更新频率

2.6. 如果数据不在缓存中,即缓存未命中,服务将从数据库中查询所请求的数据并将查询结果写入缓存,后续的客户端请求无须查询数据库即可使用这些数据

  • 2.6.1. 当项目需要经常更新时,缓存未命中的成本可能会抵消缓存带来的好处

2.7. 当缓存值有效时,所有请求都会使用它

  • 2.7.1. 无须为每个请求调用执行耗时的电梯等待时间的计算

2.8. 使用TTL之类的过期时间是使缓存内容失效的一种常用方法

  • 2.8.1. 确保了服务不会向客户端提供过期的结果

  • 2.8.2. 使系统能够对缓存内容进行一些控制,缓存的空间通常是有限的

2.9. 如果缓存项没有定期刷新,缓存将会填满

  • 2.9.1. 在这种情况下,缓存将采用最近最少使用或最少访问之类的策略来选择要剔除的缓存条目并为更新、更及时的结果腾出空间

2.10. 应用缓存可以显著提高吞吐量、减少延迟并提高客户端应用程序的响应能力

2.11. 一般的设计原则是最大化缓存命中率和最小化缓存未命中率

  • 2.11.1. 当发生缓存未命中时,必须通过查询数据库或下游服务来满足请求

  • 2.11.2. 然后可以将请求的结果写入缓存,用于后续的访问

2.12. 应用级缓存也被称为旁路缓存(cache-aside)模式

  • 2.12.1. 如果所需的结果在缓存中可用,则应用程序代码会高效地绕过数据存储系统

  • 2.12.2. 旁路缓存策略的一个显著优势是它对缓存故障更具弹性

  • 2.12.3. 在缓存不可用的情况下,所有请求基本上都当作缓存未命中来处理

  • 2.12.4. 扩展Redis和memcached之类的旁路缓存平台非常简单,得益于其简单的分布式哈希表模型

  • 2.12.5. 旁路缓存模式是大规模可扩展系统使用的主要方法

2.13. 缓存提供了“魔法”来确保缓存与后端存储系统进行适当的交互

2.14. NCache支持提供者接口(provider interface)由应用程序实现

  • 2.14.1. 接口会在通读缓存未命中和通写缓存写入时自动调用

  • 2.14.2. 通读、通写和后写策略需要这样一种缓存技术,该技术可以通过特定应用的处理程序进行扩充,以便在应用程序访问缓存时执行数据库的读取和写入

3. 通读缓存

3.1. 应用通过访问缓存来满足所有请求

3.2. 如果所需的数据在缓存中不可用,则调用加载器来访问数据系统并将结果加载到缓存中以供应用使用

4. 通写缓存

4.1. 应用总是将更新写入缓存

4.2. 当缓存更新时,将调用写入器将新的缓存值写入数据库

4.3. 当数据库更新后,应用可以完成请求

5. 后写缓存

5.1. 回写缓存

5.2. 与通写缓存类似,只是应用不等待将值从缓存写入数据库

5.3. 这种模式是以可能丢失更新(如果缓存服务器在数据库更新完成之前崩溃)为代价来提高请求响应能力

5.4. 是大多数数据库引擎内部使用的策略

6. Web缓存

6.1. Web缓存会在定义的时间段内存储给定资源(例如,网页或图像)的副本

6.2. 由于缓存在物理上更靠近客户端,因此请求的延迟会更低

6.3. 边缘缓存,也叫内容分发网络(CDN)

  • 6.3.1. 位于全球多个战略地理位置

  • 6.3.2. 可以缓存靠近客户端的频繁访问的数据

  • 6.3.3. 边缘缓存由CDN提供商在全球范围内部署

  • 6.3.4. Akamai是最早的CDN提供商,拥有2000多个站点,并在全球提供高达30%的互联网流量

  • 6.3.5. 对于拥有全球用户的富媒体站点,边缘缓存是必不可少的

6.4. 缓存通常只存储GET请求的结果,缓存键是与GET关联的URI

  • 6.4.1. 任何具有所请求资源副本的缓存都可以响应请求

6.5. Cache-Control

  • 6.5.1. 客户端请求和服务响应可以使用Cache-Control HTTP标头来定义缓存应该如何利用感兴趣的资源

6.6. Expires和Last-Modified HTTP标头与max-age指令互相配合以控制缓存数据的保留时间

  • 6.6.1. 缓存存储的资源是有限的

  • 6.6.2. 当请求访问一个有效资源时,缓存会用本地存储的结果提供服务,而无须联系源服务器

6.7. Etag

  • 6.7.1. 可用于控制缓存项新鲜度的指令

  • 6.7.2. Etag是一个不透明的值,Web缓存可以使用它来检查缓存的资源是否仍然有效

6.8. Web缓存如果能有效使用,可以显著减少延迟并节省网络带宽,对于图像和文档等大型项目尤其明显

6.9. Web缓存对部署静态数据(图像、视频和音频流)以及不经常变化的数据(如天气报告)最为有效

  • 6.9.1. Squid和Varnish等代理缓存广泛部署在互联网上

6.10. HTTP缓存与代理和边缘缓存相结合所提供的强大功能是构建可扩展应用的宝贵工具

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

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

相关文章

给树莓派添加 SSD1306 OLED 小屏幕

树莓派被作为一个小服务器使用的时候,通常都不需要接一台专用显示器,而是通过 ssh 远程登录。当环境中有多个设备使用远程登录的时候,就容易不记得相应设备的 IP 地址等信息;有时候只是需要了解设备的一些信息,例如 CP…

【GPU版】Windows下PyTorch入门深度学习环境安装与配置

如果电脑有NVIDIA GPU显卡,看【GPU版本】;否则,看【CPU版本】 聊聊PyTorch和Tensorflow 它们都是python的库/包 pip3是给python3使用的,由于现在用的python基本上都是3以上版本,所以pip和pip3没有区别 聊聊Anacond…

✔3290. 最高乘法得分

代码实现: 动态规划 /*从 b 中选一个长为 4 的子序列定义 dfs(i,j) 表示 从 b[0] 到 b[i] 中选出 j1 个数,去和 a[0] 到 a[j] 算一个点积的最大值考虑 b[i] 选或不选不选 dfs(i-1,j)选 dfs(i-1,j-1) a[j] * b[i]dfs(i,j) max(dfs(i-1),j), dfs(i-1,j-1…

FreeRTOS实战指南 — 2 移植 FreeRTOS 到 STM32F429

目录 1 准备裸机工程文件 2 创建FreeRTOS文件夹结构 3 修改Keil工程文件 3.1 添加工程文件 3.2 指定 FreeRTOS 头文件的路径 4 移植FreeRTOSConfig.h配置文件 4.1 移植FreeRTOSConfig.h 4.2 详解FreeRTOSConfig.h 4.3 修改FreeRTOSConfig.h 5 修改main.c 1 准备裸机工…

Java | Leetcode Java题解之第409题最长回文串

题目&#xff1a; 题解&#xff1a; class Solution {public int longestPalindrome(String s) {int[] count new int[128];int length s.length();for (int i 0; i < length; i) {char c s.charAt(i);count[c];}int ans 0;for (int v: count) {ans v / 2 * 2;if (v …

开源 AI 智能名片小程序:开启内容营销新境界

摘要&#xff1a;本文深入探讨了在当今数字化时代&#xff0c;内容营销的重要性以及如何实现让用户主动找你的最佳效果。通过引入开源 AI 智能名片小程序这一创新工具&#xff0c;阐述了其在明确目标用户群体、迎合用户需求痛点和打造风格特色方面的独特优势&#xff0c;为企业…

VMware ESXi 7.0U3q macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Server 2025

VMware ESXi 7.0U3q macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Server 2025 VMware ESXi 7.0U3q macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版) ESXi 7.0U3 标准版集成 Intel 网卡、Realtek USB 网卡 和 NVMe 驱动 请访问原文链…

虚幻引擎 | (类恐鬼症)玩家和NPC语音聊天(下)

上下文Conversation Array 要让GPT记住上下文&#xff0c;实现GPT4里的连续对话功能&#xff0c;需要把以下内容存入conversation array中去。 NPC background storyuser input promptNPC anwser open AI API的JsonObject JSONObject是一种数据结构&#xff0c;可以理解为JSO…

【最佳实践】配置类封装-Async异步注解以及自定义线程池

效果是&#xff1a;能点进去看到自定义的线程池&#xff0c;代表指定自定义的线程池成功&#xff01; 自定义Async线程池 自定义线程池 import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.…

Android14音频进阶之如何集成音效(八十五)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+…

Parallels Desktop 20 版本功能汇总,附最新PD虚拟机下载链接

Parallels Desktop 20 for Mac 已正式发布&#xff01;作为目前 Mac 上极为好用强大的「虚拟机」软件&#xff0c;它完美支持最新的 macOS Sequoia 15 系统和 Windows 11 24H2&#xff0c;这次还引入了许多诸如 AI 等令人期待的全新功能和改进。为普通用户、开发者、设计师都带…

第十一章 【后端】商品分类管理微服务(11.2)——Lombok

11.2 Lombok 官网:https://projectlombok.org/ 较新版本的 idea 已默认安装 lombok 插件 Lombok 工具提供一系列的注解,使用这些注解可以不用定义 getter、setter、equals、constructor 等,可以消除 java 代码的臃肿,编译时它会在字节码文件中自动生成这些通用的方法,简…

【算法专题】穷举vs暴搜vs深搜vs回溯vs剪枝

二叉树剪枝 LCR 047. 二叉树剪枝 - 力扣&#xff08;LeetCode&#xff09; 本题要求我们将全部为0的二叉树去掉&#xff0c;也就是剪枝&#xff0c;当我们举一个具体的例子进行模拟时&#xff0c;会发现&#xff0c;只关注于对其中一个子树的根节点进行剪枝&#xff0c;由于我…

企业竞争文化数据,词频分析(2007-2022年)

企业竞争文化的核心价值观包括&#xff1a; 追求卓越&#xff1a;鼓励员工不断超越自我&#xff0c;提升个人和团队的绩效。领导力&#xff1a;强调领导者在塑造竞争文化中的重要作用&#xff0c;引领团队向更高目标前进。创新思维&#xff1a;倡导员工面对挑战时采取创新方法…

25届计算机专业选题推荐-基于微信小程序的校园快递驿站代收管理系统

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于微信小程序的校园快递驿…

Golang | Leetcode Golang题解之第406题根据身高重建队列

题目&#xff1a; 题解&#xff1a; func reconstructQueue(people [][]int) (ans [][]int) {sort.Slice(people, func(i, j int) bool {a, b : people[i], people[j]return a[0] > b[0] || a[0] b[0] && a[1] < b[1]})for _, person : range people {idx : pe…

【SQL Server】清除日志文件ERRORLOG、tempdb.mdf

数据库再使用一段时间后&#xff0c;日志文件会增大&#xff0c;特别是在磁盘容量不足的情况下&#xff0c;更是需要缩减&#xff0c;以下为缩减方法&#xff1a; 如果可以停止 SQL Server 服务&#xff0c;那么可以采取更直接的方式来缩减 ERRORLOG 和 tempdb.mdf 文件的大小…

机器学习课程学习周报十二

机器学习课程学习周报十二 文章目录 机器学习课程学习周报十二摘要Abstract一、机器学习部分1.1 fGAN: General Framework of GAN1.2 CycleGAN1.3 Auto-Encoder1.4 概率论复习&#xff08;一&#xff09; 总结 摘要 本周的学习内容涵盖了fGAN框架、CycleGAN、自编码器以及概率…

【逐行注释】自适应Q和R的AUKF(自适应无迹卡尔曼滤波),附下载链接

文章目录 自适应Q的KF逐行注释的说明运行结果部分代码各模块解释 自适应Q的KF 自适应无迹卡尔曼滤波&#xff08;Adaptive Unscented Kalman Filter&#xff0c;AUKF&#xff09;是一种用于状态估计的滤波算法。它是基于无迹卡尔曼滤波&#xff08;Unscented Kalman Filter&am…

通义灵码在Visual Studio上

通义灵码在Visual Studio上不好用&#xff0c;有时候会出现重影&#xff0c;不如原生的自动补全好用&#xff0c;原生的毕竟的根据语法来给出提示的。