自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法框架:冷部署实现优雅退出

在冷部署过程中,常见的问题是直接停止服务导致现有请求无法完成。用户体验受影响:正在处理的请求被中断,用户可能会收到错误响应。错误率上升:未处理完的请求会增加系统的错误率,影响服务质量。为了克服这些问题,我们可以借助 Docker 提供的信号机制和注册中心摘流策略,实现服务的优雅退出。

2024-06-23 11:28:36 846

原创 Docker overview

Docker 仓库,任何人都可以使用它,而且 Docker 默认会在 Docker Hub 查找镜像。你甚至可以运行你自己的私有仓库。Docker 仓库(Docker registries)是用来存储 Docker 镜像的地方。Docker Hub 是一个公共的。

2024-03-21 10:24:29 1000

原创 RPCMESH连接超时

这里面其实有很多排查思路,比如如果是服务端的负载过高导致的超时,一般的现象是我们可以观察mesh层的监控,pct99会在某一个时间点开始变大,如果出现这种现象一般是服务端的问题。4.客户端配置不当:如果客户端的配置不当,如连接超时时间设置过短等,也可能会导致连接超时。这种情况可以通过修改客户端配置来解决。具体为某个查询超时的时候,server中打印的access日志显示,自身cost远小于超时设置,而且接收到请求的时间很晚.3.服务端故障:如果服务端出现故障,如程序崩溃或网络中断等,可能会导致连接超时。

2024-03-21 09:00:55 365

原创 JAVA阻塞队列

和ArrayBlockingQueue类似, 它也支持公平和非公平的锁访问机制。SynchronousQueue:同步队列,是一种不存储元素的阻塞队列。每个插入操作都必须等待对应的删除操作,反之删除操作也必须等待插入操作。ArrayBlockingQueue:使用数组实现的有界阻塞队列。在创建时需要指定容量大小,并支持公平和非公平两种方式的锁访问机制。DelayQueue:延迟队列,其中的元素只有到了其指定的延迟时间,才能够从队列中出队。

2024-03-21 08:58:35 172

原创 如何画好架构图

架构图 = 架构的表达 = 架构在不同抽象角度和不同抽象层次的表达架构可以从很多个角度去看,比如:业务架构、应用架构、技术架构、代码架构、数据架构等。从架构级别来分类,使用金字塔的说明,上层级别包含下层:系统级、应用级、模块级、代码级。

2024-03-20 20:15:03 551

原创 【数据结构-图论】并查集

它首先找到每个元素的代表元素,然后将其中一个集合的代表元素链接到另一个集合的代表元素上,从而完成合并。现在2号想和3号比武(合并3号和2号所在的集合),但3号表示,别跟我打,让我帮主来收拾你(合并代表元素)。find 函数通过递归查找找到一个元素的代表元素,并在查找的过程中将元素直接链接到代表元素,这个优化叫做路径压缩,它可以减少后续查找的时间。现在1号和3号比武,假设1号赢了(这里具体谁赢暂时不重要),那么3号就认1号作帮主(合并1号和3号所在的集合,1号为代表元素)。

2024-03-01 22:49:23 558

原创 kafka summary

消费者组是Kafka独有的概念,即消费者组是Kafka提供的可扩展且具有容错性的消费者机制。但实际上,消费者组(Consumer Group)其实包含两个概念,作为队列,消费者组允许你分割数据处理到一组进程集合上(即一个消费者组中可以包含多个消费者进程,他们共同消费该topic的数据),这有助于你的消费能力的动态调整;作为发布-订阅模型(publish-subscribe),Kafka允许你将同一份消息广播到多个消费者组里,以此来丰富多种数据使用场景。

2024-01-26 10:17:09 708

原创 设计模式-责任链

审批场景的普遍应用实际案例:HttpClient中的责任链模式责任链模式在事件处理、日志记录和过滤器链中的应用接口和具体处理器类的设计处理器类的链式结构客户端使用责任链的示例Spring框架的 @Order 注解的应用利用 @Order 注解实现的责任链模式客户端通过构造函数注入实现责任链。

2024-01-21 13:27:05 656

原创 CPU密集型和IO密集型

CPU密集型(CPU-bound)和IO密集型(IO-bound)是两种常见的计算密集型和IO操作密集型任务类型在实际应用中,任务的类型决定了对系统资源的需求和瓶颈,针对不同类型的任务进行合理的优化和资源分配,可以提高系统的性能和响应能力。

