自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(58)
  • 收藏
  • 关注

原创 Innodb架构解析

:在MySQL5.6.6以及之后的版本中,InnoDB并不会默认把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个.ibd的扩展名。):系统表空间可以对应文件系统上一个或多个实际的文件,默认情况下,InnoDB会在数据目录下创建一个名为ibdata1的文件,这个文件就是对应的系统表空间在文件系统上的表示。

2024-04-11 22:40:43 1112

原创 多线程回答的滚瓜烂熟,面试官问我虚线程了解吗?我说不太了解!

虚拟线程是由 Java 虚拟机调度,它的占用空间小,同时使用轻量级的任务队列来调度虚拟线程,避免了线程间基于内核的上下文切换开销,因此可以极大量地创建和使用。主要有以下好处:虚拟线程是轻量级的,它们不直接映射到操作系统的线程,而是由JVM在用户态进行管理。这种轻量级特性允许在单个JVM实例中同时运行数百万个虚拟线程。虚拟线程大大简化了并发编程的复杂性。开发者可以像编写顺序代码一样编写并发代码,而无需担心传统线程编程中的许多复杂问题,如线程数、同步和资源竞争等。

2024-04-11 22:08:16 655

原创 面试官:一条SQL是如何执行的?

它对表的大小有要求,不能建立太大的表。如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果。当一条SQL查询返回的数据量超过了剩余的查询缓存空间或缓冲池空间时,MySQL通过不缓存该查询结果、使用LRU算法淘汰不常用的数据页、刷新脏页到磁盘等方式来处理这种情况,确保查询可以成功执行并返回结果。需要注意的是,MySQL的物理文件层是存储引擎特定的,不同存储引擎可能使用不同的文件格式和组织方式。

2024-03-30 18:52:37 1218 1

原创 一文打尽分布式系统中的事务处理!

在构建现代分布式系统时,维持跨多个服务的数据一致性是一项艰巨的任务。想象一下,你正在在线商城上购物,准备为GDP贡献自己的一份力量。在你按下“提交”按钮的那一刻,幕后发生了什么?系统需要同时完成两项操作:在库存服务中减少商品数量和在订单服务中创建订单记录。在单体架构中,这些操作会在同一个事务内完成,但分布式系统中的复杂性远远超出这个范围。方案概述使用场景XA事务依据两阶段、三阶段提交协议进行分布式事务管理需要强一致性的场景,如金融系统最大努力通知不保证ACID特性,尽力而为。

2024-03-23 20:49:49 1179

原创 深入解析权限之钥RBAC模型!

下面我们通过一个图片可以直观地理解不同 RBAC 模型的结构和它们之间的关系。RBAC 为复杂的权限管理提供了一种清晰、高效的解决方案。在实际应用中,可以根据系统的具体需求选择合适的 RBAC 模型。

2024-03-21 22:22:09 359

原创 面试官问到Dubbo SPI怎么办?一文让你应对自如!

是Java中一种服务提供者接口的设计模式,它提供了一种机制,允许组件在不同的实现之间进行插拔,从而实现松耦合的架构。SPI通常用于实现插件化、可扩展的应用程序,使开发人员能够轻松地添加、替换或定制系统中的功能模块。image.png当服务的提供者提供了一种接口的实现之后,需要在classpath下的目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体的实现类。当其他的程序需要这个服务的时候,就可以通过查找这个jar包(一般都是以jar包做依赖)的。

2024-03-20 22:25:14 951

原创 单点登录:一把钥匙开启所有门

通过实施SSO,企业可以极大地简化用户的登录流程,加强数据安全,提高工作效率。无论是采用CAS还是OAuth 2.0,关键在于选择最适合企业自身需求和现有架构的解决方案。

2024-03-18 21:53:26 1206

原创 高并发缓存策略大揭秘:面试必备的缓存更新模式解析

在高并发场景中,缓存能抵挡大量数据库查询,减少数据库压力,对于缓存更新通常有以下几种模式可以选择: cache asideread/write through write behind cachingCache-aside模式是一种常用的用于管理缓存的模式。它用于确保缓存与底层数据源之间的数据一致性。以下是cache-aside模式的工作原理:1. 从缓存读取:当有读取操作请求时,应用程序首先检查缓存中是否存在数据。如果在缓存中找到了数据,则将其返回给调用者,避免了访问底层数据源的需要。2. 缓存未命中:如

2024-03-17 22:49:30 989

原创 如何用saga实现分布式事务?

