自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(109)
  • 资源 (2)
  • 收藏
  • 关注

原创 【架构设计】什么是BASE理论?

在分布式系统中,BASE理论是指一组设计原则,用于处理大规模系统中的数据一致性和可用性的权衡。BASE是基本可用(Basically Available)、软状态(Soft state)和最终一致性(Eventual consistency)的首字母缩写。系统保证在正常情况下一直可用,即使在面临部分故障或性能下降的情况下也能继续提供服务。这意味着系统应该尽量避免完全不可用的情况,并且能够保证基本的响应性能。系统中的数据状态可以在一段时间内是不一致的,即系统中的数据副本可能存在短暂的冲突或不同步。

2024-04-08 10:41:33 893

原创 ChatGPT有哪些应用场景?

ChatGPT有哪些用法?ChatGPT的应用场景

2023-04-24 13:42:17 13560 19

原创 一条MySQL语句是怎样执行的​?​

一条SQL的执行过程

2023-04-23 18:02:44 12904 10

原创 【设计模式】用通俗易懂的方式讲解工厂模式

设计模式在项目中是无处不在的,但是如何在合适的场景选择合适的设计模式却非常考验一个工程师的水平,项目中好的设计模式是非常优美的,我们只需要按照设计好的模式传参即可,试想一下,如果代码里存在大量硬编码的代码,每次改动都小心翼翼,稍有不慎则牵一发而动全身,那无论是对我们还是后来人都是极不友好的。

2023-04-22 15:04:01 12515 13

原创 【架构设计】什么是CAP理论?

CAP理论是指计算机分布式系统的三个核心特性:一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)。在CAP理论中,一致性指的是多个节点上的数据副本必须保持一致;可用性指的是系统必须在任何时候都能够响应客户端请求;而分区容错性指的是系统必须能够容忍分布式系统中的某些节点或网络分区出现故障或延迟。CAP理论认为,分布式系统最多只能同时满足其中的两个特性,而无法同时满足全部三个特性。

2023-04-21 16:39:19 22599 20

原创 【架构设计】SpringCloud和Dubbo的区别?

先说说Spring Cloud,Spring Cloud是一种基于Spring Boot的微服务框架,它提供了一系列工具和技术来支持微服务架构,包括服务发现、断路器、负载均衡和配置管理。Feign是SpringCloud中一种远程调用方式,采用成熟的Http协议作为基础,接口规范统一,实现微服务的语言或技术可随意选择。然而,由于http协议本身的特点,请求和响应格式较为臃肿,通信效率相对较低。而Dubbo是一个高性能、轻量级的服务框架,提供了服务治理、负载均衡、服务注册、服务消费者等功能。

2023-04-21 10:38:38 12676 2

原创 MyCat2实践(7) - MyCat分库分表

因为t_order_detail表是按照order_id取模分表的,所以保证了同一张订单的明细数据都在一张表中。显然是可以的,因为MyCat将order和order_detail作为一个具有关联关系的ER表。接下来,创建一张t_order_detail表,存放订单的明细数据,与t_order表关联。我们打开t_order_detail_0和t_order_detail_1两张表看一下数据。其中的数据并不是按照我们插入的顺序显示的,而是t_ordr_0和t_order_1的拼接。

2024-04-26 09:32:46 955 1

原创 MyCat2实践(6) - MyCat双主双从的读写分离

在前面双主双从的基础上,下面利用MyCat来进行双主双从的读写分离。

2024-04-26 09:31:32 506 2

原创 MyCat2实践(5) - MySQL双主双从

下面将之前搭建的主从复制架构,改为双主双从的架构,两台主机互为从机,当一台主机下线后,另一台作为主机提供写服务,下线的主机重新上线后,再订阅现在的主机同步日志,也就是保持一台写,三台读的模式此前,我已经搭建了128、129两台数据库,一主一从,现在在虚拟机再建两台,130和131,再搭建一主一从,然后让128、130两台主机互为备机,准备完成后,开始下面配置。

2024-04-26 09:29:41 447 2

原创 MyCat2实践(4) - MyCat读写分离

为了分辨查询是否读写分离,我们往逻辑库中插入下面这行数据,mycat会到主库去执行写命令,当从库复制过去时,因为hostname不一样,实际从库的name字段的值和主库也会不一样。此时,打开/usr/local/mycat/conf/clusters目录下的prototype.cluster.json文件,也可以看到配置的集群信息。添加数据源,执行下面语句添加数据源,也可以在mycat/datasources目录下添加配置数据源文件,这里为了方便,直接用注释的方式添加也可以。配置完成后,重启mycat。

