自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 vanna+deepseekV3+streamlit本地化部署

vanna是一个基于 MIT 许可的开源 Python RAG(检索增强生成)框架,专注于 SQL 生成和相关功能。它利用大型语言模型(LLM)和检索增强生成技术,将自然语言输入转换为 SQL 查询,允许用户通过自然语言与数据库交互,无需精通 SQL 语法即可提取数据中的有价值信息。

2025-03-12 16:18:54 1258 2

原创 Conda+jupyterlab

Conda 是一个开源的包管理和环境管理工具,适用于 Python 及其他编程语言。它允许用户轻松安装、更新和卸载软件包,并支持创建独立的虚拟环境,以避免依赖冲突Conda 通过 Anaconda 或 Miniconda 发行版分发,Anaconda 包含大量预装的科学计算和数据分析包,而 Miniconda 则是轻量版,仅包含核心功能。

2025-03-11 17:35:02 1038

原创 数据库体系结构概述

文章目录1、集中式数据库2、分布式数据库2.1、体系结构2.2、特性2.3、分片方式2.4、透明性2.5、两阶段提交协议 2PC1、集中式数据库三级模式外模式: 也称用户模式,对应 用户视图模式(概念模式): 对应数据库表(关系表)内模式(存储模式): 对应物理文件两层映射外模式-模式映射逻辑独立性:修改关系表,用户程序不需要随之修改模式-内模式映射物理独立性:修改文件存储,用户程序不需要随之修改聚簇索引会影响内模式2、分布式数据库2.1、体系结构全局外模

2024-09-10 06:36:26 381

原创 UML概述

构造块规则公共机制

2024-09-04 17:40:27 338

原创 软件架构风格

软件架构风格是描述某一特定应用领域中系统组织的惯用模式。架构风格定义一个系统家族,即一个架构定义一个词汇表和一组约束。词汇表中包含一些构件和连接件类型,而这组约束指出系统是如何将这些构件和连接件组织起来的。架构风格反映了领域中众多系统所共有的结构和语义特性,并指导如何将各个模块和子系统有效地组织成一个完整的系统。对软件架构风格的研究和实践促进对设计的重用,一些经过实践证实过的解决方案也可以可靠的用于解决新的问题。

2024-08-30 18:07:24 813

原创 centos7安装nginx

【代码】centos7安装nginx。

2024-01-17 17:47:51 478

原创 centos7安装jdk

查询可安装的jdk版本。查看已安装java版本。

2024-01-17 17:33:50 438

原创 Alibaba Nacos注册中心实战

服务注册中心的作用就是。

2023-11-21 18:22:24 117

原创 手写模拟SpringBoot核心流程

SpringBoot是基于的Spring,所以我们要依赖Spring,然后我希望我们模拟出来的SpringBoot也支持Spring MVC的那一套功能,所以也要依赖Spring MVC,包括Tomcat等,所以在SpringBoot模块中要添加以下依赖。创建一个工程,包含springboot和user两个module。

2023-11-14 11:45:41 210

原创 Netty核心源码剖析

为了尽可能的避免锁竞争带来的性能损耗,可以通过串行化设计,即消息的处理尽可能在同一个线程内完成,期间不进行线程切换,这样就避免了多线程竞争和同步锁。Netty的NioEventLoop读取到消息之后,直接调用ChannelPipeline的fireChannelRead(Object msg),只要用户不主动切换线程,一直会由NioEventLoop调用到用户的Handler,期间不进行线程切换,这种串行化处理方式避免了多线程操作导致的锁的竞争,从性能角度看是最优的。

2023-11-06 18:06:28 180

原创 netty实战-手写通信框架

消息定义包含两部分:消息头;消息体。在消息的定义上,因为是同步处理模式,不考虑应答消息需要填入请求消息 ID,所以消息头中只有一个消息的 ID。如果要支持异步模式,则请求消息头和应答消息头最好分开设计,应答消息头中除了包括本消息的 ID 外,还应该包括请求消息 ID,以方便请求消息的发送方根据请求消息 ID 做对应的业务处理。消息体则支持 Java 对象类型的消息内容。

2023-11-02 14:35:48 116

原创 Netty 使用和常用组件