SAGA事务模式的历史十分悠久,比分布式事务的概念提出还要更早。SAGA的意思是“长篇故事、长篇记叙、一长串事件”,它起源于1987年普林斯顿大学的赫克托 · 加西亚 · 莫利纳()和肯尼斯 · 麦克米伦()在ACM发表的一篇论文《SAGAS》。文中提出了一种如何提升“长时间事务”()运作效率的方法,大致思路是把一个大事务分解为可以交错运行的一系列子事务的集合。原本提出SAGA的目的,是为了避免大事务长时间锁定数据库的资源,后来才逐渐发展成将一个分布式环境中的大事务,分解为一系列本地事务的设计模式。

2024-03-17 22:47:04 1311

原创 使用Seata实现分布式事务真香!

一致性保证:Seata 保证了分布式事务的一致性,即使在复杂的分布式场景中也能确保数据的一致性。易于集成:Seata 提供了对多种流行分布式事务的集成能力,使在微服务架构中使用分布式事务变的简单。高可用和可扩展:Seata 设计了高可用和可扩展性,可以支持大规模的微服务架构。在微服务架构中处理分布式事务是一个复杂的问题,但 Seata 提供了一个简单有效的解决方案。通过理解 Seata 的核心组件和工作流程,开发者可以更加自信地在自己的微服务项目中实现分布式事务管理。

2024-03-16 17:42:28 884

原创 使用Seata实现分布式事务真香!

分支事务利用 RM 模块中对 JDBC 数据源代理,加入了若干流程,对业务 SQL 进行解释,把业务数据在更新前后的数据镜像组织成回滚日志,并生成 undo log 日志,对全局事务锁的检查以及分支事务的注册等,利用本地事务 ACID 特性,将业务 SQL 和 undo log 写入同一个事物中一同提交到数据库中,保证业务 SQL 必定存在相应的回滚日志,最后对分支事务状态向 TC 进行上报。如果某个局部事务失败,之前执行的局部事务会按照相反的顺序执行其反向操作,以达到回滚的效果。

2024-03-15 21:13:57 1145

原创 高并发缓存策略大揭秘:面试必备的缓存更新模式解析

这种模式也有其他的问题,比如数据不是强一致性的,因为把最新的数据放在缓存里,如果缓存在flush到数据库之前宕机了就会丢失数据,另外实现也比较复杂。当客户端请求一个数据时,如果缓存中不存在该项(缓存未命中),缓存系统会自动从后端存储中加载数据,然后将其添加到缓存中,并返回给客户端。Write Behind模式和Write Through模式整个架构是一样的,核心在于write through在缓存数据库中的更新是同步的,而Write Behind是异步的。先更新DB,再失效缓存也会出现问题。

2024-03-15 12:39:23 1119

原创 如何确定限流阈值:面试官问我,我怎么答?

在面试过程中,系统高并发是经常需要考察的,而熔断限流又是必考的,当面试官问及如何确定限流的阈值时,他们实际上是在考察你是否理解限流的本质及其在实际工作中是否有过经验。限流是一种常用的系统保护措施,用于防止过量流量或请求冲垮后端服务。正确设置限流阈值对于维持系统的稳定性和可用性至关重要,下面我们一起深入了解如何在面试中回答这一问题,并在实际工作场景中如何确定限流阈值。总体上来看有4个方法:压测、观测、类比、手动计算。

2024-03-12 21:15:54 705

原创 如何使用最大努力通知实现分布式事务?与本地消息表区别?

最大努力通知()是一种在分布式系统中处理分布式事务的方法之一,它强调尽力而为,不保证完全的事务一致性,但可以通过一定的机制来提供部分保证。在最大努力通知中,主要目标是在发生分布式事务失败时,尽可能地通知相关的参与者或系统,以尝试进行后续的处理或补偿。最大努力通知的主要特点和流程如下:1.参与者执行本地事务操作。2.当参与者的事务操作成功完成后,它会尝试通知其他相关的参与者。通知可以通过消息队列、HTTP请求、RPC等方式进行。3.最大努力通知通常是异步的,即通知发出后,不会等待接收方的确认。

2024-03-11 22:49:25 1143

原创 一图看懂Redis持久化机制!

每秒写回”采用一秒写回一次的频率,避免了“同步写回”的性能开销,虽然减少了对系统性能的影响,但是如果发生宕机,上一秒内未落盘的命令操作仍然会丢失。虽然“操作系统控制的写回”在写完缓冲区后,就可以继续执行后续的命令,但是落盘的时机已经不在 Redis 手中了,只要 AOF 记录没有写回磁盘,一旦宕机对应的数据就丢失了;AOF日志文件是一个纯追加的文件。:AOF日志文件采用追加写入的方式,每个写操作都会以命令的形式被追加到AOF文件的末尾,这确保了AOF文件包含了导致数据库状态变化的每个命令。

