什么是缓存?

缓存就像是一个超快速的存储区域,保存了计算机或手机经常使用的内容的副本,这样可以在不访问较慢的主存储器的情况下快速获取。

一个现实中的例子可以是,每当我们购买杂货时,通常会倾向于大量购买,这样可以让杂货多存放一段时间,避免频繁去市场购买,这其实就是将杂货缓存在我们附近,而不是每次都从市场购买。

在系统设计中,如果缓存得当,它可以显著提升系统的性能。

缓存策略取决于数据访问模式,即数据是如何读取或写入的。例如:

•系统是读取密集型还是写入密集型?•系统是否需要高一致性?

等等……

因此,选择正确的写入缓存策略非常关键,下面是一些不同的缓存策略

1. 缓存旁路(懒加载)

在这种设置中,应用程序缓存被分离出来,应用程序显式地与缓存和数据库一起工作。这是一种技术,应用程序代码负责管理缓存。当需要时,应用程序会将数据显式加载到缓存中,而缓存不会主动参与数据获取。

 缓存旁路

该图示了其工作原理。

使用场景:

适用于读取密集型系统,Redis 或 Memcached 非常受欢迎,我曾经在缓存旁路设置中使用过 Redis 以及 Mongo-db,效果非常显著。

这种读取技术可以与诸如写入旁路缓存之类的数据写入技术相结合,我接下来会解释。

优点:

灵活性:允许选择性缓存特定数据。•控制:应用程序控制数据何时加载到缓存中。

缺点:

提供过期数据:可能会提供过期数据,但如果我们实现了缓存的TTL(生存时间),则可以避免这种情况。

2. 写入旁路

跳过缓存,直接将数据写入数据库,并在读取用户请求的数据时更新缓存。

使用场景:

写入旁路可以与读取通过结合,对于数据写入一次,读取频率较低或几乎不读取的情况下提供良好的性能,例如实时日志或聊天室消息。同样,这种模式也可以与缓存旁路结合使用。

3. 读取穿透缓存

读取穿透缓存是一种策略,当发生缓存未命中时,缓存会自动从底层数据源检索数据并填充自身。这种技术与应用程序的数据访问层无缝集成,确保缓存与数据源保持同步。

 读取穿透缓存

使用场景、优点和缺点:

读取穿透缓存适用于读取密集的工作负载,当同一数据被多次请求时。例如,一个新博客。缺点是,当首次请求数据时,总是会导致缓存未命中,并造成额外的数据加载开销。

4. 写入穿透缓存

写入穿透缓存是一种策略,其中写操作同时应用于缓存和底层数据源。这确保了缓存和数据源保持同步,但与写入后缓存相比可能会引入额外的延迟。它同步应用更新。

 使用场景、优点和缺点:

当与读取穿透缓存结合时,写入穿透缓存可以保证每次读取和写入的数据一致性。但它会增加写操作的额外开销,因为每次写入都需要两次写入操作(缓存和数据库)。它以异步方式应用更新。

5. 写入后缓存

写入后缓存,也称为写回缓存,涉及在写操作发生时延迟对数据源的更新。系统不会立即更新底层存储,而是首先更新缓存,然后异步将更改传播到数据源。

 使用场景、优点和缺点:

写回缓存提高了写入性能,非常适用于写入密集型任务。当与读取穿透结合时,适用于混合工作负载,确保最近的

数据可用。

总结:

本文探讨了缓存技术,强调了根据数据访问模式选择正确策略的重要性。了解这些缓存策略对于在不同场景中优化系统性能至关重要。

