- 博客(81)
- 收藏
- 关注
原创 Mysql执行过程与InnoDB日志机制
binlog二进制日志记录保存了所有执行过的修改操作语句(如INSERT、UPDATE、DELETE、CREATE、ALTER等),不保存查询操作。Undo Log 是 InnoDB 存储引擎用来 回滚数据 和 实现 MVCC(多版本并发控制) 的重要日志, 记录的是事务对数据做出修改之前的 旧值。当某个页被加载到 Buffer Pool 后,如果事务在内存里对它做了修改,但 磁盘上的该页还没有更新,此时就叫它。MySQL 8.0 以前的版本有查询缓存,但更新语句会直接清空相关表缓存,一般不会命中。
2025-09-23 15:34:24
1085
原创 Mysql事务隔离级别、锁机制以及MVCC原理
for update)的语句,事务才真正启动,才会向mysql申请真正的事务id,mysql内部是严格按照事务的启动顺序来分配事务id的。都实现了MVCC机制,对一行数据的读和写两个操作默认是不会通过加锁互斥来保证隔离性,避免了频繁加锁互斥,而在串行化隔离级别为了保证较高的隔离性是通过将所有操作加锁互斥来实现的。死锁指的是两个或多个事务在并发过程中,互相占用了对方所需的锁资源,并且都在等待对方释放,从而进入 无限等待 的状态。部分,详细描述了死锁涉及的事务、SQL 语句、等待的锁。事务在范围查询时使用了。
2025-09-19 10:56:40
1064
原创 数据流图DFD
数据流图(Data Flow Diagram,DFD)是一种图形化工具,用于描述系统内部的数据流动、处理逻辑和数据存储。它通过节点(如加工、数据存储)和箭头(数据流)直观展示系统各组件间的交互关系,适用于结构化系统分析与设计。
2025-09-17 21:12:31
442
原创 Mysql索引优化
如果一个索引包含了查询所需的所有字段(覆盖索引),会优先选择,因为可以避免回表。在 MySQL(尤其是 InnoDB)里,索引并不是建了就一定能用。对联合索引(多列索引),只有按照索引定义的最左字段开始查询时才能用到索引。来选择是否走索引、以及用哪一个索引。小表(几十或几百行),优化器可能认为全表扫描比走索引更快。索引扫描时,先过滤区分度高的字段,能显著减少扫描范围。,如果 a 和 b 分别有索引,通常不会用。(a 有索引,b 无索引)→ 可能全表扫描。, 索引优化器认为过滤性差,往往不用索引。
2025-09-17 15:06:28
1085
原创 设计模式概述
设计模式是解决软件设计中常见问题的可复用方案,提供了一套经过验证的代码结构和交互方式。它们不直接转化为代码,而是描述如何组织类和对象以应对特定场景。设计模式通常分为三大类:创建型模式、结构型模式和行为型模式。这类模式关注对象的创建机制,旨在以更灵活的方式创建对象,避免直接使用关键字。工厂方法模式 (Factory Method)抽象工厂模式 (Abstract Factory)单例模式 (Singleton)建造者模式 (Builder)原型模式 (Prototype)这类模式关注类和对象的组合方
2025-09-17 10:31:35
805
原创 Explain详解
使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈。在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息。
2025-09-16 16:18:26
982
原创 Redis线程模型
Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的。整个线程模型可以理解为还是以单线程为主。基于这种单线程为主的线程模型,不同客户端的各种指令都需要依次排队执行。
2025-09-14 18:37:09
1064
原创 Redis核心数据结构
1)数据分片问题 Redis 集群采用 CRC16 算法对 key 进行分片,而 Hash 类型的所有字段(field)会被视为同一个 key 的一部分。这导致整个 Hash 必须存储在同一个节点上,无法分散到多个节点。2)内存效率瓶颈 Redis 的 ziplist 编码优化对小型 Hash 有效(默认阈值 512 个字段),但超过阈值后转为 hashtable 编码,内存占用会显著上升。1)一个list的容量是2的32次方减1个元素,大概40多亿,但在应用时,要注意big key。
2025-09-09 17:30:11
746
原创 Redis持久化,主从、哨兵、集群详解
但是,如果主线程要修改一块数据,那么,这块数据就会被复制一份,生成该数据的副本。如果开启了混合持久化,AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将重写这一刻之前的内存做RDB快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件,新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改名,覆盖原有的AOF文件,完成新旧两个AOF文件的替换。持久化机制解决了这一问题,提供了数据可靠性和灾难恢复能力。
2025-08-22 10:35:47
214
原创 Redis 安装教程
本文将介绍在centOS7系统下,安装redis。单机版部署编写完毕,这样部署的好处是可以更多了解配置文件的内容,而不是执行一下安装步骤,一带而过,后续部署方式待更新。只执行redis-server, 退出之后就会关闭redis服务,无法后台运行。7. 配置Redis (这是开发学习的配置,生产对于密码和远程连接慎重设置)打开之后,输入:set number会显示行号, 下面行号的位置大差不差,修改完所有配置后,使用配置文件去启动redis服务。如果没安装,执行一下安装命令。6. 启动Redis。
2025-08-20 15:56:00
878
原创 Nacos 配置踩坑-connect to address 0.0.0.1: No route to host
Nacos服务注册,服务发现的原配置上面的配置启动服务,看似注册成功,但是服务注册的ip是0.0.1.1,控制台输出如下当我用gateway去调用我需要的服务的时候,就报错了,
2025-08-04 15:04:36
252
原创 微服务基础环境搭建-centos7
编译完成后,在源码的target⽬录下可以获得可运⾏的jar包rocketmq-dashboard-1.0.1-SNAPSHOT.jar。rocketmq-dashboard-master.zip包中,只包含了Dashboard服务的源码,并没有直接提供编译后的jar包。下载⻚⾯: https://nacos.io/download/nacos-server/。需要特别注意的是,对于镜像中需要持久化保存的⽂件,需要通过-v挂载到宿主机上,这样这些⽂件才不会随。在nacos中,有个命名空间的概念。
2025-07-18 12:38:48
736
原创 vanna+deepseekV3+streamlit本地化部署
vanna是一个基于 MIT 许可的开源 Python RAG(检索增强生成)框架,专注于 SQL 生成和相关功能。它利用大型语言模型(LLM)和检索增强生成技术,将自然语言输入转换为 SQL 查询,允许用户通过自然语言与数据库交互,无需精通 SQL 语法即可提取数据中的有价值信息。
2025-03-12 16:18:54
2922
4
原创 Conda+jupyterlab
Conda 是一个开源的包管理和环境管理工具,适用于 Python 及其他编程语言。它允许用户轻松安装、更新和卸载软件包,并支持创建独立的虚拟环境,以避免依赖冲突Conda 通过 Anaconda 或 Miniconda 发行版分发,Anaconda 包含大量预装的科学计算和数据分析包,而 Miniconda 则是轻量版,仅包含核心功能。
2025-03-11 17:35:02
1336
原创 数据库体系结构概述
文章目录1、集中式数据库2、分布式数据库2.1、体系结构2.2、特性2.3、分片方式2.4、透明性2.5、两阶段提交协议 2PC1、集中式数据库三级模式外模式: 也称用户模式,对应 用户视图模式(概念模式): 对应数据库表(关系表)内模式(存储模式): 对应物理文件两层映射外模式-模式映射逻辑独立性:修改关系表,用户程序不需要随之修改模式-内模式映射物理独立性:修改文件存储,用户程序不需要随之修改聚簇索引会影响内模式2、分布式数据库2.1、体系结构全局外模
2024-09-10 06:36:26
455
原创 软件架构风格
软件架构风格是描述某一特定应用领域中系统组织的惯用模式。架构风格定义一个系统家族,即一个架构定义一个词汇表和一组约束。词汇表中包含一些构件和连接件类型,而这组约束指出系统是如何将这些构件和连接件组织起来的。架构风格反映了领域中众多系统所共有的结构和语义特性,并指导如何将各个模块和子系统有效地组织成一个完整的系统。对软件架构风格的研究和实践促进对设计的重用,一些经过实践证实过的解决方案也可以可靠的用于解决新的问题。
2024-08-30 18:07:24
995
原创 手写模拟SpringBoot核心流程
SpringBoot是基于的Spring,所以我们要依赖Spring,然后我希望我们模拟出来的SpringBoot也支持Spring MVC的那一套功能,所以也要依赖Spring MVC,包括Tomcat等,所以在SpringBoot模块中要添加以下依赖。创建一个工程,包含springboot和user两个module。
2023-11-14 11:45:41
257
原创 Netty核心源码剖析
为了尽可能的避免锁竞争带来的性能损耗,可以通过串行化设计,即消息的处理尽可能在同一个线程内完成,期间不进行线程切换,这样就避免了多线程竞争和同步锁。Netty的NioEventLoop读取到消息之后,直接调用ChannelPipeline的fireChannelRead(Object msg),只要用户不主动切换线程,一直会由NioEventLoop调用到用户的Handler,期间不进行线程切换,这种串行化处理方式避免了多线程操作导致的锁的竞争,从性能角度看是最优的。
2023-11-06 18:06:28
224
原创 netty实战-手写通信框架
消息定义包含两部分:消息头;消息体。在消息的定义上,因为是同步处理模式,不考虑应答消息需要填入请求消息 ID,所以消息头中只有一个消息的 ID。如果要支持异步模式,则请求消息头和应答消息头最好分开设计,应答消息头中除了包括本消息的 ID 外,还应该包括请求消息 ID,以方便请求消息的发送方根据请求消息 ID 做对应的业务处理。消息体则支持 Java 对象类型的消息内容。
2023-11-02 14:35:48
146
原创 Netty 使用和常用组件
每个事件都可以被分发给 ChannelHandler 类中的某个用户实现的方法,既然事件分为入站和出站,用来处理事件的 ChannelHandler 也被分为可以处理入站事件的 Handler 和出站事件的 Handler,当然有些 Handler 既可以处理入站也可以处理出站。它代表一个到实体(如一个硬件设备、一个文件、一个网络套接字或者一个能够执行一个或者多个不同的 I/O 操作的程序组件)的开放连接,如读操作和写操作。Netty 使用不同的事件来通知我们状态的改变或者是操作的状态。
2023-10-30 14:55:01
126
原创 深入Linux内核理解epoll事件轮询机制
当某一进程调用 epoll_create 方法时,Linux 内核会创建一个 eventpoll 结构体,在内核cache 里建了个红黑树用于存储以后 epoll_ctl 传来的 socket 外,还会再建立一个 rdllist 双向链表,用于存储准备就绪的事件,当 epoll_wait 调用时,仅仅观察这个 rdllist 双向链表里有没有数据即可。有数据就返回,没有数据就 sleep,等到 timeout 时间到后即使链表没数据也返回。
2023-10-25 07:05:23
773
原创 BIO实战、NIO编程与直接内存、零拷贝深入剖析
客户端 Socket 类的实例发起连接操作,ServerSocket接受连接后产生一个新的服务端 socket 实例负责和客户端 socket 实例通过输入和输出流进。启动一个新的Client 程序实例,会发现尽管新的 Client实例连接上了服务器,但是ServerSingle。动一个 Client 程序实例,并让这个 Client 阻塞住,位置就在向服务器输出具体请求之前,再。所以在 BIO 通信里,我们往往会在服务器的实现上结合线程来处理连接以及和客户端的。bio 的阻塞,主要体现在两个地方。
2023-10-16 12:04:59
1121
原创 Zookeeper分布式一致性协议ZAB源码剖析
ZAB 协议全称:Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。Zookeeper 是一个为分布式应用提供高效且可靠的分布式协调服务。在解决分布式一致性方面,Zookeeper 并没有使用 Paxos ,而是采用了 ZAB 协议,ZAB是Paxos算法的一种简化实现。ZAB 协议定义:ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持 崩溃恢复 和 原子广播 的协议。下面我们会重点讲这两个东西。
2023-10-11 18:00:09
605
原创 Zookeeper集群Leader选举源码剖析
开源项目找入口类一般都是从启动脚本去找,可以从bin目录下的zkServer.sh或zkServer.cmd里找到启动主类运行即可。1、将conf文件夹里的zoo_sample.cfg文件复制一份改名为zoo.cfg,将zoo.cfg文件位置配置到启动参数里。源码导入idea后,org.apache.zookeeper.Version类会报错,需要建一个辅助类。
2023-10-10 11:59:38
128
原创 Zookeeper经典应用场景实战(二)
在单体的应用开发场景中涉及并发同步的时候,大家往往采用Synchronized(同步)或者其他同一个JVM内Lock机制来解决多线程间的同步问题。在分布式集群工作的开发场景中,就需要一种更加高级的锁机制来处理跨机器的进程之间的数据同步问题,这种跨机器的锁就是分布式锁。基于数据库的分布式锁。这种方案使用数据库的事务和锁机制来实现分布式锁。虽然在某些场景下可以实现简单的分布式锁,但由于数据库操作的性能相对较低,并且可能面临锁表的风险,所以一般不是首选方案。基于Redis的分布式锁。
2023-10-07 18:01:19
472
原创 Zookeeper经典应用场景实战(一)
而一旦流量洪峰过去了,就需要下线大量的节点。在 Curator 中,可以使用 create 函数创建数据节点,并通过 withMode 函数指定节点类型(持久化节点,临时节点,顺序节点,临时顺序节点,持久化顺序节点等),默认是持久化节点,之后调用 forPath 函数来指定节点的路径和数据信息。5.MongoDb的ObjectId:MongoDB是一个分布式的非结构化NoSQL数据库,每插入一条记录会自动生成全局唯一的一个“_id”字段值,它是一个12字节的字符串,可以作为分布式系统中全局唯一的ID。
2023-10-06 08:04:52
4170
原创 Zookeeper特性与节点数据类型详解
ZooKeeper 是一个开源的分布式协调框架,是Apache Hadoop 的一个子项目,主要用来解决分布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。官方:https://zookeeper.apache.org/ZooKeeper本质上是一个分布式的小文件存储系统(Zookeeper=文件系统+监听机制)。
2023-10-05 13:10:40
656
原创 Kafka日志索引详解以及生产常见问题分析与总结
然后,Kafka的log文件只能以追加的方式往文件的末端添加(这种写入方式称为顺序写),这样,新的数据写入时,就可以直接往直前申请的磁盘空间中写入,而不用再去磁盘其他地方寻找空闲的空间(普通的读写文件需要先寻找空闲的磁盘空间,再写入。所以,只有文件名最大的一个log文件是当前写入消息的日志文件,其他文件都是不可修改的历史日志。 index文件的作用类似于数据结构中的跳表,他的作用是用来加速查询log文件的效率。 Kafka为了防止过多的日志文件给服务器带来过大的压力,他会定期删除过期的log文件。
2023-10-04 08:04:13
439
1
原创 Kafka集群架构设计原理详解
对于Kafka往Zookeeper上注册的这些节点,大部分都是比较简明的。比如/brokers/ids下,会记录集群中的所有BrokerId,/topics目录下,会记录当前Kafka的Topic相关的Partition分区等信息。 当一个集群内的Kafka服务启动时,就会尝试往Zookeeper上创建一个/controller临时节点,并将自己的brokerid写入这个节点。 选举产生的Controller节点,就会负责监听Zookeeper中的其他一些关键节点,触发集群的相关管理工作。
2023-10-01 12:45:03
206
原创 Kafka快速实战以及基本原理详解
ChatGPT对于Apache Kafka的介绍:Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发并于2011年开源。它主要用于解决大规模数据的实时流式处理和数据管道问题。Kafka是一个分布式的发布-订阅消息系统,可以快速地处理高吞吐量的数据流,并将数据实时地分发到多个消费者中。Kafka消息系统由多个broker(服务器)组成,这些broker可以在多个数据中心之间分布式部署,以提供高可用性和容错性。Kafka的基本架构由生产者、消费者和主题(topic)组成。
2023-09-27 10:30:21
701
原创 RocketMQ生产环境常见问题分析与总结
然后把所有消费者节点的目标Topic转向新的Topic,并紧急上线一组新的消费者,只负责消费旧Topic中的消息,并转储到新的Topic中,这个速度是可以很快的。因为Dledger集群会接管RocketMQ原有的CommitLog日志,所以切换主从架构时,如果有消息没有消费完,这些消息是存在旧的CommitLog中的,就无法再进行消费了。而RocketMQ的事务消息机制,实际上只保证了整个事务消息的一半,他保证的是订单系统下单和发消息这两个事件的事务一致性,而对下游服务的事务并没有保证。
2023-09-26 09:08:00
281
原创 RocketMQ高性能核心原理与源码架构剖析
但是在测试源码中,需要指定NameServer地址。 调试时,先在项目目录下创建一个conf目录,并从distribution拷贝broker.conf和logback_broker.xml和logback_namesrv.xml。启动example模块下的org.apache.rocketmq.example.quickstart.Producer类即可发送消息。启动Broker时,同样需要ROCETMQ_HOME环境变量,并且还需要配置一个-c 参数,指向broker.conf配置文件。
2023-09-22 14:22:02
610
原创 RocketMQ 核心编程模型以及生产环境最佳实践
这样,这些重试的消息有了自己单独的队列,就不会影响到Topic下的其他消息了。如果Broker端还没有返回SendResult,而生产者主线程已经停止了,那么SendCallback的执行线程也就会随主线程一起停止,对应的方法自然也就无法执行了。但是,这里还是会造成一种分裂,消息最终是由Consumer来处理,但是消息却是由Broker推送过来的,也就是说,Consumer无法确定自己将要处理的是哪些消息。因此,如果要重新发送消息,最好要带上唯一的系统标识,这样在消费者端,才能自行做幂等判断。
2023-09-20 17:29:24
290
原创 RocketMQ快速实战以及集群架构详解
MQ:MessageQueue,消息队列。是在互联网中使用非常广泛的一系列服务中间件。这个词可以分两个部分来看一是Message:消息。消息是在不同进程之间传递的数据。这些进程可以部署在同一台机器上,也可以分布在不同机器上。二是Queue:队列。队列原意是指一种具有FIFO(先进先出)特性的数据结构,是用来缓存数据的。对于消息中间件产品来说,能不能保证FIFO特性,尚值得考量。但是,所有消息队列都是需要具备存储消息,让消息排队的能力。
2023-09-17 11:48:19
519
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