2024-03-10 22:09:44 1426

原创 业务代码中如何使用装饰器模式?

装饰器模式(Decorator Pattern)是一种结构型设计模式,我们可以动态地给一个对象添加额外的职责。而不是通过继承增加子类的方式来扩展对象的功能,装饰器模式使用组合的方式来增强对象的功能,这有助于保持类的职责单一,提高了类的复用性和灵活性。装饰器模式通常涉及以下角色:• 组件(Component)接口:定义了一个对象接口,可以动态地给这些对象添加职责。• 具体组件(Concrete Component):实现了组件接口的对象,这是我们要动态添加职责的对象。

2024-03-08 19:35:23 1136

原创 用位运算维护状态码,同事直呼牛X!

已创建(Created): 0001 (1)已支付(Paid): 0010 (2)已发货(Shipped): 0100 (4)已完成(Completed): 1000 (8)

2024-03-06 20:58:35 525

原创 敏感数据如何加密?

敏感数据的加密是数据安全的重要方面,尤其是对于手机号和身份证号这类个人信息。如果这些信息以明文形式存储在数据库中,一旦数据库被黑客攻破,大量的个人信息就会泄露,可能被用于不法活动。数据加密可以在不同的层面上实现,例如应用层、数据库层或传输层。这里,我们将讨论在业务中如何加密敏感数据。

2024-03-05 12:24:11 1501

原创 kafka如何保证消息顺序性?

kafka架构如下:Kafka 保证消息顺序性的关键在于其分区(Partition)机制。在 Kafka 中,每个主题(Topic)可以被分割成多个分区,消息被追加到每个分区中,并且在每个分区内部,消息是有序的。但是,Kafka 只保证单个分区内的消息顺序,而不保证跨分区的消息顺序。

2024-03-04 19:02:35 2859

原创 如何用TCC实现分布式事务?

是除可靠消息队列以外的另一种常见的分布式事务机制,它是由数据库专家帕特 · 赫兰德()在2007年撰写的论文《Life beyond Distributed Transactions: An Apostate’s Opinion》中提出的。正式以作为名称的是Atomikos公司,其注册了TCC商标。上次我们分享的使用RocketMQ实现分布式事务,虽然它也能保证最终的结果是相对可靠的,过程也足够简单(相对于TCC来说),但可靠消息队列的整个实现过程完全没有任何隔离性可言。

2024-03-03 14:34:42 1068

原创 适配器模式在微服务的巧妙应用

目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。待适配的类(Adaptee):需要被适配的类或接口。适配器(Adapter):通过包装一个需要被适配的对象,把原接口转换成目标接口。类适配器模式:通过继承来实现适配器功能。对象适配器模式:通过组合来实现适配器功能。通过适配器方式,我们可以将不兼容的接口或数据模型转换为我们的系统可以使用的形式,同时保持系统的整洁和一致性。这样做还有助于隔离系统与外部服务的直接依赖,当外部服务变化时,只需修改适配器逻辑,而不会影响到系统的其他部分。

2024-03-02 23:26:16 1339

原创 分布式事务之2、3段提交协议

当一个事务跨越多个节点时,为了保持事务的一致性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。TM 通过 XA 接口与各个 RM 之间进行数据交互,从第一阶段的准备阶段,业务所涉及的数据就被锁定,并且锁定跨越整个提交流程。请求后,正常情况下,如果自身认为可以顺利执行事务,那么会反馈 Yes 响应,并进入预备状态,否则反馈 No。参与者在此阶段会执行事务的预提交,并向协调者发送。

2024-02-27 21:12:46 1311

原创 JVM跨代引用垃圾回收

在Java堆内存中,年轻代和老年代之间存在的对象相互引用,假设现在要进行一次新生代的YGC,但新生代中的对象可能被老年代所引用的,为了找到新生代中的存活对象,不得不遍历整个老年代。这样明显效率很低下,那么如何快速识别并回收这种引用对象呢?

2024-02-26 20:52:28 1049

原创 kafka为什么性能这么高?

