【性能设计篇】性能设计-缓存

news2024/10/5 19:11:37

前言

在分布式系统中,最耗费性能的地方就是数据库,而对于数据库的操作基本上就是添加,修改,删除和查询,对于前3者来说,基本上不会出现性能瓶颈。最耗费性能的地方就是查询了,对于查询有join、where、group by 、order by、 like等操作。并且绝大部分的系统都是读多写少。
分布式系统中,因为需要系统之间的调用,一般采用远程调用,那么这个网络耗时也会导致整体性能下降,为了挽救这样的性能开销,一般对于非实时业务,都需要采用缓存机制。
而缓存的身影无处不在,比如从用户角度来说,客户端、网关、CDN、Web容器、框架、ORM框架、本地缓存、分布式缓存、数据库、操作系统、网络等都有缓存的身影,所以合理的应用缓存提升性能已经是互联网必备的技术选型手段。

缓存更新模式

Cache Aside更新模式(旁路缓存模式)

  • 失效:应用程序先从cache中读取,没有的话,从数据库中读取,将数据保存到cache中
  • 命中:应用程序可以从cache中直接读取到缓存
  • 更新:应用程序更新数据,先更新数据库,成功后,将缓存置为失效。
    在这里插入图片描述
    在这里插入图片描述

旁路缓存的核心在于,更新数据的时候,另缓存失效。只有在查询缓存不在的时候,从DB中查询数据到缓存中。
那么这种模式就没有并发安全问题嘛,也就是在一瞬间有一个读操作没有命中缓存,会从数据库中读到数据A,但是同一时间存在一个写请求,将数据A修改成B,缓存就失效了,就可能出现一瞬间的数据不一致。
虽然上述问题出现的概率非常低, 所以针对这种模式,需要考虑具体的业务场景,如果是必须强一致性,需要使用锁、分布式锁进行解决。或者通过2PC或Paxos协议。

Read/Write Through更新模式(读写穿透)

与第一个相比 需要维护缓存和数据库两个数据源,而Read Write Through是把更新数据库的操作有缓存自己代理,对应用来说其实就是一个单一的缓存操作。
一般来说,我们很少见这种方式,主要是缓存中间件一般不提供数据同步到DB的功能
写(Write Through)

  • 先查缓存,缓存没有的话,直接更新DB
  • 缓存中存在,更新缓存,缓存进行异步的更新数据到DB中
    在这里插入图片描述

读 (Read Through)

  • 从缓存中读取数据,读到直接返回
  • 读取不到,从DB中加载,写入cache中返回。
    在这里插入图片描述
    Read-write Through模式来说,旁路缓存如果数据从缓存中查询不到,需要自己从DB中查询写入到缓存中,但是对于前者来说,这个过程由缓存来操作,对于客户端来说是一种透明的方式。

Write Behind Caching更新模式 (异步缓存写入)

相对于这种模式来说,和上述中Read/Write Through更新模式,都是由缓存服务来进行更新缓存和DB的。唯一的不同点是,前者是异步方式更新,后者是同步方式。
显然这种方式对于数据一致性带来了更大的挑战。
应用场景:消息队列中消息的异步写入磁盘、MySQL的InnoDB buffer pool的机制都是这种策略,主要适用于对数据强一致性不高的场景。
所以在软件设计中,不可能设计出一个完美的设计方案,有时候强一致性和高性能、高可用是有冲突的,软件设计从来都是trade-off.

缓存设计的重点

目前在分布式缓存主流使用的是Redis,而一般不建议在服务的Local cache,一个是如果服务进行负载均衡,那么服务是有状态不利于横行扩容。而是一般机器内存都不大。

  • 分布式下数据切片,集群、可用性搭建
  • 缓存的命中率
  • 缓存是通过牺牲强一致性来提高性能的。
  • 缓存周期的设置
  • 缓存淘汰策略,一般LRU。
    需要从以上角度进行设计缓存。

小结

本篇主要介绍了缓存更新的三大策略、分别是旁路缓存、读写穿透、异步缓存写入,目前主流还是使用的第一种比较多。缓存主要是牺牲数据强一致性来提升系统的性能。

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

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

相关文章

Kafka相关知识

一、基本概念及流程 Broker:kafka集群中的实例Topic:队列的主题,逻辑概念;Partition:Topic分区,物理概念,同意parttion内消息有序;Producer & Consumer:生产消息的客户端 & 消费消息的客户端,kafka认为是服务器。将每个Topic划分为多个分区Partition,每个分…

Vim (NeoVim) 配置

Vim 基础 模式 o 代表的是open a new line i 代表的是insert a 代表的是append Visual [Character] 视觉模式:用于选择单个字符(v小写’v’)视觉线模式:用于一次选择整条线(V大写“V”)视觉块模式&#…

深度学习数据集—动物数据集大合集(二)

近期又整理了一批各类动物数据集,分享给大家。废话不多说,直接上干货!! 1、151种动物图片数据集共6271张,图片大小:224x224 jpg ​ ​ 下载地址:151种动物图片数据集 2、9种海洋生物&#xff0…

C++学习之字符常量、字符串常量和符号常量的区别

字符常量 字符常量就是把一个字符用单引号括起来。 注: 字符常量只能包含一个字符,如’AB’是不合法的字符常量区分大小写字母单引号“ ’ ”是定界符,而不属于字符常量的一部分 字符串常量 字符串常量时用双引号括起来的字符序列。 举例…

kill 命令信号详解