2023-08-19 09:21:12 3808

原创 mysql知识点总结

1、最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其 data 域的值,然后以 data 域的值为地址读取相应的数据记录。

2023-07-03 20:26:40 337

原创 责任链模式

职责链模式将请求的发送者和接收者解耦可以简化对象的相互连接,因为它不需要知道链的结构通过改变链内的成员或者调动他们的次序,允许我们动态地增加或者修改处理一个请求的结构,增强了给对象指派职责的灵活性并不保证请求一定会被执行,如果没有任何对象处理它,可能回落到链尾端之外,因此最好需要设立一个收尾者,来解决所有未被处理的请求由于处理是链式传递的,因此不容易观察运行时的特征,有碍于除错应用场景有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。

2023-06-27 19:28:54 383

原创 MySQL 支持哪些存储引擎

非聚集索引制定了表中记录的逻辑顺序,但是记录的物理和索引不一定一致(在逻辑上数据是按顺序排存放的,但是物理上在真实的存储器中是散列存放的),两种索引都采用B+树结构,非聚集索引的叶子层并不和实际数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针方式。非聚集索引层次多,不会造成数据重排。聚集索引定义了表中数据的物理存储顺序,并将表中的行存储在基于聚集索引的排序顺序中。因此,一个表只能拥有一个聚集索引,而且聚集索引通常是主键索引,因为主键是唯一标识表中每个记录的字段或字段组合。

2023-06-25 17:59:10 632

原创 数据库三范式

*这意味着,如果一个关系模式中存在一个非主属性依赖于另一个非主属性,而这个非主属性又依赖于关系模式中的候选键,那么这个关系模式就不符合3NF的要求。为了符合3NF的要求,需要将这个关系模式进一步分解,使得每个关系模式中的属性都只依赖于候选键。第二范式要求实体的属性完全依赖于主关键字换句话说,**如果一个表中的某个非主键列与其他非主键列之间存在依赖关系,那么这个表就不符合第二范式。这意味着,如果一个关系模式中存在一个非主属性只依赖于候选键中的一部分,那么这个关系模式就不符合2NF的要求。

2023-06-25 17:41:13 322

原创 限流器整理

下面介绍几种常用的限流算法,它们分别是计数器算法、漏桶算法和令牌桶算法。

2023-06-14 10:43:45 59

原创 MYSQL索引

MySQL索引是一种数据结构,它可以加快数据库查询操作的速度。MySQL支持多种类型的索引,包括等。说白了,索引问题就是一个查找问题。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。

2023-05-08 12:14:23 328 1

原创 JAVA类加载机制

在Java的世界里,每一个类或者接口,在经历编译器后,都会生成一个个.class文件。类加载机制指的是将这些.class文件中的二进制数据读入到内存中,并对数据进行校验,解析和初始化。最终,每一个类都会在方法区保存一份它的元数据,在堆中创建一个与之对应的Class对象。java的类加载机制主要分为七个步骤加载,校验,准备,解析,初始化,使用,卸载加载:1.根据类的全名找到对应的class文件2.将class文件中的二进制文件读取出来,在方法区生成对应的数据结构。

2023-05-05 20:39:22 485

原创 mysql索引

MySQL索引是一种数据结构,用于快速访问数据库表中的数据。索引可以提高数据库的查询性能,减少查询所需的时间,因为它们允许MySQL在查询期间快速定位表中特定的行,而不必扫描整个表。MySQL支持多种类型的索引,包括:B-Tree索引:B-Tree是MySQL中最常用的索引类型,它可以用于所有数据类型,包括字符串和数值类型。B-Tree索引对于等值查询和范围查询非常有效。哈希索引:哈希索引可以快速定位特定的行,但只支持等值查询,不支持范围查询。

2023-04-26 19:18:55 579

原创 Mybatis Log Plus

MyBatis Log Plus 是 MyBatis 框架的一个扩展工具,它可以帮助开发者记录 MyBatis SQL 语句的执行过程,并且提供了一些有用的功能,如参数绑定、结果集映射等。记录 SQL 语句的执行过程:MyBatis Log Plus 可以记录 MyBatis SQL 语句的执行过程,包括 SQL 语句、参数、结果等信息,帮助开发者了解 MyBatis SQL 语句的执行过程。参数绑定:MyBatis Log Plus 可以将参数绑定到 SQL 语句中,方便开发者查看和调试 SQL 语句。