2024-04-25 09:57:16 448

原创 MyCat2实践(3) - MyCat环境搭建

如果关闭防火墙还是不行,运行下面命令看一下8066端口有没有应用程序建立连接,没有的话可能是mycat没启动成功,根据启动日志去解决。把mycat文件夹放到需要安装的linux系统下,例如我这里放在/usr/local下面。把下载下来的tar包解压,得到一个名为mycat的文件夹。mycat需要jdk支持,启动前系统必须安装jdk!8066端口建立了连接,说明mycat是启动的。将下载好的jar包放入mycat/lib下。使用8066端口进入mycat。下载mycat的jar包。配置mycat数据源。

2024-04-25 09:33:02 322

原创 MyCat2实践(2) - MySQL主从复制

继上一篇搭建MySQL后,我们再搭建一个MySQL的主从复制架构,后面再用MyCat给这个主从数据库进行读写分离。

2024-04-24 12:20:05 543

原创 MyCat2实践(1) - MySQL环境搭建

本专栏将通过MyCat从零搭建一个数据库集群,包括读写分离、多主多从、分库分表等。

2024-04-24 12:01:36 898

原创 【架构设计】负载均衡方式有哪些?

动态算法,主要根据集群节点当前的连接数来决定分发给哪个节点,当请求到达某个节点还未响应时,此时HTTP连接处于未断开的状态,负载均衡器将新进来的请求,分发较多的请求给当前保持连接数较少的机器,分发较少的请求给当前保持连接数较多的机器,可以根据服务器实际情况来分配请求,可以避免大量耗时请求分发到A服务器,而耗时较少的请求分发到B服务器,造成虽然两个服务器接到的请求数一样,但A服务器压力过大而B服务器压力较小的问题。优点:性能好,能承载大量流量访问,安全性高。优点:负载规则灵活,免费,适用于中小企业。

2024-04-18 16:52:55 736

原创 【架构设计】Redis数据分片技术

为了解决Hash分片节点变化带来的影响,采用一致性Hash分片来尽可能地减小集群节点扩缩容带来的影响,一致性Hash的核心思想是定义一个2^32个节点构成的环,Hash函数不是对节点数进行取模,而是对3^32进行取模,这样可以保证每个数据落在环上固定的位置,服务器节点按照IP地址或域名进行Hash,分配到环上的位置,当有数据请求进来时,对key进行Hash计算,得到数据在环上的位置,如果那个位置有服务器节点,则从那个节点存放或读取,如果没有,则顺时针找到最近的节点作为存放和读取的位置。

2024-04-18 16:42:25 843

原创 布隆过滤器(Bloom Filter)原理与应用

例如用来判断某个用户名是否已经注册,把数据表中已经注册的用户名全部放入布隆过滤器,新的注册请求进入时,判断过滤器中用户名是否存在,如果不存在(有一个位置是0),则可以进行注册,否则提示用户名已存在,也可能出现误判(这个数据的位置都是0,但是其他数据计算出来的位置恰好让这些位置变成1),出现误判时,用户名不存在而布隆过滤器显示存在,这时只能让用户重新输入用户名,对业务影响不大。例如对"hello"进行三种不同方式的hash,第一次对"hello"直接进行hash,假设得到2,把数组上2的位置置为1。

2024-04-17 15:33:26 527

原创 ShardingSphere实践(2)水平分库

分库是指将一个数据库的数据按照某种规则划分为多个独立的子库。每个子库都是一个独立的数据库,具有自己的表结构和数据存储。分库常用于处理大规模数据和高并发访问的场景,以提高系统的可扩展性和性能。分库的主要目的是实现数据的分片存储和并行处理,从而提高数据库的处理能力和吞吐量。通过将数据分散存储在多个子库中,可以将负载均衡到不同的数据库节点上,减轻单一数据库的压力。同时,分库还可以支持水平扩展,使系统能够处理更大量级的数据和并发请求。

2024-04-17 10:35:03 1449

原创 ShardingSphere实践(1)水平分表

上面实践了如何通过散列策略进行水平分表,这里通过自定义分片策略,实现根据数据的创建时间来分配到不同的表上1.自定义日期分片算法类/*** 日期分片算法*/@Slf4j@Override// 将传进来的createTime拼接为表名// 匹配分表2.User实体类上增加一个createTime字段@Data@TableId3.分片策略配置修改4.创建user_2023、user_2024两张表5.测试@Autowired@Testi < 10;i++) {