posted @ 2023-12-21 10:24 冰山奇迹 阅读(24) 评论(0) 推荐(0) 编辑
摘要: 语言支持类型别名typedef,显然,CPP也支持咯。不过自CPP11(也称之为Modern CPP)开始,引入了using关键字用以表示类型别名。 创建类型别名 typedef和using都可以创建类型别名,区别是在语法语义上的不同。 typedef的语法如下: typedef [original 阅读全文
posted @ 2023-12-20 10:21 冰山奇迹 阅读(96) 评论(0) 推荐(0) 编辑
摘要: 文章目录 C++ 11是什么,C++ 11标准的由来C++ auto类型推导完全攻略auto 类型推导的语法和规则auto 的高级用法auto 的限制auto 的应用使用 auto 定义迭代器auto 用于泛型编程 C++ decltype类型推导完全攻略exp 注意事项 decltype 推导规则 阅读全文
posted @ 2023-12-05 17:02 冰山奇迹 阅读(2689) 评论(0) 推荐(0) 编辑
摘要: 前言 SQL程序语言有四种类型,对数据库的基本操作都属于这四类,它们分别为;数据定义语言(DDL)、数据查询语言(DQL)、数据操纵语言(DML)、数据控制语言(DCL) 数据定义语言(DDL) DDL全称是Data Definition Language,即数据定义语言,定义语言就是定义关系模式、 阅读全文
posted @ 2023-12-04 11:09 冰山奇迹 阅读(349) 评论(0) 推荐(0) 编辑
摘要: thread_local 是 C++ 11 新引入的一种存储类型,它会影响变量的存储周期。 C++ 中有 4 种存储周期: automatic static dynamic thread 有且只有 thread_local 关键字修饰的变量具有线程(thread)周期,这些变量在线程开始的时候被生成 阅读全文
posted @ 2023-11-30 10:25 冰山奇迹 阅读(483) 评论(0) 推荐(0) 编辑
摘要: 引言 在当今的软件开发世界中,C++以其高效的性能和广泛的应用领域而受到开发者的青睐。然而,随着项目规模的不断扩大和性能需求的日益增长,如何优化编译器的输出代码质量成为了亟待解决的问题。本文将深入探讨C++编译优化技术,帮助您提高代码执行效率、减少内存占用和降低功耗。 一、理解编译器优化选项 编译器 阅读全文
posted @ 2023-11-21 10:56 冰山奇迹 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 一、什么是容器? 所谓容器,就是可以承载,包含元素的一个器件,它是STL六大组件之一,是容器、算法、迭代器中最重要也是最核心的一部分。 二、STL中各大容器的结构与分类 2.1 顺序性容器 2.1.1 什么是顺序性容器? 顺序性容器就是将一组具有相同类型的元素以严格的线性形式组织起来 2.1.2 有 阅读全文
posted @ 2023-11-20 11:40 冰山奇迹 阅读(66) 评论(0) 推荐(0) 编辑
摘要: 1、可以通过git branch -r 命令查看远端库的分支情况 动图演示(选择项目右键选择 Git Bash Here,然后输入命令git branch -r): 2、从已有的分支创建新的分支(如从master分支),创建一个dev分支 但此时并没有在远程仓库上创建分支 如图所示 还是只有一个ma 阅读全文
posted @ 2023-11-07 11:00 冰山奇迹 阅读(674) 评论(1) 推荐(0) 编辑
摘要: Git还原到指定版本方法一、命令行操作: 1、获取某个历史版本的id 使用git-gui执行git log命令查看所有的历史版本,输入q便可退出。 git log 2、本地恢复到该节点状态: git reset --hard fa4bf08fed85fc0ca5acde22464e68c6f8cfc 阅读全文
posted @ 2023-11-07 10:56 冰山奇迹 阅读(531) 评论(0) 推荐(0) 编辑
摘要: 引言 在之前的内容中,我们已经详细讲解了TCP面试中最常见的问题,如三次握手和四次挥手等。而今天,我们将继续深入探讨TCP协议的其他方面,比如序列号和TCP Fast Open(TFO)等重要细节问题。这些内容将为你在面试中提供更全面的知识储备。 为什么 SYN/FIN 不包含数据却要消耗⼀个序列号 阅读全文
posted @ 2023-11-03 10:26 冰山奇迹 阅读(72) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示