自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 常见排序算法及算法的稳定性

本文介绍三种简单排序的实现思路以及其他排序算法的稳定性讨论。

2024-09-08 09:44:20 806

原创 雪花算法的时间回拨问题的产生和解决办法

本文介绍雪花算法产生时钟回拨问题的原因和解决办法。

2024-09-08 09:39:38 301

原创 Kafka的三高设计原理

本文介绍kafka的三高(高并发、高可用、高性能)设计原理,对其原理进行简洁的归纳。

2024-09-06 20:39:43 953

原创 NIO、Reactor模式与直接内存

本文主要讲解网络通信的NIO模型、Reactor模式以及直接内存。它们在开发中都是很常见的底层知识,了解他们的原理,可以帮助我们更好的使用高级开发的工具。

2024-09-05 23:36:15 963

原创 零拷贝:mmap、sendfile、splice

本文主要介绍零拷贝技术,包括mmap、sendfile、splice。通过零拷贝技术,减少进程的上下文切换次数、数据拷贝次数和共享总线操作的次数

2024-09-05 19:32:32 912

原创 select、poll、epoll的原理

在 select/poll中,进程只有在调用一定的方法后,内核才对所有监视的文件描述符进行扫描,而epoll事先通过epoll_ctl()来注册一个文件描述符,一旦基于某个文件描述符就绪时,内核会采用类似callback的回调机制,迅速激活这个文件描述符,当进程调用epoll_wait() 时便得到通知。(此处去掉了遍历文件描述符,而是通过监听回调的的机制。这正是epoll的魅力所在。epoll的优点主要是一下几个方面:1.监视的描述符数量不受限制,它所支持的FD上限是最大可以打开文件的数目。

2024-09-05 12:26:50 960

原创 Spring源码之scan扫描

本文主要介绍Spring源码的doScan方法,通过扫描并解析bean的元数据,生成BeanDefinition,之后再根据BeanDefinition创建bean。

2024-09-04 23:31:58 896

原创 spring源码之ConfigurationClassPostProcessor解析配置类

解析配置类的核心类是ConfigurationClassPostProcessor,里面核心方法是postProcessBeanDefinitionRegistry,调用processConfigBeanDefinitions进行解析。ConfigurationClassPostProcessor包含解析配置类、增强FULL配置类。

2024-09-04 13:16:08 1255

原创 Spring源码之refresh

在 Spring 框架中,refresh主要用于刷新应用上下文。这一过程涉及多个重要的步骤,确保 Spring 容器的状态更新、bean 的加载以及资源的初始化。refresh。

2024-09-03 21:33:30 974

原创 Spring源码之reader、scanner

8.注册EventListenerMethodProcessor类型的BeanDefinition,用来处理@EventListener注解的,它会去解析一个bean中的某个方法是不是监听器,也就是这个方法是不是加了@EventListener注解。在EventListenerMethodProcessor中调用afterSingletonsInstantiated(所有bean初始化后会调用这个方法),这个方法中会调用processBeans,里面进行@EventListener的解析。

2024-09-03 21:05:34 1165

原创 分布式主键

Snowflake的第二部分是时间戳,时间戳是唯一的,但是如果多个节点同时生产则会参数相同的时间戳,那怎么办?接着加唯一的值,工作机器的ID唯一呀。但是如果在一个进程中可能两个线程同时请求,那么会产生相同的(时间戳+工作机器ID),那就继续加唯一值,在加上最后的序列号,从而保证全局唯一。对于MySQL集群,单点数据库方式不可取,那对上边的方式做一些高可用优化,换成主从模式集群。:分布式主键服务本身就是一个底层的服务,很多服务都依赖于这个服务,如果底层服务都不稳定,那么上游的服务就更谈不上稳定。

2024-09-01 23:42:34 925

原创 Feign的原理及概念

Feign是Netflix开发的声明式、模板化的HTTP客户端,Feign可帮助我们更加便捷、优雅地调用HTTP API。Feign可以做到使用HTTP请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。Spring Cloud OpenFeign对Feign进行了增强,使其支持Spring MVC注解,从而使得Feign的使用更加方便。

2024-08-30 23:19:53 1469

原创 Gateway的基本概念

Gateway网络为微服务架构提供简单且统一的API路由管理,作为系统的统一入口。Gateway可以为客户端提供统一的服务,例如认证、路由转发、防刷、流量控制、监控日志等。Gateway是无状态的,不存放数据,所以可以搭建Gateway集群。通过它前面的nginx可负载均衡到指定的网关。Spring Cloud Gateway是由WebFlux+Netty+Reactor实现的响应式的API网关。它不能在传统的servlet容器中工作,也不能构建成war包。

2024-08-30 23:14:39 1221

原创 Kafka日志及常见问题

目录1.Topic下的消息是如何存储的1.1log文件追加记录所有消息1.2index和timeindex加速读取日志信息2.文件清理机制2.1如何判断哪些日志文件过期了2.2日志清理策略3.Kafka的文件高效读写机制3.1Kafka的文件结构3.2顺序写磁盘3.3零拷贝3.3.1传统IO3.3.2mmap文件映射机制3.3.3sendfile文件传输机制4.合理配置刷盘频率5.客户端消费进度管理6.常见问题6.1消费者防止消息重新消费7.2消息零丢失方案7.2.1产生原因7.2.2解决方案7.3消息积压

2024-08-26 22:27:46 1146

原创 Kafka的Broker运行机制

Kafka其实天生就是为了集群而生,即使单个节点运行Kafka,他其实也是作为一个集群运行的。而Kafka为了保证在各种网络抽风,服务器不稳定等复杂情况下,保证集群的高性能,高可用,高可扩展三高,做了非常多的设计。

2024-08-25 23:00:34 947

原创 Kafka的生产者和消费者机制

当Producer的acks设置为1或-1时,Producer每次发送消息都是需要获取Broker端返回的RecordMetadate的。这个过程就需要两次跨网络请求。如果要保证消息安全,那么对于每个消息,这两次网络请求就必须要求是幂等的。但是,网络是不靠谱的,在高并发场景下,往往没办法保证这两个请求是幂等的。Producer发送消息的过程中,如果第一步请求成功了, 但是第二步却没有返回。这时,Producer就会认为消息发送失败了。那么Producer必然会发起重试。

2024-08-25 16:18:37 1213

原创 Kafka的基本概念

Kafka是一个分布式的发布-订阅消息系统,可以快速地处理高吞吐量的数据流,并将数据实时地分发到多个消费者中。Kafka消息系统由多个broker(服务器)组成,这些broker可以在多个数据中心之间分布式部署,以提供高可用性和容错性。Kafka的基本架构由生产者、消费者和主题(topic)组成。生产者可以将数据发布到指定的主题,而消费者可以订阅这些主题并消费其中的数据。同时,Kafka还支持数据流的处理和转换,可以在管道中通过Kafka Streams API进行流式计算,例如过滤、转换、聚合等。

2024-08-24 22:09:28 1168 1

原创 RabbitMQ的高可用

模式,消费者会在完成业务处理后自动进行应答,而如果消费者的业务逻辑抛出异常,RabbitMQ会将消息进行重试,这样是不会丢失消息的,但是有可能会造成消息一直重复消费。首先他的普通集群模式,消息是分散存储的,不会主动进行消息同步了,是有可能丢失消息的。而他的弊端也是明显的,集群内部的网络带宽会被这种同步通讯大量的消耗,进而降低整个集群的性能。这种模式下,队列数量最好不要过多。消费时,如果消费的不是存有数据的节点,RabbitMQ会临时在节点之间进行数据传输,将消息从存有数据的节点传输到消费的节点。

2024-08-23 22:18:38 1183 1

原创 RabbitMQ的基础概念介绍

RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。

2024-08-22 23:59:49 1151

原创 Redis单线程和多线程

此时的socket应该采用非阻塞模式。这样,整个过程只有在调用select、poll、epoll这些调用的时候才会阻塞,收发客户信息是不会阻塞的,整个进程或者线程就被充分利用起来。在目前的单线程Reactor模式中,不仅I/O操作在该Reactor线程上,连非I/O的业务操作也在该线程上进行处理了,这可能会大大延迟I/O请求的响应。是由一个线程完成的,Redis在处理客户端的请求时包括获取(Socket读)、解析、执行、内容返回(Socket写)等都由一个顺序串行的主线程处理,这就是所谓的“单线程”。

2024-08-21 23:44:22 1518

原创 Redis缓存设计、bigkey及key过期策略

当业务应用访问的是。

2024-08-20 23:06:51 789

原创 Redis的持久化、主从架构、哨兵高可用架构

RDB并不会立刻把用户修改的数据写入磁盘,所以存在数据丢失的问题,AOF也可能存在数据丢失的问题,但是AOF的策略可以强制用户每次执行指令的时候,先执行AOF操作,将指令写到磁盘,这样就不会产生数据丢失问题。而不用等待服务器的响应,待所有命令都发送完后再一次性读取服务的响应,这样可以极大的降低多条命令执行的网络传输开销,管道执行多条命令的网络开销实际上只相当于一次命令执行的网络开销。,因此,当网络连接断开后,slave会请求master继续进行未完成的复制,从所记录的数据下标开始。

2024-08-19 23:06:23 1010 2

原创 Redis的数据结构

哈希桶存放的是指向键值对数据的指针(dictEntry*),这样通过指针就能找到键值对数据,然后因为键值对的值可以保存字符串对象和集合数据类型的对象,所以键值对的数据结构中并不是直接保存值本身,⽽是保存了 void * key 和 void * value 指针,分别指向了实际的键对象和值对象,这样⼀来,即使值是集合数据,也可以通过 void * value 指针找到。Redis 则采⽤⼀种巧妙的方法是,跳表在创建节点的时候,随机⽣成每个节点的层数,并没有严格维持相邻两层的节点数量比例为2:1的情况。

2024-08-16 22:56:27 1685

原创 JVM的G1垃圾回收器

达到参数(-XX:InitiatingHeapOccupancyPercent)设定的值则触发,回收所有的Young区和部分Old区(根据期望的GC停顿时间确定old区垃圾收集的优先顺序)以及大对象区,正常情况下,G1的垃圾收集是先做MixedGC,主要使用复制算法,需要把各个region中存活的对象拷贝到别的region里去,拷贝过程中如果发现。一个Region可能之前是年轻代,如果Region进行了垃圾回收,之后可能又会变成老年代,也就是说Region的区域功能可能会动态变化。,这个过程是非常耗时的。

2024-08-16 21:29:53 662

原创 JVM的GC垃圾回收机制

即使在可达性分析算法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历再次标记的过程。一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收掉,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中,如果存在监控引用队列的操作,则当引用队列变化时,就可以做响应操作。将“GC Roots” 对象作为起点,从这些节点开始搜索,搜索它们引用的对象,能搜索到的对象都标记为非垃圾对象,其余未标记的对象都是垃圾对象。

2024-08-11 23:44:55 967

原创 JVM对象创建与内存分配机制

标量替换:通过逃逸分析确定该对象不会被外部访问,并且对象可以被进一步分解时,JVM不会创建该对象,而是将该对象成员变量分解若干个被这个方法使用的成员变量所代替,这些代替的成员变量在栈帧或寄存器上分配空间,这样就 不会因为没有一大块连续空间导致对象内存不够分配。如果Java堆中的内存并不是规整的,已使用的内存和空闲的内存相互交错,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例, 并更新列表上的记录。

2024-08-05 23:32:09 661

原创 JVM的内存模型

是每个线程都有的区域)(图中运行时数据区中。

2024-08-05 23:24:05 245

原创 JVM的类加载机制

commonLoader:Tomcat最基本的类加载器,加载路径中的class可以被Tomcat容器本身以及各个Webapp访问;catalinaLoader:Tomcat容器私有的类加载器,加载路径中的class对于Webapp不 可见;sharedLoader:各个Webapp共享的类加载器,加载路径中的class对于所有Webapp可见,但是对于Tomcat容器不可见;

2024-08-03 14:45:25 938

原创 MySQL的主从复制

MySQL主从同步指的是主库与从库的数据同步问题。主要借助,将与关联来实现。两种方式:1.MySQL异步复制;2.MySQL半同步复制。

2024-08-03 13:24:55 414

原创 MySQL的InnoDB存储引擎与日志

相信很多有过开发经验的同学都知道分布式事务,这里的redo log和binlog其实就是很典型的分布式事务场景,因为两者本身就是两个独立的个体,要想保持一致,就必须使用分布式事务的解决方案来处理。,实际就是前两种模式的结合,在Mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种,如果sql里有函数或一些在执行时才知道结果的情况,会选择Row,其它情况选择Statement,推荐使用这一种。存储引擎层负责数据的存储和提取。

2024-08-02 23:38:59 1140

原创 MySQL的事务、锁和MVCC机制

MySQL在RC(读已提交)和RR(可重复读)隔离级别下都实现了MVCC机制。在MySQL中,对一行数据的读和写两个操作默认是不会通过加锁互斥来保证隔离性的,避免频繁加锁互斥。在串行化隔离级别,为了保证较高的隔离性是通过将所有操作加锁互斥来实现的。MVCC机制就是通过read-view和undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取同一条数据在版本链上的不同版本数据。注意:begin/start transaction 命令并不是一个事务的起点,

2024-07-30 23:40:25 855

原创 MySQL中的相关优化

否则,使用双路排序。当使用left join时,左表是驱动表,右表是被驱动表,当使用right join时,右表时驱动表,左表是被驱动表;优化方法:开启慢查询日志,查看日志中运行时间较长的SQL语句,分析是否可以重写该语句,或者是否为该SQL语句中的字段加索引。这种情况,Mysql可能不走name的索引,因为扫描整个索引并查找到没加索引的行(可能产生回表)的成本比扫描全表的成本更高,所以优化器放弃使用索引。但是,这种优化在很多场景并不适用,因为表中可能某些记录被删后,主键空缺,导致结果不一致。

2024-07-29 22:47:54 805

原创 MySQL的Explain语句,看这一篇就够了

下面介绍Explain中的列的具体含义。

2024-07-22 23:09:27 680

原创 MySQL之索引、存储引擎以及常见问题

要牢记建立索引是从左到右的顺序,也就是说,如果建立联合索引,那么字段的比较就是从左到右。(注意:要尽量使用覆盖索引,select语句尽量不使用select *,select *容易导致回表,因为*需要查询该表的所有字段,如果本次查询不会用到所有字段,则不要用select*,用到哪些字段就写哪些字段)回表:比如,在使用name作为索引查找该学生的age时,需要先查右边的索引(也就是name字段的索引),然后根据name索引得到的主键值,再到左边索引(主键索引)中查找该学生的age。(数据+指针=14B)

2024-07-17 22:25:18 1005

空空如也

空空如也

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

TA关注的人

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