信号 列出所有信号 $ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18…

【数据结构】交换排序(详细)

交换排序 1. 冒泡排序2. 快速排序2.1霍尔版本2.2 挖坑法2.3 前后指针法(最优)2.4 小区间优化2.5 非递归快排 1. 冒泡排序 思想 排升序:每趟将前后两元素进行比较,按照“前小后大”进行交换,将最大的元素放在最后。 排…

Solr(3):Solr的名词解释及配置文件说明

1 名称解释 1.1 索引库 我们导入数据,solr 会被它以某种格式保存在索引库里面! 可以看出刚安装的现在没有任何索引库 1.2 索引分词 Solr在导入数据库时,会对某些语句进行分词 1.3 搜索分词 Solr在搜索数据库时,会对某些语句进…

PyQt5桌面应用开发(10):界面布局基本支持

本文目录 PyQt5桌面应用系列布局利器游戏总结 PyQt5桌面应用系列 PyQt5桌面应用开发(1):需求分析 PyQt5桌面应用开发(2):事件循环 PyQt5桌面应用开发(3):并行设计 PyQt5桌…

星火认知大模型发布,科大讯飞入场科技巨头AI大战?

自从ChatGPT横空出世,一个更美好的世界开始向我们招手。为了推开新时代的大门,几乎所有人工智能厂商都投入了最大的热情逐浪AIGC。 5月6日,科大讯飞召开了“讯飞星火认知大模型”成果发布会。发布会现场,科大讯飞董事长刘庆峰展示…

Hadoop[3.3.x]-1本地环境搭建

环境:Mac Hadoop版本:Apache Hadoop 3.3.4 由于hadoop依赖java环境,所以需要事先安装好java。 Hadoop下载 进入官网进行下载Apache Hadoop 下载后解压到自己的规划的目录。 环境文件配置 Hadoop相关配置文件都在目录的../hadoop-3.3.4/et…

Vulkan 总结

一、Vulkan 对象简介 1、VKInstance 这个对象是我们 Vulkan api 的一个对象,用于通过 Instance 我们与 Vulkan 底层进行交互。 2、VkPhysicalDevice 对应我们当前设备(PC、手机)的一个显卡硬件(GPU ),有的…

如何导出cloudflare warp内部存的私钥和token

结论:管理员身份运行 mimikatz:https://github.com/gentilkiwi/mimikatz/releases/tag/2.2.0-20220919 然后输入: privilege::debug (提升权限到:NT-AUTHORITY\SYSTEM)以及sekurlsa::credman 就能看到&…

Java中的反射(通过反射获取类的结构、invoke方法、获取注解)

文章目录 1. 创建运行时类的对象2. 获取运行时类的完整结构2.1 相关API2.2 获取所有的属性及相关细节2.3 获取所有的方法及相关细节2.4 获取其他结构(构造器、父类、接口、包、注解等)2.5 获取泛型父类信息2.6 获取内部类或外部类信息2.7 总 结 3. 调用运行时类的指定结构3.1 调…

HDOJ 1022 Train Problem Ⅰ 模拟栈操作

🍑 OJ专栏 🍑 HDOJ 1022 Train Problem Ⅰ 输入 3 123 321 3 123 312输出 Yes. in in in out out out FINISH No. FINISH🍑 思路 🍤 栈顶元素与目标元素不匹配就进栈,匹配就出栈 🍤 匹配完:y…

es 7.0.8 常用操作(windwos版本安装,索引crud操作)

一 es7.x的核心 1.1 es的核心概念 1.ES 里的 Index 可以看做一个库(名称必须为小写),而 Types 相当于表,Documents 则相当于表的行。 2.这里 Types 的概念已经被逐渐弱化,Elasticsearch 6.X 中,一个 index 下已经只能包含一个…

分布式搜索引擎——elasticsearch搜索功能

DSL查询语法 DSL Query的分类 Elasticsearch提供了基于JSON的DSL (Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,一般测试用。例如:match_all全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排…

Java 基础进阶篇(九)—— Java集合详细总结

文章目录 一、集合类体系结构二、Collection系列集合2.1 Collection 集合体系2.2 Collection 集合体系特点2.3 Collection 常用API2.4 Collection 集合的遍历方式2.4.1 方式一:迭代器2.4.2 方式二:foreach(增强for循环)2.4.3 方式…

Java8新特性—Optional类

前言 Java 8中引入了一个新的Optional类,它可以让开发人员更好地处理可能为空的值。Optional类提供了一种方式,可以更加优雅地处理null值,并在运行时避免NullPointerException异常的出现。本文将介绍Optional类的基本语法、使用场景和示例。…

Java 基础进阶篇(十)—— 泛型与可变参数

文章目录 一、泛型概述二、泛型的定义2.1 泛型类2.2 泛型方法2.3 泛型接口 三、泛型深入3.1 泛型通配符3.2 泛型上下限3.3 案例:定义一个 “所有车量进行比赛” 的方法 四、可变参数 一、泛型概述 泛型是 JDK5 中引入的特性,可以在编译阶段约束操作的数…

Linux应用开发:进程间通信 System V

目录 1、查看删除IPC对象 1.1 IPC对象 1.2 ipcs 命令查看系统中的 IPC 对象 1.3 ipcrm 命令删除系统中的 IPC 对象 2、共享内存 2.1 共享内存简介 2.2 共享内存相关API 2.2.1 shmget:创建共享内存 2.2.2 shmat:映射共享内存 2.2.3 shmdt&#…