每个事件都可以被分发给 ChannelHandler 类中的某个用户实现的方法,既然事件分为入站和出站,用来处理事件的 ChannelHandler 也被分为可以处理入站事件的 Handler 和出站事件的 Handler,当然有些 Handler 既可以处理入站也可以处理出站。它代表一个到实体(如一个硬件设备、一个文件、一个网络套接字或者一个能够执行一个或者多个不同的 I/O 操作的程序组件)的开放连接,如读操作和写操作。Netty 使用不同的事件来通知我们状态的改变或者是操作的状态。

2023-10-30 14:55:01 100

原创 深入Linux内核理解epoll事件轮询机制

当某一进程调用 epoll_create 方法时,Linux 内核会创建一个 eventpoll 结构体,在内核cache 里建了个红黑树用于存储以后 epoll_ctl 传来的 socket 外,还会再建立一个 rdllist 双向链表,用于存储准备就绪的事件,当 epoll_wait 调用时,仅仅观察这个 rdllist 双向链表里有没有数据即可。有数据就返回,没有数据就 sleep,等到 timeout 时间到后即使链表没数据也返回。

2023-10-25 07:05:23 534

原创 BIO实战、NIO编程与直接内存、零拷贝深入剖析

客户端 Socket 类的实例发起连接操作,ServerSocket接受连接后产生一个新的服务端 socket 实例负责和客户端 socket 实例通过输入和输出流进。启动一个新的Client 程序实例,会发现尽管新的 Client实例连接上了服务器,但是ServerSingle。动一个 Client 程序实例,并让这个 Client 阻塞住,位置就在向服务器输出具体请求之前,再。所以在 BIO 通信里,我们往往会在服务器的实现上结合线程来处理连接以及和客户端的。bio 的阻塞,主要体现在两个地方。

2023-10-16 12:04:59 1052

原创 Zookeeper分布式一致性协议ZAB源码剖析

ZAB 协议全称:Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。Zookeeper 是一个为分布式应用提供高效且可靠的分布式协调服务。在解决分布式一致性方面,Zookeeper 并没有使用 Paxos ,而是采用了 ZAB 协议,ZAB是Paxos算法的一种简化实现。ZAB 协议定义:ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持 崩溃恢复 和 原子广播 的协议。下面我们会重点讲这两个东西。

2023-10-11 18:00:09 572

原创 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 97

原创 Zookeeper经典应用场景实战(二)

在单体的应用开发场景中涉及并发同步的时候,大家往往采用Synchronized(同步)或者其他同一个JVM内Lock机制来解决多线程间的同步问题。在分布式集群工作的开发场景中,就需要一种更加高级的锁机制来处理跨机器的进程之间的数据同步问题,这种跨机器的锁就是分布式锁。基于数据库的分布式锁。这种方案使用数据库的事务和锁机制来实现分布式锁。虽然在某些场景下可以实现简单的分布式锁,但由于数据库操作的性能相对较低,并且可能面临锁表的风险,所以一般不是首选方案。基于Redis的分布式锁。

2023-10-07 18:01:19 437

原创 Zookeeper经典应用场景实战(一)

而一旦流量洪峰过去了,就需要下线大量的节点。在 Curator 中,可以使用 create 函数创建数据节点,并通过 withMode 函数指定节点类型(持久化节点,临时节点,顺序节点,临时顺序节点,持久化顺序节点等),默认是持久化节点,之后调用 forPath 函数来指定节点的路径和数据信息。5.MongoDb的ObjectId:MongoDB是一个分布式的非结构化NoSQL数据库,每插入一条记录会自动生成全局唯一的一个“_id”字段值,它是一个12字节的字符串,可以作为分布式系统中全局唯一的ID。

2023-10-06 08:04:52 4063

原创 Zookeeper特性与节点数据类型详解

ZooKeeper 是一个开源的分布式协调框架,是Apache Hadoop 的一个子项目,主要用来解决分布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。官方:https://zookeeper.apache.org/ZooKeeper本质上是一个分布式的小文件存储系统(Zookeeper=文件系统+监听机制)。

2023-10-05 13:10:40 592

原创 Kafka日志索引详解以及生产常见问题分析与总结

