自定义博客皮肤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)
  • 资源 (3)
  • 问答 (4)
  • 收藏
  • 关注

原创 手写协议之内存控制模块

最后,就完成了一个小型的内存控制模块,可以进行内存申请、释放操作,后续可以通过该模块来进行数据的存放等功能。再见啦,下次再会。

2023-05-19 14:00:34 148

原创 线程初探——生产者、消费者模式

helllo,大家好,这里是追風者频道。今天我们来聊一聊生产者、消费者模式。后期需要采用该模式来进行协议栈抓包架构的搭建,通过多线程对数据包进行分任务处理。

2023-05-09 10:24:54 550

原创 ClickHouse 微量数据插入慢

ck 少量数据批量插入慢

2023-01-09 14:39:06 1194

原创 Spring 源码编译

Spring 源码编译,一定要选好版本!!!Spring 源码编译,一定要选好版本!!!Spring 源码编译,一定要选好版本!!!重要的事说三遍。Spring 版本:5.3.1JDK 版本:17Gradle 版本:gradle-7.6IDEA 版本:2022.2(IDEA 版本不要太低,有的·文章说会出问题)Kotlin 版本:1.7.21Spring github:将项目导入到 IDEA 中,导入 Gradle 版本的,然后傻瓜式 Next 即可。IDEA 操作:File → New →

2022-12-04 01:21:51 1075

原创 搞懂源码的三大条件

源码的阅读方式,字字珠玑。

2022-08-05 19:21:11 64

转载 内部寄存器类型

内部寄存器类型含14个16位寄存器,按功能可分为3类:8个通用寄存器;4个段寄存器;2个控制寄存器。1 通用寄存器①数据寄存器(AX,BX,CX,DX);8088/8086含4个16位数据寄存器,又可分为8个8位寄存器,即:0b32f2906c990b4e502080d89e8a64d7.png数据寄存器特有的习惯用法:AX:累加器,所有I/O指令都通过AX与接口传送信息,中间运算结果也多放于AX中;BX:基址寄存器,在间接寻址中用于存放基地址;CX:计数寄存器,用于在循环或串操作指令中

2022-06-12 08:36:39 307

原创 深入浅出操作系统之内存管理系统

深入浅出操作系统之内存管理系统文章目录深入浅出操作系统之内存管理系统物理地址段页式内存管理概述理解段页式内存池申请内存申请内存(非堆)申请虚拟页步骤申请物理页根据虚拟地址,得到页表项的虚拟地址根据虚拟地址,得到页目录项的虚拟地址:虚实地址映射分配内存(非堆)小结堆内存申请堆中申请内存释放页框级内存物理地址回收到物理内存池去掉页表中的虚拟地址的映射虚拟地址池中释放以 _vaddr 起始的连续cut个虚拟页地址释放虚拟地址 vaddr 为起始的 cut 个物理页框释放内存块内存注小伙伴们,大家好,我是追風者

2022-05-29 21:46:44 201

原创 HashMap 解析

HashMap 解析HashMap 初始化HashMap 属性HashMap 存储过程HashMap 中计算 key hash值的方式构造方法传入数组长度创建 HashMapHashMap 是由数组+链表/红黑树组成的一种k-v键值对结构。HashMap 存储数据无序,key 和 value 都可以为 null,key唯一。HashMap 初始化在 jdk 1.8 中,HashMap 的构造函数不会创建数组,而是在第一次调用 put() 方法时创建数组,Node[] table 来存储键值对数据。

2022-03-13 16:38:23 812

原创 初识惰性队列

初识惰性队列在高并发场景下,MQ 中涌入大量请求,消息持续积压,如何处理?除了扩容多个消费者的情况下,可以采用惰性队列方式(性能差)。惰性队列的特征:接收到消息后直接存入磁盘而非内存。消费者要消费消息时才从磁盘中读取加载到内存。支持数百万条的数据存储。要设置队列为惰性队列,只需要在声明队列时,指定 x-queue-mode 属性为 lazy 即可。SpringAMQP 声明惰性队列 @Bean 对象中(推荐) // Bean 对象声明惰性队列 /** * 声明惰性队列

2022-03-03 17:05:28 248

原创 死信交换机与延迟队列

死信交换机与延迟队列死信交换机延迟队列死信交换机满足下列情况一点,即为死信(dead letter):消费者使用 basic.reject 或 basic.nack 声明消费失败,并且消息的 requeue 参数设置为 false。消息是一个过期消息,超时无人消费。要投递的队列满了,最早的消息可能成为死信。如果该队列配置了 dead-letter-exchange 属性,指定了一个交换机,那么队列中的死信就会投递到这个交换机中,这个交换机就叫 死信交换机(DLX)。死信交换机与前文的异常交