2024-04-16 17:14:52 1134

原创 如何保证接口幂等性?几种幂等性方案分析

接口幂等性是指在进行多次相同的请求操作时,能够保证系统的状态和结果与执行一次请求操作时的状态和结果相同。换句话说,无论对一个接口进行多少次重复请求,结果都应该是一致的。接口幂等性对于设计和实现网络服务和API非常重要,特别是在分布式系统中。它能够确保即使在网络通信中出现故障、重试、超时或其他问题时,系统也能保持一致性。例如在一个网上商城的后台系统中,当用户点击"提交订单"按钮时,可能会发送一个创建订单的请求。

2024-04-15 11:29:01 424

原创 快速搭建ELK日志系统(windows)

ELK是指Elasticsearch、Logstash和Kibana这三个开源软件的组合,用于构建强大的日志管理和分析系统。ELK日志系统常用于处理和可视化大规模的日志数据,帮助开发人员和运维团队监控和分析系统的运行情况。

2024-04-08 10:53:55 680

原创 什么是幂等性?如何实现请求的幂等性?

幂等性是指一个操作或函数,无论执行多少次,其结果都是相同的。换句话说,重复调用具有幂等性的操作或函数不会产生额外的副作用或改变系统状态。在计算机科学和网络通信中,幂等性是一个重要的概念。它确保无论请求被执行多少次,最终的结果都是相同的,不会因为重复执行而导致不一致或意外的行为。举个例子,假设有一个幂等性的函数用于将某个数值存储到数据库中。无论调用这个函数一次还是多次,存储的值都会保持不变。这意味着多次调用函数不会导致数据库中出现多个相同的数值,因为幂等性保证了结果的一致性。

2024-03-31 14:48:13 316

原创 【设计模式】常用设计模式-总结

提供一个接口用于创建相关或依赖对象的家族,而不需要指定具体的类。适用于需要创建一组相关对象的场景,且希望将创建逻辑与使用者分离。

2023-07-02 23:12:18 7382 19

原创 【设计模式】用Java实现原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,旨在通过复制(克隆)现有对象来创建新对象,而无需通过构造函数来创建。原型模式的核心思想是基于已有对象创建新对象,从而避免了重复构造过程,提高了对象创建的效率。在Java中,对象的复制可以通过实现Cloneable接口和重写clone()方法来实现。Cloneable接口是一个标记接口,用于告诉JVM该类可以被克隆。clone()方法是Object类中的一个方法,用于复制一个对象。

2023-07-01 10:34:11 8395 4

原创 【设计模式】用Java实现享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式旨在通过共享对象来最小化内存使用和提高性能。享元模式通过将对象的状态分为内部状态(Intrinsic State)和外部状态(Extrinsic State),并共享内部状态,从而在大量相似对象之间实现有效的资源共享。内部状态是对象可共享的、独立于对象场景的状态,它可以被多个对象共享。外部状态是对象特定的、依赖于对象场景的状态,它不能被共享,每个对象都会保持一份独立的外部状态。

2023-06-30 11:26:56 9509

原创 【设计模式】用Java实现装饰模式

装饰模式(Decorator Pattern)是一种结构型设计模式它允许在不改变现有对象结构的情况下,动态地将责任附加到对象上。装饰模式通过将对象包装在装饰器对象中,形成一条装饰链,每个装饰器对象都可以在被装饰对象的行为前后加上自己的行为。装饰模式的核心思想是通过组合而不是继承来扩展对象的功能。它遵循开放-关闭原则,即对扩展开放,对修改关闭,使得我们可以在不修改现有代码的情况下,灵活地添加新的功能。应用场景:需要在不改变现有对象结构的情况下,动态地为对象添加额外的功能。

2023-06-30 11:23:39 9752

原创 【设计模式】用Java实现组合模式

组合模式是一种结构型设计模式它允许将对象组合成树形结构以表示"部分-整体"的层次结构。这种模式能够让客户端统一对待单个对象和组合对象,使得用户在使用对象时不需要关心对象是单个还是组合的。在组合模式中,有两种主要的对象类型:叶节点(Leaf)和组合节点(Composite)。叶节点表示树结构中的最小单元,它们没有子节点。组合节点是由多个叶节点或其他组合节点组成的节点,它们可以包含子节点。需要表示对象的部分-整体层次结构:当对象具有树形结构,并且希望以统一的方式处理整体和部分时,可以使用组合模式。

2023-06-30 11:14:00 9756

原创 【设计模式】用Java实现构建器模式