2023-03-26 20:30:23 1117

原创 业务开发中表结构设计

假设我们正在设计一个在线图书销售系统,业务需求是支持用户查看图书信息、下单购买图书、查看订单信息等操作。在进行数据库设计时,

2023-03-26 20:23:06 673

原创 JAVA 分布式锁

分布式锁是在分布式系统中保证多个进程或线程同步访问共享资源的一种机制。在分布式系统中,由于多个进程或线程在不同的节点上,无法像单机程序一样直接通过锁机制实现同步访问,因此需要使用分布式锁来保证多个进程或线程对共享资源的互斥访问。分布式锁的基本原理是,在实现分布式锁时,通常可以使用多种技术来实现,例如基于数据库的实现、基于缓存的实现、基于ZooKeeper的实现等。不同的实现方式具有不同的优缺点,需要根据具体的业务场景和性能需求来选择合适的实现方式。

2023-03-26 12:10:15 1556

原创 领域驱动设计(Domain-Driven Design, DDD)

领域驱动设计(Domain Driven Design,简称DDD)是一种面向对象软件开发方法,它强调将软件系统的设计和实现过程与业务领域紧密结合,通过深入理解和建模业务领域,从而达到高内聚、低耦合的目的。在这个例子中,我们可以将书籍、借书人、图书馆等抽象为领域模型中的实体,把借书和还书等业务流程抽象为领域模型中的业务规则。通过这样的设计,我们能够更好地理解和建模业务领域,将业务逻辑和业务流程从代码中分离出来,从而实现高内聚、低耦合的目的,提高软件质量和可维护性。

2023-03-25 22:16:09 1947

原创 CPP 多重继承

虚基类就是为了解决这个问题而引入的,当一个类从一个虚基类继承时,无论这个虚基类在派生类的继承图中出现了多少次,它都只会被继承一次。因为AmphibiousVehicle类同时从Car和Boat类中继承了Vehicle类,而Car和Boat类又都继承自Vehicle类,这样就会在AmphibiousVehicle类中存在两个Vehicle类的副本。菱形继承问题:如果一个类同时从两个不同的父类中继承一个相同的基类,那么这个基类就会在子类中存在两个副本,从而导致命名冲突和内存浪费。下面我们看一个更复杂的例子。

2023-03-25 22:09:39 289

原创 RocketMQ结构与功能概述

而Broker则是消息队列系统的核心组件,负责接收Producer发送的消息并存储到相应的Topic中,同时也负责将存储在Topic中的消息转发给订阅该Topic的Consumer。在顺序消费模式下,Consumer 会按照消息的顺序依次消费消息,而在并发消费模式下,多个 Consumer 可以同时消费同一个消息队列的消息。因此,在RocketMQ中,Producer和Consumer通常运行在用户的机器上,而Broker则运行在消息队列的机器上,它们共同构成了一个完整的消息队列系统。

2023-03-18 23:17:03 390

原创 大数据场景下clickhouse查询时长优化sop

3.join查询 1)左大右小(在join的时候右表会被全部加载到内存中和左表比较) 2)谓词下推 3)避免多表join 4)global join (global关键字可以使右表只在接收查询请求的那个节点查询一次,将其分发到其他节点上,如果不加的话每个节点都会请求一次,造成很大的开销)为了提高查询性能,需要针对实际的查询场景进行索引的设计,尽量避免使用不必要的索引,以减少数据写入和查询时的开销。ClickHouse的优化需要结合实际的数据特点和查询场景,从多个方面进行综合优化,以提高系统的性能和可靠性。

2023-03-18 21:04:34 2204

原创 java NaN和Infinetly

为了避免在程序中出现不必要的错误,我们应该在进行除法操作之前,先检查除数是否为0,这样可以避免除以0导致的NaN或Infinity的情况。如果被除数为负数,那么除以0得到的结果将是-Infinity。例如,-1.0 / 0.0的结果为-Infinity。如果被除数为正数,那么除以0得到的结果将是Infinity。例如,1.0 / 0.0的结果为Infinity。除以0可能会得到NaN或Infinity的结果。如果被除数为0,那么除以0得到的结果将是NaN。例如,0.0 / 0.0的结果为NaN。