2022-03-03 16:53:20 267

原创 RabbitMQ 保证消息可靠性传输

RabbitMQ 保证消息可靠性传输消息可靠性问题解决消息可靠性问题生产者到 Queue 阶段消息丢失Queue 到消费者阶段我们知道,RabbltMQ 不能够保证消息不会丢失,那么在高并发场景下,如何保证消息的可靠性传输?消息可靠性问题Publisher 发送消息到 Exchange 阶段:Publisher 发送的消息未到达 Exchange。消息到达 Exchange 未到达 Queue。Exchange 发送消息到 Queue 阶段:MQ 宕机,Queue 将消息丢失。Queue

2022-03-03 16:46:20 1677

原创 RabbitMQ 入门之发布订阅模式

RabbitMQ 入门之发布订阅模式RabbitMQ 的结构RabbitMQ 的六种模式SpringAMQPFanout Exchange 广播模式Direct Exchange 路由模式Topic Exchange 主题模式消息转换器前面已经提过了引入 MQ 的优点,解耦、异步和流量削峰,这里不再赘述。RabbitMQ 的结构RabbitMQ 有几个个概念:RoutingKey 路由键,在发布订阅模型中根据 RoutingKey 可以找到具体队列。Publisher 生产者,生产消息发送给 E

2022-03-03 08:49:37 2178

原创 事务隔离的实现原理

事务隔离的实现原理前置知识事务隔离级别实现读未提交读已提交可重复读串行化前置知识针对于事务隔离的具体原理需要了解一些概念和知识。首先 MySQL 的每条记录都会有两个隐藏字段,row_trx_id(事务 id)和roll_pointer(回滚指针)。row_trx_id 会记录当前记录被哪条事务所更改/创建,记录事务的 id。roll_pointer 会记录上一版本的数据的地址。进行数据更改时,会记录三个日志文件:redo log 解决数据库宕机重启丢失数据的问题。binlog 用于主从复制

2022-03-01 12:25:17 475

原创 MySQL 事务隔离级别

MySQL 事务隔离级别事务性质并发场景的问题四大隔离级别事务性质事务有四大特性(ACID):原子性(Atomicity): 事务作为一个整体被执行,要么全部执行,要么全不执行。一致性(Consistency): 指在事务开始之前和事务结束以后,数据不会被破坏。隔离性(Isolation): 多个事务并发访问时,事务之间是相互隔离的,一个事务不应该被其他事务干扰,多个并发事务之间要相互隔离。。持久性(Durability): 表示事务完成提交后,该事务对数据库所作的操作更改,将持久地保存在数据

2022-03-01 10:52:03 789

原创 SQL 性能排查

SQL 性能排查SQL 性能排查步骤:慢查询开启并捕获。explain + 慢 SQL 分析。show profile 查询 SQL 在 MySQL 服务器里执行细节和生命周期情况。SQL 数据库服务器的参数调优。开启 SQL 慢查询日志:# 查看慢日志是否开启以及目录show VARIABLES like '%slow_query_log%';# 开启慢日志--仅当前可用,重启数据库后,恢复关闭set global slow_query_log = 1;# 查看慢日志阀值sho

2022-03-01 09:02:20 632

原创 MySQL 索引失效情况

MySQL 索引失效情况防止索引失效的方式:索引全值匹配。最佳左前缀法则。不再索引上做任何操作(计算、函数、类型转换等),否则索引失效。存储引擎不能使用索引范围条件右侧的列。尽量使用覆盖索引。MySQL 在使用不等条件时,索引失效。is not null 无法使用索引。like 以通配符开头,MySQL 索引会失效;但以通配符结尾,索引不受影响。字符串不加单引号导致索引失效(类型转换)。10.使用 or ,索引失效。SQL 索引失效分析:注:其中有些索引的使用在数据量极小时可能

2022-03-01 08:53:10 1895

原创 MySQL 性能分析之 EXPLAIN 关键字

MySQL 性能分析之 EXPLAIN 关键字EXPLAIN 能够分析出什么EXPLAIN 中字段含义EXPLAIN 关键字可以模拟优化器执行 SQL 查询语句,分析语句的性能瓶颈。EXPLAIN 能够分析出什么EXPLAIN 关键字能够分析出:表的读取顺序。数据读取操作的操作类型。哪些索引可以使用。哪些索引被实际使用。表之间的引用。每张表有多少行被优化器查询。EXPLAIN 中字段含义id:id相同,执行顺序从上至下;id不同,id越大,越先被执行;id有相同也有不同时,id越大