构建器模式(Builder Pattern)是一种创建型设计模式,它通过将复杂对象的构建过程分离出来,以及提供一种逐步构建对象的方式,使得客户端可以灵活地创建对象,同时避免了构造函数参数过多和构造函数重载的问题。构建器模式的主要思想是将对象的构建过程分解为多个步骤,并提供一个构建器(Builder)来逐步完成对象的构建。每个步骤都有对应的方法来设置对象的属性或配置选项,最后通过调用构建器的一个方法来返回构建好的对象。产品类(Product):表示最终构建的复杂对象。它通常包含多个属性和方法。

2023-06-30 11:05:46 9751 1

原创 【设计模式】用Java实现备忘录模式

备忘录模式(Memento Pattern)是一种行为设计模式,它允许将对象的内部状态保存在一个备忘录对象中,并在需要时恢复对象的状态,而不破坏对象的封装性。备忘录模式的核心是备忘录(Memento)角色,它用于存储对象的内部状态,并提供对状态的访问方法。原发器(Originator)角色负责创建备忘录并将自身的状态保存到备忘录中。管理者(Caretaker)角色负责存储和恢复备忘录,但是它不能访问备忘录的内部状态。当需要保存和恢复对象的内部状态,并且希望封装状态的具体实现细节时,可以使用备忘录模式。

2023-06-30 11:05:16 9676

原创 【设计模式】用Java实现中介者模式

中介者模式(Mediator Pattern)是一种行为设计模式,它通过封装一系列对象之间的交互,将对象之间的通信集中处理,从而降低对象之间的耦合度。中介者模式的核心是中介者(Mediator)角色,它定义了对象之间的通信接口,负责协调和控制对象之间的交互。具体的对象称为同事(Colleague)角色,每个同事角色都与中介者进行通信,而不直接与其他同事进行交互。当系统中的对象之间存在复杂的相互关系和依赖关系,导致对象之间的通信和协作变得混乱难以维护时,可以考虑使用中介者模式。

2023-06-30 11:05:06 9039

原创 【设计模式】用Java实现工厂模式

工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的方式,将对象的实例化过程封装在工厂类中,使得客户端代码与具体对象的创建过程解耦。工厂模式基于一个简单的原则:将对象的创建与使用分离。它通过引入一个工厂类,将对象的实例化过程集中在工厂类中,并提供一个统一的接口供客户端使用,从而降低了客户端与具体对象之间的依赖关系。抽象产品(Abstract Product):定义了产品的共同接口,所有具体产品都实现了这个接口。

2023-06-30 11:03:19 9914

原创 【设计模式】用Java实现迭代器模式

迭代器模式(Iterator Pattern)是一种行为设计模式,它提供了一种顺序访问聚合对象中各个元素的方法,而无需暴露聚合对象的内部表示。迭代器模式的核心是迭代器接口(Iterator),该接口定义了访问和遍历聚合对象元素的方法。具体的聚合对象实现了创建相应迭代器的方法,并通过迭代器来访问自身的元素。当需要遍历一个聚合对象,并且不希望暴露聚合对象的内部表示时,可以使用迭代器模式。迭代器模式将遍历操作封装在迭代器中,客户端可以通过迭代器访问和遍历聚合对象的元素,而无需了解聚合对象的具体实现。

2023-06-30 11:02:42 9264

原创 【设计模式】用Java实现命令模式

命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,从而使你可以使用不同的请求对客户端进行参数化。命令模式还支持请求的排队、记录日志、撤销操作等功能。命令接口(Command):定义执行命令的方法,可以是抽象类或接口。具体命令类(Concrete Command):实现命令接口,封装了具体的请求和接收者,负责执行请求。接收者类(Receiver):执行实际的操作,命令对象将请求委托给接收者来执行。

2023-06-30 11:02:30 10900 1

原创 【设计模式】用Java实现解释器模式

解释器模式(Interpreter Pattern)是一种行为设计模式,它用于解释一个特定的语言或表达式,并提供一种灵活的方式来进行解析和执行。该模式将语言的语法规则表示为一个解释器类的层次结构,并使用该结构来解析语言中的表达式。抽象表达式(Abstract Expression):定义一个抽象的解释操作,通常包含一个抽象方法interpret(),该方法根据具体的解释器实现来解释表达式。

2023-06-30 11:02:06 9775