2023-03-18 21:04:16 307

原创 浅谈redis及应用场景

Redis是一种开源的数据存储系统,它被广泛用于高性能、高可扩展性、低延迟的数据存储和缓存。Redis支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等,提供了丰富的操作命令,使得开发人员可以方便地进行数据存储和检索。Redis的优势在于其快速响应和高并发处理能力。它是单线程的,但通过使用非阻塞I/O和事件驱动机制,可以实现高并发处理。Redis还提供了持久化机制,可以将内存中的数据持久化到磁盘上,保证数据的可靠性。除了作为数据存储和缓存系统,Redis还可以用作消息队列、分布式锁等。

2023-03-18 18:47:30 419

原创 CAS算法(compareAndSwap)

在并发编程中,我们大多数情况下都是显式地通过加锁来保证线程安全。这里我们来介绍一种在无锁条件下多线程变量同步的方法——CAS(Compare And Swap,比较与交换)算法在CAS中涉及3个操作数:变量当前内存值V、变量的预期值E、新值U。只有该变量当前的内存值V与预期值E相同时,才会将新值U写入内存完成变量修改,否则什么都不做。在Java中,java.util.concurrent.atomic包的原子变量类大量使用了Unsafe类提供的CAS操作。

2023-02-25 11:24:21 124

原创 高并发场景下机器性能优化sop

这时有经验的同学,就会改用 Iterator (迭代器)迭代循环该集合,这是因为 LinkedList是链表实现的,如果使用 for 循环获取元素,在每次循环获取元素时,都会去遍历一次List,这样会降低读的效率。之前接触过一些高并发场景下的性能优化,最近过年时候又碰巧看了一些相关资料,趁着还没忘干净,手动整理一下,有一些是在别处看到的,有一些是自己的亲身经历,因为偏向于自己整理笔记所以很多地方都只是列了一个大纲和解决办法,并没有详细涉及原理,感兴趣的朋友可以自行查阅相关文献。内存:内存溢出、内存泄露。

2023-02-25 11:09:07 554

原创 runnable、callable、consumer、supplier

Java 没有委托的概念;相反,如果需要一个指向函数的指针,可以创建内联匿名类(或 Java 8 的 lambda 表达式),它们是为此建议设计的某些接口的实现(也称为 Java 8 的功能接口)。然而,随着 Java 的发展,越来越多的此类接口被添加进来。虽然它们看起来非常相似且令人困惑,但它们中的每一个都有一个独特的特征,使其与众不同。可以将它们中的许多映射到 .NET 中的相同类型。下表列出了一些著名的接口,但还有更多。

2022-12-11 17:15:55 1087

原创 stream、lamda、optional

​ Java8中的Stream是对容器对象功能的增强,它专注于对容器对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。同时,它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来拆分任务和加速处理过程。通常,编写并行代码很难而且容易出错, 但使用Stream API无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。简化我们匿名内部类的调用。

2022-12-11 11:16:53 387

原创 代理,反射,AOP

这篇文章主要讲三个点1.设计模式中的代理模式2.JAVA中的反射,因为用到了动态代理,这里举一下JDK代理和GCLIB代理的例子3.介绍一下spring的aop是怎么用到了代理。

2022-11-27 16:55:21 1305 3

原创 Hystirx限流:信号量隔离和线程池隔离

背景:最近工作中要处理服务高并发的问题,大流量场景下限流熔断降级可以说是必不可少的,打算对限流做一次改造,所以要先了解一下hytrix相关内容,比如了解一下线程池隔离和信号量隔离的区别。**信号量:**信号量Semaphore是一个并发工具类,用来控制可同时并发的线程数,其内部维护了一组虚拟许可,通过构造器指定许可的数量,每次线程执行操作时先通过acquire方法获得许可,执行完毕再通过release方法释放许可。如果无可用许可,那么acquire方法将一直阻塞,直到其它线程释放许可。

2022-11-27 11:04:52 1729 6

原创 redis缓存一致性以及解决方案

首先要到redis里面读取缓存,如果没有缓存,那么就到mysql里面去取数据,并且将其放置在缓存中关于解决缓存一致性的问题,不难想到主要有两种解决方案,**双更模式:**双更模式,顾名思义就是更新两次,一次更新redis,一次更新mysql不难想到,如果我们先更新redis,再更新mysql的话,是不是就可以保证每次缓存中的数据都是最新的了?但是这样做是有问题的,比如如果我们更新mysql的时候失败了怎么办?更新数据库可能会失败,发生了回滚。