2022-03-01 08:27:43 218

原创 MySQL 中索引底层实现与最佳左前缀法则

MySQL 中索引底层实现与最佳左前缀法则索引结构分类BTreeB+Tree 结构MySQL 中的索引实现最左前缀法则最后几个小问题为什么不使用最佳左缀就不能走索引呢?为什么建议 InnoDB 表必须建主键?为什么不建议使用 UUID,而推荐使用自增的整型数据?为什么推荐使用主键自增?为什么非主键索引结构的叶子节点存储的是主键值?索引结构分类MySQL 中索引有两种结构,分别为 B+Tree 结构和 HASH结构。B+Tree 结构:非叶子节点不存储数据,叶子节点存储数据,可以放更多的索引。叶

2022-02-28 22:04:53 496

原创 初识 MySQL 索引

初识 MySQL 索引使用索引的规则使用索引的优缺点索引的分类创建索引的场景索引是排好序的快速查找的数据结构,能够有效提高查找效率。使用索引的规则使用索引的优缺点使用索引的优点:提高检索效率,降低数据库对磁盘 I/O 成本。对数据排序,降低数据排序成本,降低 CPU 消耗。使用索引的缺点:索引也会占用空间(内存和磁盘)。所以每个表的索引最好不超过5个。提高查询速度,同时降低更新表的速度。索引的分类索引分为三大类:单值索引。即一个索引只包含一个字段。唯一索引。即索引列值必须

2022-02-28 21:04:28 123

原创 MySQL 存储引擎之 MyISAM 与 InnoDB 对比

MySQL 存储引擎之 MyISAM 与 InnoDB 对比存储引擎MyISAMInnoDB主外键不支持支持事务不支持支持行表锁表锁,即使操作一条记录也会锁住整个表行锁,操作时只锁住一行,不对其他行有影响,适合高并发场景表空间小(MyISAM 的数据会有三个文件,.MYI 存储索引,.MYD 存储数据,.frm 存储表结构)。大(InnoDB 的数据只有两个文件,.frm 文件存储表结构,.ibd 文件存储数据和索引)。关注点性能事务

2022-02-28 20:13:05 209

原创 List、Set 和 Map 小总结

List、Set 和 Map小总结List 集合ArrayListLinkedListList 总结Set 集合HashSetLinkedHashSetTreeSetSet 总结Map 集合HashMapLinkedHashMapTreeMapMap 总结常用集合有三种,List、Set 和 Map。List 和 Set 都继承了 Collection 接口。而 Map 是顶级接口。List 集合List 集合常用的有两种,ArrayList 和 LinkedList。ArrayListArray

2022-02-27 22:04:57 724

原创 线程池的处理流程于核心参数

线程池的处理流程于核心参数线程池的处理流程如下:线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下一流程。线程池判断工作队列是否已满。如果工作线程队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下一流程。线程池判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程来执行任务。如果满了,则交给饱和策略来处理这个任务。ThreadPoolExecutor 执行 execute

2022-02-26 11:45:11 217

原创 线程状态的转换

线程状态的转换Java 中有六种状态:RUNNABLE(运行状态),WAITING(等待状态),READY(就绪状态),TIMED_WAITING(超时等待),BLOCKEND(阻塞状态),TERMINATED(终止状态)。RUNNING(运行状态) 与 READY(就绪态)根据系统调用进行切换。WAITING(等待状态)切换到 READY(就绪态):Object.wait()、Object.join()、LockSupport.park()。READY/RUNNING(就绪/运行态)切换到

2022-02-26 11:02:56 126

原创 线程间通信模型

线程间通信volatile 和 synchrnoized 关键字进行线程通信等待/通知机制volatile 和 synchrnoized 关键字进行线程通信volatile 关键字通过内存原语实现线程间通信(隐式通信,写后将其他线程本地内存无效化)。synchrnoized 关键字是对对象的监视器(monitor)进行上锁,此方式是排他的。对象、监视器、同步对象和执行线程的关系:任意线程对 Object 的访问,首先要获得 Object 的监视器。如果获取失败,线程进入同步队列等待,线程状态变为

2022-02-26 10:20:50 158

原创 面试问Java并发编程还不了解 AQS?一文搞懂 AQS 源码