原创 【设计模式】用Java实现职责链模式

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求沿着处理链进行传递,直到有一个处理者能够处理该请求。每个处理者都可以决定是否将请求传递给下一个处理者,从而形成一条处理链。抽象处理者(Abstract Handler):定义一个处理请求的接口,并持有下一个处理者的引用。具体处理者(Concrete Handler):实现抽象处理者接口,处理它所负责的请求,如果自己无法处理,则将请求传递给下一个处理者。职责链模式的使用场景。

2023-06-29 09:27:43 11583

原创 【设计模式】用Java实现观察者模式

观察者模式是一种行为设计模式,用于实现对象之间的发布-订阅机制。在该模式中,存在一个主题对象(被观察者),它维护了一个观察者列表,并在自身状态发生改变时通知所有观察者。观察者对象订阅主题对象的状态变化,并在收到通知后执行相应的操作。主题(Subject):主题是被观察的对象,它维护了一组观察者,并提供了用于添加、删除和通知观察者的方法。观察者(Observer):观察者是订阅主题对象的对象,它定义了接收通知和执行相应操作的方法。观察者模式的核心思想是将主题和观察者解耦,使得它们可以独立变化。

2023-06-29 09:27:25 10346

原创 【设计模式】用Java实现桥接模式

桥接模式是一种结构设计模式,用于将抽象部分与其具体实现部分分离,使它们能够独立地变化。桥接模式通过使用接口和实现类之间的组合关系,而不是继承关系,来实现这种分离。桥接模式的核心思想是将抽象部分和实现部分分开,使它们可以独立地变化。抽象部分定义了高层的抽象接口,而实现部分定义了底层的具体实现。通过桥接模式,可以在不修改抽象部分的情况下,动态地切换和扩展实现部分。当需要将一个类的抽象部分和实现部分分离,并且让它们能够独立地变化时,可以使用桥接模式。

2023-06-29 09:27:08 10308

原创 【设计模式】用Java实现模板模式

模板模式(Template Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,将一些步骤延迟到子类中实现。模板模式使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。抽象模板(Abstract Template)和具体模板(Concrete Template)。抽象模板定义了算法的骨架,包含了一些抽象方法和具体方法,而具体模板实现了抽象模板中定义的抽象方法。当存在多个相关的算法或行为,并且需要在运行时动态选择其中之一时,策略模式非常有用。

2023-06-29 09:25:52 11402

原创 【设计模式】用Java实现状态模式

状态模式是一种行为设计模式,它允许对象在内部状态发生改变时改变其行为。该模式将对象的行为包装在不同的状态类中,使得对象的行为可以根据其当前状态动态改变。状态模式通常由以下几个角色组成:环境类(Context):环境类是拥有状态的对象,它将会根据当前状态来执行相应的行为。它维护了一个对抽象状态类的引用,用于切换和委托不同的状态处理。抽象状态类(State):抽象状态类定义了一个接口,用于具体状态类的实现。在该接口中声明了具体状态类需要实现的方法。具体状态类(Concrete State)

2023-06-29 09:25:41 11530

原创 【设计模式】用Java实现外观模式

外观模式是一种结构设计模式,旨在为复杂系统提供一个简化的接口,以便客户端可以更方便地使用系统。外观模式通过创建一个高层次的接口,将系统的多个子系统封装起来,并提供一个统一的接口给客户端使用。外观模式的核心思想是通过创建一个外观类(Facade Class),将复杂系统的内部实现细节隐藏起来,只暴露出一个简化的接口给客户端。客户端只需要与外观类进行交互,而不需要直接与子系统的组件进行交互。当一个系统的复杂性变得很高,由于存在大量的子系统和相互关联的类,导致客户端代码变得冗长和复杂时,可以考虑使用外观模式。

2023-06-29 09:25:24 10489 1

原创 【设计模式】用Java实现策略模式

多种算法或行为选择当有多个相关的算法或行为可供选择,并且需要在运行时动态选择其中之一时,策略模式非常适用。它允许根据需求选择适当的策略,而不需要更改客户端代码。消除条件语句:当存在大量的条件语句来根据不同情况执行不同的行为时,使用策略模式可以消除这些冗长的条件语句。每个条件对应一个具体的策略,客户端只需选择正确的策略即可。算法的独立性策略模式将算法封装在各自的策略类中,使得每个算法可以独立于其他算法进行修改和演化。这样可以保持代码的灵活性和可维护性。扩展性。

2023-06-29 09:25:20 11351

rabbitmq-server-3.9.14

rabbitmq-server-3.9.14

2022-05-04

Redis-x64-5.0.14 windows

Redis-x64-5.0.14 windows

2022-05-04

空空如也

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

TA关注的人

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