然后,Kafka的log文件只能以追加的方式往文件的末端添加(这种写入方式称为顺序写),这样,新的数据写入时,就可以直接往直前申请的磁盘空间中写入,而不用再去磁盘其他地方寻找空闲的空间(普通的读写文件需要先寻找空闲的磁盘空间,再写入。所以,只有文件名最大的一个log文件是当前写入消息的日志文件,其他文件都是不可修改的历史日志。​ index文件的作用类似于数据结构中的跳表,他的作用是用来加速查询log文件的效率。​ Kafka为了防止过多的日志文件给服务器带来过大的压力,他会定期删除过期的log文件。

2023-10-04 08:04:13 370 1

原创 Kafka集群架构设计原理详解

对于Kafka往Zookeeper上注册的这些节点,大部分都是比较简明的。比如/brokers/ids下,会记录集群中的所有BrokerId,/topics目录下,会记录当前Kafka的Topic相关的Partition分区等信息。​ 当一个集群内的Kafka服务启动时,就会尝试往Zookeeper上创建一个/controller临时节点,并将自己的brokerid写入这个节点。​ 选举产生的Controller节点,就会负责监听Zookeeper中的其他一些关键节点,触发集群的相关管理工作。

2023-10-01 12:45:03 173

原创 Kafka收发消息核心参数详解

文章目录1、从基础的客户端说起1、从基础的客户端说起

2023-09-29 11:36:38 1740 1

原创 Kafka快速实战以及基本原理详解

​ ChatGPT对于Apache Kafka的介绍:Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发并于2011年开源。它主要用于解决大规模数据的实时流式处理和数据管道问题。Kafka是一个分布式的发布-订阅消息系统,可以快速地处理高吞吐量的数据流,并将数据实时地分发到多个消费者中。Kafka消息系统由多个broker(服务器)组成,这些broker可以在多个数据中心之间分布式部署,以提供高可用性和容错性。Kafka的基本架构由生产者、消费者和主题(topic)组成。

2023-09-27 10:30:21 646

原创 RocketMQ生产环境常见问题分析与总结

然后把所有消费者节点的目标Topic转向新的Topic,并紧急上线一组新的消费者,只负责消费旧Topic中的消息,并转储到新的Topic中,这个速度是可以很快的。因为Dledger集群会接管RocketMQ原有的CommitLog日志,所以切换主从架构时,如果有消息没有消费完,这些消息是存在旧的CommitLog中的,就无法再进行消费了。而RocketMQ的事务消息机制,实际上只保证了整个事务消息的一半,他保证的是订单系统下单和发消息这两个事件的事务一致性,而对下游服务的事务并没有保证。

2023-09-26 09:08:00 200

原创 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 491

原创 RocketMQ 核心编程模型以及生产环境最佳实践

这样,这些重试的消息有了自己单独的队列,就不会影响到Topic下的其他消息了。如果Broker端还没有返回SendResult,而生产者主线程已经停止了,那么SendCallback的执行线程也就会随主线程一起停止,对应的方法自然也就无法执行了。但是,这里还是会造成一种分裂,消息最终是由Consumer来处理,但是消息却是由Broker推送过来的,也就是说,Consumer无法确定自己将要处理的是哪些消息。因此,如果要重新发送消息,最好要带上唯一的系统标识,这样在消费者端,才能自行做幂等判断。

2023-09-20 17:29:24 204

原创 RocketMQ快速实战以及集群架构详解

​ MQ:MessageQueue,消息队列。是在互联网中使用非常广泛的一系列服务中间件。这个词可以分两个部分来看一是Message:消息。消息是在不同进程之间传递的数据。这些进程可以部署在同一台机器上,也可以分布在不同机器上。二是Queue:队列。队列原意是指一种具有FIFO(先进先出)特性的数据结构,是用来缓存数据的。对于消息中间件产品来说,能不能保证FIFO特性,尚值得考量。但是,所有消息队列都是需要具备存储消息,让消息排队的能力。

2023-09-17 11:48:19 461

原创 Redis缓存设计与性能优化

缓存设计

2023-09-12 06:45:07 400

原创 Redis高并发分布式锁实战

高并发场景秒杀抢购超卖bug实战重现秒杀抢购场景下实战JVM级别锁与分布式锁大厂分布式锁Resisson框架实战Lua脚本语言快速入门与使用注意事项Redisson分布式锁源码剖析Redis主从架构锁失效问题解析从CAP角度剖析Redis与Zookeeper分布式锁区别Redlock分布式锁原理与存在的问题分析大促场景如何将分布式锁性能提升100倍

2023-09-09 07:13:50 217

原创 Redis Cluster集群运维与核心原理剖析

Redis集群方案比较

2023-09-07 14:30:47 265

原创 Redis持久化、主从与哨兵架构详解

简单来说,bgsave 子进程是由主线程 fork 生成的,可以共享主线程的所有内存数据。但是,如果主线程要修改一块数据,那么,这块数据就会被复制一份,生成该数据的副本。然后,bgsave 子进程会把这个副本数据写入 RDB 文件,而在这个过程中,主线程仍然可以直接修改原来的数据。还可以手动执行命令生成RDB快照,进入redis客户端执行命令save或bgsave可以生成dump.rdb文件,每次命令执行都会将所有redis内存快照到一个新的rdb文件里,并覆盖原有rdb快照文件。

2023-09-05 08:57:00 857

原创 Redis核心数据结构与高性能原理

Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。

2023-09-03 12:22:25 321

原创 Spring之事务底层源码解析

就是用来判断某个类上是否存在@Transactional注解,或者判断某个方法上是否存在@Transactional注解的。就是代理逻辑,当某个类中存在@Transactional注解时,到时就产生一个代理对象作为Bean,代理对象在执行某个方法时,最终就会进入到TransactionInterceptor的invoke()方法。

2023-09-01 14:17:14 91

原创 Spring之AOP底层源码解析

上面是通过cglib来实现的代理对象的创建,是基于父子类的,被代理类(UserService)是父类,代理类是子类,代理对象就是代理类的实例对象,代理类是由cglib创建的,对于程序员来说不用关心。得到的都是UserService对象,但是执行test()方法时的效果却不一样了,这就是代理所带来的效果。此时,我们new一个UserService对象,然后执行test()方法,结果是显而易见的。:为其他对象提供一种代理以控制对这个对象的访问,增强一个类中的某个方法,对程序进行扩展。

2023-08-28 15:51:34 70

原创 SpringIoC之循环依赖底层源码解析

就是A对象依赖了B对象,B对象依赖了A对象如果不考虑Spring,循环依赖并不是问题,因为对象之间相互依赖是很正常的事情。例如因为,在Spring中,一个对象并不是简单new出来了,而是会经过一系列的Bean的生命周期,就是因为Bean的生命周期所以才会出现循环依赖问题。当然,在Spring中,出现循环依赖的场景很多,有的场景Spring自动帮我们解决了,而有的场景则需要程序员来解决,下文详细来说。

2023-08-22 23:04:12 66

原创 SpringIoC之依赖注入源码解析

方法参数个数为0个,并且 (方法名字以"get"开头 或者 方法名字以"is"开头并且方法的返回类型为boolean)

2023-08-19 07:46:59 187

原创 Spring之Bean生命周期源码解析(下)

但是我们在定义一个Bean时,如果这个Bean实现了DisposableBean接口,或者实现了AutoCloseable接口,或者在BeanDefinition中指定了destroyMethodName,那么这个Bean都属于“DisposableBean”,这些Bean在容器关闭时都要调用相应的销毁方法。会把实现了AutoCloseable接口的类封装成DisposableBeanAdapter,而DisposableBeanAdapter实现了DisposableBean接口。

2023-08-18 22:42:26 64

原创 SpringIoC之Bean生命周期源码解析(上)

Spring启动的时候会进行扫描,会先调用org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#scanCandidateComponents(String basePackage)扫描某个包路径,并得到BeanDefinition的Set集合。

2023-08-16 22:24:52 162

原创 Spring之底层架构核心概念解析

和申明式事务、编程式事务类似,通过,@Bean,@Component等申明式方式所定义的Bean,最终都会被Spring解析为对应的BeanDefinition对象,并放入Spring容器中。BeanDefinition表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点。我们还可以编程式定义Bean,那就是直接通过BeanDefinition,比如。我们还可以通过BeanDefinition设置一个Bean的其他属性。这些,我们可以称之申明式定义Bean。

2023-08-14 17:57:46 67

原创 Spring底层原理整体脉络

AnnotationConfigApplicationContext和ClassPathXmlApplicationContext,都用来创建Java对象的,比如调用getBean()就会去创建对象。在Java语言中,肯定是根据某个类来创建一个对象的。当调用context.getBean(“userService”)时,就会去创建一个对象,但是getBean方法内部怎么知道"userService"对应的是UserService类呢?

2023-08-12 10:26:27 77

空空如也

空空如也

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

TA关注的人

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