2022-11-26 21:04:40 2383

原创 MPP架构,SMP架构,NUWA架构

对于MPP架构来说,因为task和Executor是绑定的**,如果某个Executor执行过慢或故障,将会导致整个集群的性能就会受限于这个故障节点的执行速度(所谓木桶的短板效应)**,所以MPP架构的最大缺陷就是——短板效应。另一点,集群中的节点越多,则某个节点出现问题的概率越大,而一旦有节点出现问题,对于MPP架构来说,将导致整个集群性能受限,所以一般实际生产中MPP架构的集群节点不易过多。每个节点内的CPU不能访问另一个节点的内存,节点之间的信息交互是通过节点互联网络实现的,这个过程称为数据重分配。

2022-10-30 21:55:23 1158

原创 Clickhouse与Doris的区别

支持集群的在线动态扩缩容,通过内置的SQL命令 alter system add/decomission backends 即可进行节点的扩缩容,数据均衡的粒度是tablet,每个tablet大概是数百兆,扩容后表的tablet会自动拷贝到新的BE节点,如果在线扩容,应该小批量去增加BE,避免过于剧烈导致集群不稳定。***扩容时需要部署新的节点,添加新分片和副本到配置文件中,并在新节点上创建元数据,如果是扩副本数据会自动均衡,如果是扩分片,需要手工去做均衡,或自研相关工具,让均衡自动进行。

2022-10-30 16:47:45 6491

原创 JAVA :Stream ,多线程

stream:Java 8 API添加了一个新的抽象称为流Stream这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。− 为集合创建串行流。− 为集合创建并行流。

2022-10-16 17:11:55 3354

转载 Clickhouse学习笔记(一)分区(Partition)和分片(Shard)

表中的数据可以按照指定的字段分区存储,每个分区在文件系统中都是都以目录的形式存在。常用时间字段作为分区字段,数据量大的表可以按照小时分区,数据量小的表可以在按照天分区或者月分区,查询时,使用分区字段作为Where条件,可以有效的过滤掉大量非结果集数据。

2022-10-05 10:37:41 4584

原创 Redis:主从同步、哨兵、集群

从上面可以看到,主从同步并没有一个自动的管理机制,当出现主服务器宕机的情况,需要人工干预来进行恢复,但是如果主从服务器数量庞大,又或是因为高并发导致的大量崩溃,这时需要的时间和难度都是非常大的,于是Redis中又引入了**哨兵模式(Sentinel)**来作为解决方案,将管理由人工转向哨兵,使得Redis具有自动容灾恢复的能力。负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;

2022-10-03 17:32:57 161

原创 Redis:缓存雪崩,缓存击穿,缓存穿透,缓存预热

缓存雪崩指的是在短时间内,有大量缓存的键同时过期,由于缓存过期,导致此时所有的请求就直接查询数据库,而数据库很难抵挡这样巨大的压力,严重情况下就会导致数据库被大流量打死,直接宕机。缓存雪崩的解决方法有以下几种,为了避免缓存同时过期,,使失效时间分散开来,加锁排队可以起到缓冲的作用,防止大量请求同时操作数据库,但是也正因为如此也减少了吞吐量,导致响应时间变慢,用户体验变差。,即加入一个本地缓存作为备案,当Redis缓存失效后就暂时使用本地缓存进行代替,避免直接访问数据库。,有更新操作时直接更新缓存即可。

2022-10-03 16:06:30 247

原创 布隆过滤器

通常我们会遇到很多要判断一个元素是否在某个集合中的业务场景,一般想到的是将集合中所有元素保存起来,然后通过比较确定。但是随着集合中元素的增加,我们需要的存储空间也会呈现线性增长,最终达到瓶颈。当有变量被加入集合时,通过 K 个映射函数将这个变量映射成位图中的 K 个点,把它们置为 1(假定有两个变量都通过 3 个映射函数)。在程序的世界中,布隆过滤器是程序员的一把利器,利用它可以快速地解决项目中一些比较棘手的问题。一个元素如果判断结果为存在的时候元素不一定存在,但是判断结果为不存在的时候则一定不存在。

2022-10-03 15:52:24 681

空空如也

空空如也

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

TA关注的人

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