面试问Java并发编程还不了解AQS?一文搞懂AQS源码!AQS是什么?AQS三大基石AQS源码之路AQS是什么?AQS全称为AbstractQueueSynchronizer,顾名思义——抽象队列同步器,是ReentrantLock、ReentrantReadWriteLock等锁的底层实现。抽象队列同步器的工作原理是将工作线程封装为Node节点,当线程竞争锁时,通过CAS方式来设置state数值,当state数值大于等于1时,工作线程无法争抢锁,进入双向队列等待;当工作线程工作完毕时,通过CAS操

2022-02-26 09:17:32 79

原创 final 域的内存语义

final 域的内存语义对于 final 域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个 final 域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两操作不能重排序(保证在构造函数中对 final 域的初始化)。即构造函数在给 final 域初始化时,不能重排序到对象赋值的后面,会导致并发时,final 域数据读取不到。初次读一个包含 final 域的对象的引用,与随后初次读取这个 final 域,这两个操作之间不能重排序(必须等包含 final 域的对象的引用完毕后,才能

2022-02-26 08:21:30 86

原创 volatile 的内存语义

volatile 的内存语义volatile 写--读建立的 happens-before 关系volatile 的内存语义volatile 内存语义的实现总结volatile 修饰的变量具有以下特性:可见性。对一个 volatile 变量的读,总是能看到任意线程对这个 volatile 变量最后的写入。原子性。对任意单个 volatile 变量的读/写具有原子性(除去 double 和 float 类型变量,因为这两种类型变量为 64 位类型)。一个 volatile 变量的单个读/写操作,与

2022-02-26 07:49:26 66

原创 并发基础之Java内存模型、指令重排与数据正确性

并发基础之Java内存模型、指令重排与数据正确性Java 内存模型指令重排数据正确性数据依赖性重排序对多线程的影响操作依赖性顺序一致性JMM 对数据安全性的保证在不改变程序执行结果的前提下,尽可能提高并行度。Java 内存模型JMM 就是 Java 内存模型,由于 Java 默认支持多线程操作,每个线程中都有自己的缓存,即下图中的本地内存(本地内存并不真实存在)。JMM 通过控制主内存与每个线程的本地内存之间的交互,实现内存可见性的保证。指令重排重排序分为三种类型,分别为编译器优化的重排序、指

2022-02-26 07:49:01 262

原创 Synchronized 的实现原理

Synchronized 的实现原理synchronized 关键字,是隐式上锁,可以修饰方法或代码块。JVM 基于 Monitor 对象来实现同步方法同步和代码块同步的。代码块同步是使用 monitorenter 和 monitorexit 指令实现的。任何一个对象都与 moniter 关联,当且仅当一个 moniter 被持有后,它将处于锁定状态。线程执行到 monitorenter 指令时,尝试获取对象所对应的 monitor 的所有权,即尝试获取对象的锁。synchronized 使用的

2022-02-26 07:48:43 52

原创 原子操作的实现原理

原子操作的实现原理与CAS实现原子操作原子操作表示操作是一个整体,不可再分。在并发场景下,如果无法保证某些操作是原子的,数据就无法一致,导致系统不可用。处理器保证原子操作处理器层面有两种方式实现原子操作:通过总线锁来保证原子性。总线锁就是使用处理器提供的一个 LOCK # 信号,当一个处理器在总线上输出此信号时,其他处理器的请求就会被阻塞住,该处理器可以独占贡献内存。但此种方式,开销比较大,在锁总线期间,其他处理器无法操作其他内存地址的数据。通过缓存锁定来保证原子性。使用“缓存锁定”的方式来

2022-02-26 07:48:34 350

原创 数据可见性理论之 happens-before 规则

数据可见性理论之 happens-beforehappens-before 要求前一操作 A 的执行结果对后一操作 B 可见,且 A 操作按顺序排在 B 操作之前(但不意味 A 操作必须在 B 操作前执行)。happens-before 规则保证线程间的内存可见性。...

2022-02-26 07:48:23 190

原创 并发编程基石之内存屏障

并发编程基石之内存屏障屏障类型指令实例说明意义LoadLoad BarriersLoad1; LoadLoad; Load2确保 Load1 数据的装载优先于 Load2 及所有后续装载指令的装载保证数据的一致性(防止重排序导致数据执行错误)StoreStore BarriersStore1; StoreStore; Store2确保 Store1 数据对其他处理器可见(刷新到内存)先于 Store2 及所有后续存储指令的存储确保 Store2 准确获取 Stor

2022-02-25 11:45:59 59

原创 分布式事务方案

分布式事务XA 方案TCC 方案本地消息表可靠消息最终一致性方案最大努力通知方案事务就是将对某一数据的多个操作视为原子操作,统一成功,同一失败。单体项目中,使用数据库的事务即可,但在分布式架构下,单体项目的数据库事务就没有用武之地了。XA 方案两阶段提交方案。使用的是数据库的资源管理器(RM)和事务管理器(TM)。第一阶段,告知准备提交。第二阶段,进行提交,若有不能提交的部分,则告知回滚。TCC 方案TCC 方案就是 Try、 Confirm、 Cancel。先尝试,对各个服务的资源进行锁定。

2022-02-25 11:19:34 287

原创 分布式锁类型

分布式锁redis 实现分布式锁zookeeper 实现分布式锁redis 分布式锁与 zookeeper 分布式锁的区别在高并发场景下,使用 syncronize 或者 Lock 锁的方式可以保证一个变量被一个线程所执行,且数据一致。而在分布式系统中,即使能够保证数据被一个线程所执行,但是多机环境,无法保证其他机器是否对数据进行了操作。这就需要用到分布式锁。redis 实现分布式锁set lock value NX PX 30000 或 setnx lock value + expire lock

2022-02-25 10:59:24 224

原创 dubbo的spi思想

dubbo的spi思想什么是 spi 思想dubbo 的 spi 思想什么是 spi 思想spi 思想,有一个接口,有多个不同的实现类,而通过一些配置后,能够自动选定使用哪个实现类。spi 思想是通过接口进行扩展操作,通过配置来选定实现类的方式来进行扩展。dubbo 的 spi 思想在接口上使用 @SPI("") 注解来指定key,配置文件中按照 properties 格式配置(key=value 的格式),通过 spi 指定的 key 来锁定实现类的路径。如果要使用该方式,需要在实现类中使用

2022-02-25 10:21:51 291

原创 保证分布式服务接口请求的顺序性

保证分布式服务接口请求的顺序性保证分布式服务接口请求的顺序性,就是要把该接口请求的异步变为同步执行。使用 dubbo 的一致性 hash 负载均衡,对某一数据操作的请求都分配到一台机器中,然后再使用内存队列来保证顺序执行。...

2022-02-25 09:54:37 301

原创 分布式服务接口的幂等性

分布式服务接口的幂等性要保证分布式接口的幂等性,三大点:对每个请求必须有一个唯一的标识。每次处理完请求后,必须有以及记录标识这个请求处理过了。每次接收请求需要进行判断,判断之前是否处理过。...

2022-02-25 09:41:44 66

原创 dubbo的负载均衡策略以及集群容错策略

dubbo的负载均衡策略以及集群容错策略dubbo 负载均衡策略dubbo 集群容错策略dubbo 负载均衡策略dobbo的负载均衡策略:random loadbalance ,随机调用实现负载均衡。可以对 privider 不同的实例设置不同的权重,会按照权重来负载均衡。roundrobin loadbalance ,轮询机制。均匀的请求各个 provider 实例。leastactive loadbalance ,自动感知。如果某个机器性能越差,那么接收的请求越少,越不活跃,此时就会给不活跃

2022-02-25 09:32:37 489

原创 Dubbo的工作原理

Dubbo的工作原理Dubbo十层架构:第一层:service 层,为服务提供者和消费者来实现的第二层:config 层,主要对 dubbo 进行配置的第三层:proxy 层,无论是 consumer 还是 provider,dubbo 都会给你生成代理,代理之间进行网络通信第四层:registry 层,复制服务的注册与发现第五层:cluster 层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务第六层:monitor 层,对 rpc接口的调用次数和调用时间进行监控第七层:

2022-02-25 09:23:24 69

原创 防止RabbitMQ重复消费

防止RabbitMQ重复消费消息重复消费的弊端:消息重复消费可能会出现数据不一致/数据冗余问题,在后期的查找返回一个对象的场景时会出现异常。保证消息幂等性的方式:消费者将消息存储到 set/hashMap 中,进行去重/计数,根据结果来判断消息是否处理。对db进行插入操作时,对数据进行查询,如果存在,则不进行操作。在消息中使用全局 ID ,并向 Redis 中进行查询,若存在则不进行处理。...

2022-02-25 08:12:18 273

MyBatis官方包.rar

MyBatis的jar包和依赖jar

2021-03-19

nasm-2.15.05.tar.gz

Linux下nasm安装包

2021-01-15

commons-dbutils-1.7-bin,commons-dbutils 1.7 的ar

jar

2021-01-08

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

TA关注的人

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