Broker中需要将大量的消息做持久化,而且存在大量的消息查询场景,如果采用传统的IO操作,会带来大量的磁盘寻址,影响消息的查询速度,限制了Kafka的性能。2. 找到的 segment 中的.index文件,用查找的offset减去.index文件名的offset,也就是00000.index文件,我们要查找的offset为3的message在该.index文件内的索引为3(index采用稀疏存储的方式,它不会为每一条message都建立索引,而是每隔4k左右,建立一条索引,避免索引文件占用过多的空间。

2024-02-23 21:12:38 4386 2

原创 如何使用rocketmq实现分布式事务?

事务消息是 Apache RocketMQ 提供的一种高级消息类型,支持在分布式场景下保障消息生产和本地事务的最终一致性。RocketMQ的分布式事务又称为“半消息事务”。使用半消息实现分布式事务在提供分布式事务支持和保证消息传递的原子性方面具有优势,但需要引入MQ并提供查询事务接口。在选择是否使用半消息实现分布式事务时,需要根据具体的业务需求和系统性能要求来进行权衡和选择。

2024-02-22 21:42:36 1312

原创 如何通过本地消息表实现分布式事务?

单独创建一个后台线程或定时任务,定时扫描本地消息表中状态为待发送的消息,并将这些消息发送到消息队列。通过本地消息表(也称为可靠消息表)实现分布式事务是一种常见的做法,用于保证在分布式环境中消息的可靠传递和事务的一致性。如果本地事务失败,回滚本地事务和消息表的记录。在数据库中创建一个本地消息表,用于存储待发送的消息以及消息的发送状态和相关信息。• 生产方和消费方定时扫描本地消息表,把还没处理完成的消息或者失败的消息再发送一遍。:在业务逻辑中,当需要发送消息时,首先将消息插入到本地消息表中,设置状态为待发送。

2024-02-21 18:30:06 1763

原创 面试回答Redis是单线程的所以很快,面试官让我回去等通知

当面试官再问Redis为啥这么快时别傻傻再回答Redis是单线程了,否则只能回去等通知了。Redis的多线程网络模型通过将读取和写回数据的任务异步化,以及更好地利用多核CPU,从而提高了Redis在处理大量在线流量时的性能表现。多线程设计Redis多线程模型包括一个主线程(Main Reactor)和多个I/O线程(Sub Reactors)。主线程负责接受新的连接,并将其分发到I/O线程进行独立处理。I/O线程负责读取客户端的请求命令,但不执行它们。主线程负责执行客户端的请求命令,包括解析和执行。

2024-02-20 18:44:25 1730

原创 使用Docker Compose搭建Redis哨兵架构

之前我们通过深入理解REDIS哨兵原理了解了Redis哨兵(sentinel)的原理,今天我们手动部署一个哨兵架构。要在Docker中搭建Redis哨兵(sentinel)架构,需要Redis的主从实例以及哨兵实例。之前我们已经使用Docker Compose搭建Redis主从复制过了,下面我们通过Docker Compose创建一个Redis哨兵架构。

2024-02-18 13:11:58 736

原创 深入理解Redis哨兵原理

Redis 的主从架构中,由于主从模式是读写分离的,如果主节点(master)挂了,那么将没有主节点来服务客户端的写操作请求,也没有主节点给从节点(slave)进行数据同步了。在实际生产环境中,服务器难免会遇到一些突发状况:服务器宕机,停电,硬件损坏等等,一旦发生,后果不堪设想。 Redis 在 2.8 版本以后提供的哨兵(Sentinel)机制,它的作用是实现主从节点故障转移。它会监测主节点是否存活,如果发现主节点挂了,它就会选举一个从节点切换为主节点,并且把新主节点的相关信息通知给从节点和客户端。

2024-02-17 16:26:59 1027

原创 使用Docker Compose搭建Redis主从复制

在Docker中搭建Redis主从架构非常方便,下面是一个示例,演示一下如何使用Docker Compose搭建一个Redis主从复制环境。首先,确保我们本地环境已经安装了Docker和Docker Compose。

2024-02-16 22:24:34 859

原创 kafka如何保证消息不丢?

我们知道Kafka架构如下,主要由 Producer、Broker、Consumer 三部分组成。一条消息从生产到消费完成这个过程,可以划分三个阶段,生产阶段、存储阶段、消费阶段。产阶段: 在这个阶段,从消息在 Producer 创建出来,经过网络传输发送到 Broker 端。存储阶段: 在这个阶段,消息在 Broker 端存储,如果是集群,消息会在这个阶段被复制到其他的副本上。消费阶段: 在这个阶段,Consumer 从 Broker 上拉取消息,经过网络传输发送到Consumer上。

2024-02-15 10:23:09 3864 1

原创 通用防重幂等如何设计?

所以,对于 POST 的方式,很可能会出现多次提交的问题,就好比,我们在论坛中发帖时,有时候因为网络有问题,可能会对同一篇贴子出现多次提交的情况。如果查找到了,那么就不再做查询了,并把上次做的结果返回。举例来说,一个更新用户信息的操作,如果是幂等的,那么多次执行相同的更新操作不会产生副作用,用户信息也不会发生额外的改变。总结起来,防止重复处理是为了避免相同请求或操作的重复执行,而幂等性是一种特性,保证相同的操作在多次执行时会得到相同的结果,并且不会对系统状态产生副作用,从而能够帮助实现防止重复处理的目标。

2024-02-13 20:36:18 1216

原创 春运一票难求,候补抢票显威,如何设计一个候补订单系统?

那么如何设计一个12306火车票候补功能的系统呢?设计一个12306火车票候补功能的系统我们需要考虑的主要模块包括乘客候补系统、车票余量监控、排队、通知机制以及支付与出票等核心环节。我们可以根据车次、车站、日期、乘车人数设计一个队列,并通过 Redis 的 Hash 结构实现,保证了订单信息的管理和处理的高效性和可靠性。

2024-02-08 11:19:23 1175

原创 数据库中间件介绍

数据库中间件是一种介于数据库系统和应用程序之间的软件层。它充当了一个抽象层,屏蔽了底层数据库的细节,为应用程序提供了更简化的接口。数据库中间件的主要目标是提供更高的性能、可用性、可扩展性,并简化数据库管理。典型的数据库中间件设计方案有3种:proxy、smart-client、单元化架构

2024-02-06 12:51:11 2200

原创 一图彻底搞懂JVM流程

类加载器按照类的全限定名定位类文件,将二进制数据流转化为方法区内的运行时数据结构,并最终创建 java.lang.Class 类的实例。:每个线程拥有一个私有的栈,用于存储方法调用时的局部变量、操作数栈和动态链接信息等,每一个方法调用都会对应一个栈帧(Stack Frame)。• -XX:PermSize 和 -XX:MaxPermSize:设置永久代的初始大小和最大大小(在Java 8及之前的版本中使用)。类创建对应的类对象,在这个例子中,Test类的字节码信息将被加载到方法区。

2024-02-04 18:42:44 1362

原创 Docker搭建MySQL8主从复制

之前文章我们了解了mysql bin-log原理,这里我们用Docker搭建主从复制环境。

2024-02-02 22:21:49 1521

原创 面试官:说一说Binlog是怎么实现的

简单来说,“复制”就是将来自一个MySQL Server(这里指master角色,即主库)的数据变更,通过其逻辑的二进制日志(binlog)传输到其他的一个或多个MySQLServer(这里指slave角色,即从库)中,其他MySQL Server通过应用(回放)这些逻辑的二进制日志来完成数据的同步。这些MySQL Server之间的逻辑关系,我们称为“复制拓扑”(也可以称为“复制架构”)。MySQL的复制功能是构建MySQL大规模、高性能应用的基础。我们可以通过配置一个或者多个备库的方式来进行数据同步。

2024-02-01 13:02:46 1037

原创 一文打尽Java垃圾回收器

有 8 种不同的垃圾回收器,它们分别用于不同分代的垃圾清理•新生代(复制算法):Serial,ParNew,Parallel Scavenge•老年代(标记-清除、标记-整理):SerialOld,Parallel Old,CMS•整堆:G1,ZGC

2024-01-29 13:05:09 1292

原创 业务程序中如何设置线程数?

在实际工作和面试中,线程池线程个数的设置是一个常见而又复杂的问题。我们通常在资料中找到一些经典的回答,例如判断任务是CPU密集型还是IO密集型,或者参考《Java并发编程实战》一书的建议,那么实际工作中如何计算线程数呢?

2024-01-28 15:40:30 655

原创 如何在业务代码中优雅的使用策略模式?

假设你正在开发一个电商平台,其中涉及到商品的折扣策略。优惠策略有很多种可能,如领取优惠券抵扣、返现促销、拼团优惠等。最初的实现可能会在购物车类中嵌入各种折扣逻辑,导致代码的可维护性和扩展性下降。下面代码在业务开发中经常遇到,代码满足了业务需求,客户可根据自己的需求选择不同的优惠策略。但是,经过一段时间的业务积累,促销活动会越来越多。于是,程序员就开始经常加班,每次上活动之前都要通宵改代码,而且要做重复测试,判断逻辑可能也会变得越来越复杂。此时,我们要思考代码是否需要重构。}//......

2024-01-27 11:43:11 578

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除