- 博客(33)
- 收藏
- 关注
原创 消息系统之 Kafka
由于 Kafka 只能保证 Partition 内消息的有序性,如果需要保证消息有序到达,Producer 必须指定消息到达的 Partition ,这些消息最终只能被 ConsumeGroup 内的一个 Consumer 消费。进行分区,同一个 Topic 的 Partition 会散落在多个 Broker 上,存储为一个阻塞队列,从而达到了数据分布式存储的目的。Broker 作为 Kafka 的服务节点,接收外部生产的数据,在本地磁盘对数据进行备份,并提供数据给指定的接收者。
2024-12-18 09:16:29
1003
原创 Rocket MQ
Broker 在收到消息后,通过 MessageStore 将消息存储到 commitLog 中,但是 consumer 在消费消息的时候是按照 topic+queue 的维度来拉取消息的。Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的Broker Name,不同的Broker Id来定义,BrokerId为0表示Master,非0表示Slave。
2024-12-12 09:57:41
1098
原创 Linux
vim 文件------>进入文件----->命令模式------>按i进入编辑模式----->编辑文件 ------->按Esc进入底行模式----->输入:wq/q!一般为文件的创建者,谁创建了该文件,就天然的成为该文件的所有者,用ls ‐ahl命令可以看到文件的所有者 也可以使用chown 用户名 文件名来修改文件的所有者。当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组 用ls ‐ahl命令可以看到文件的所有组 也可以使用chgrp 组名 文件名来修改文件所在的组。
2024-10-14 11:57:54
1172
原创 线程池__
线程池本质上是一种对象池,用于管理线程资源。在任务执行前,需要从线程池中拿出线程来执行。在任务执行完成之后,把线程放回线程池。实际开发中,线程资源一般通过线程池提供,比如处理数据库连接、接收网络请求。如果队列已满,说明当前任务量已经非常大,仅靠核心线程池内的线程数量已无法处理。线程池会判断最大线程池是否已满,如果没满则创建更多线程,从等待队列首部取得任务并执行。当有新任务等待处理时,线程池会首先判断核心线程池是否已满,如果没满则创建线程执行任务。如果核心线程池已满,线程池会判断队列是否已满。
2024-09-24 09:30:58
302
原创 线程安全||
尝试获取资源,成功则返回true,失败则返回false。(这些重写方法很简单,无非是对于共享资源 state 的获取和释放) 将 AQS 组合在自定义同步组件的实现中,并调用其模板方法,而这些模板方法会调用使用者重写的方法。用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的 ReentrantLock,Semaphore 等。线程抢占资源时会通过 CAS 操作去尝试修改 state ,成功则获取锁成功,失败则进入等待队列等待被唤醒。读锁不能升级为写锁。
2024-09-24 09:29:39
985
原创 线程安全.
synchronized 关键字修饰方法时会对方法添加标志位,当线程执行到某个方法时,JVM会去检查该方法的访问标志是否被设置,如果设置了线程会先获取这个对象所对应的 monitor 对象,再执行方法体,方法执行完后释放 monitor。每次线程进入 synchronized 代码块时就会要求当前线程持有该对象锁,如果当前有其他线程正持有该对象锁,那么新到的线程就必须等待,这样也就保证了每次只有一个线程执行操作。允许一个线程对同一对象多次上锁。当线程需要获取的锁已经被其他线程占用时,该线程会被直接挂起。
2024-09-24 09:26:32
512
原创 线程的基本概念
但是 notify 方法不会释放当前进程的对象锁,如果该线程持有 obj 对象的锁,当前线程释放锁后被唤醒的其他线程才能被执行。方法,线程会停止运行并释放对象锁,同时线程进入线程 t 对象的等待池,直到被唤醒进入就绪状态。方法,线程会停止运行并释放对象锁 obj,其他线程可以访问其资源。调用 start 方法后,系统会开启一个新线程进入就绪状态:由 JVM 会自动对线程进行调度,在运行时调用并执行线程的 run 方法。方法,会停止运行进入阻塞状态,但仍会保持对象锁,其他线程不可访问其资源。
2024-09-24 09:24:42
842
原创 流 Stream
Stream 是延迟执行的,只有调用到结束操作,才触发整个流水线的执行。流处理是对运动中的数据的处理,在生成或接收数据时直接计算数据。流处理可以立即对事件做出反应,且可以处理比其他数据处理系统大得多的数据量:直接处理事件流,并且只保留数据中有意义的子集。流处理的每个操作阶段都会封装到一个 Sink 接口里,处理数据后再将数据传递给下游的 Sink。JDK 1.8 新增。将要处理的元素集合看作一种流,在管道的节点上进行处理。迭代流中的每个数据,即对每个数据进行最后的处理(比如保存到数据库中或打印)。
2024-09-24 09:19:14
584
原创 并发容器.
JDK 1.7 中, ConcurrentHashMap 类中包含静态内部类 Segment,继承于 ReentrantLock 类用来充当锁的角色,每个 Segment 对象守护若干个保存键值对的链表,共同构成 ConcurrentHashMap 实例中的数组。【阻塞队列】被广泛使用在“生产者-消费者”问题中,其原因是 BlockingQueue 提供了可阻塞的插入和移除的方法。Java 提供的基础容器都是线程不安全的,如果并发条件下多个线程同时对一个容器中的数据进行操作,可能会导致各种意想不到的错误。
2024-09-24 09:18:00
366
原创 基础容器.
LinkedHashMap 类提供了 removeEldestEntry 方法,在使用 put 操作插入 Entry 时将自动调用此方法决定是否移除双向链表表头的 Entry:默认返回 false ,可通过重写此方法以实现 LRU 算法。Entry 也可以按照访问顺序排序:对 Entry 进行操作时会先删除再插入,将 Entry 移动到双向链表的表尾。【集合】用特定的方式组织、存储和操作对象数据。在迭代元素的时候不能通过集合的方法修改或删除元素,但可以通过迭代器的 remove 方法删除元素。
2024-09-24 09:14:16
524
原创 Redis 介绍
Redis 中每个存储区域除了存储 key-value 值,还会开辟额外的存储空间 expires 记录每个 key-value 的存储地址以及过期时间。但层次太多会导致数据延迟,慎用。set 类型中,key 值对应的存储空间内可以保存多个字符串数据,采用哈希存储实现。Redis 将数据存储分为多个相互独立的区域,将 Redis 操作局限在自己的存储区域内。对于 16 个存储区域的 expires 进行轮询,对选中的 expires 随机选择 W 个 key 进行检查,如果 key 过期就进行删除。
2024-09-24 09:10:04
1147
原创 关系型数据库 - MySQL II
需要输入的属性分别为 (h)IP 地址、(P)端口号、(u)用户名、(p)密码。触发程序是与表有关的数据库对象,监听记录的增加、修改、删除。:如果一条 INSERT 语句插入 N 行数据,语句级触发器只执行一次,行级触发器要执行 N 次。MySQL 内划分为多个互相独立的数据存储区域,调用数据库指令时必须提前声明要使用的数据库。开启事务后,所有输入的 SQL 语句将被认作一个不可分割的整体,在提交时统一执行。用户权限分为非常多种,包括全局权限、库权限、表权限、列权限等。,如果已有主键值则插入数据失败。
2024-09-24 09:06:54
1517
原创 Spring Security
类负责全局请求忽略规则配置(比如静态文件、注册页面)、全局 HttpFirewall 配置、是否debug配置、全局SecurityFilterChain配置、privilegeEvaluator、expressionHandler、securityInterceptor。最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在spring security中一种过滤器处理一种认证方式。Spring Security 的配置类,通过继承。
2024-09-18 09:17:56
1000
原创 Spring Session
它把 servlet 容器实现的 httpSession 替换为 spring-session ,Session 信息存储在 Redis 或其它数据库中统一管理,解决了 session 共享的问题。Spring Session 是 Spring 家族中的一个子项目,Spring Session 提供了用于管理用户会话信息的 API 和实现。在 Web 项目开发中,Session 会话管理是一个很重要的部分,用于存储与记录用户的状态或相关的数据。
2024-09-18 09:16:06
525
原创 Spring Controller
refreshApplicationContext方法:通过ServletWebServerFactory接口定义了getwebServer方法,通过其创建webServer并返回(创建时做了两件重要的事情:把Connector对象添加到tomcat中,配置引擎)【TomcatServletWebServerFactory是接口其中一个实现类】在实现上基于 Java 的反射机制。客户端(浏览器)向服务器 A 发送一个 URL 请求,服务器 A 告知浏览器资源在服务器 B,浏览器会重新发送请求到服务器 B。
2024-09-18 09:14:32
1647
原创 Spring AOP
即代理类 A 封装了目标类 B ,外部调用 B 的目标方法时会被代理类 A 拦截,代理类 A 一方面执行切面逻辑,一方面把调用转发给目标类 B ,执行目标方法。在 Java 程序自上而下处理主业务时,也会经常处理一些和主业务逻辑无关的问题(比如在接收用户访问请求时,计算程序响应该请求的运行时间)。在切面方法中需要声明切面方法要切入的目标方法,execution 指示器是我们定义切点时最主要使用的指示器。CGlib 代理针对类实现代理,对指定的类生成一个子类并覆盖其中的方法,因此不能代理 final 类。
2024-09-13 10:56:15
1200
原创 Spring IOC
合并 Bean 定义,对父类的定义进行合并和覆盖,如果父类还有父类,会进行递归合并,以获取完整的 Bean 定义信息。如果是方法调用是不算循环依赖的,循环依赖必须要持有引用。实际开发中,我们如果在对象 A 内部去创建、修改或者注销另一个对象 B,这会导致对象之间非常复杂的依赖关系,不利于代码的维护更新。比如我们直接在上层类内调用了底层类的构造方法,一旦底层类的构造方法发生改变,就必须修改所有上层类的代码。设值注入:依赖的对象通过 setter 方法传入的,对象已经实例化,发生属性填充和依赖注入的时候。
2024-09-13 10:53:06
1403
原创 春天(Spring & Spring Boot)
spring-boot-starter-web-services,针对 SOAP Web Services spring-boot-starter-web,针对 Web 应用与网络接口 spring-boot-starter-jdbc,针对 JDBC spring-boot-starter-data-jpa,基于 Hibernate 的持久层框架 spring-boot-starter-cache,针对缓存支持。Spring MVC 是 Spring 的子功能模块,专用于 Web 开发。
2024-09-12 09:23:49
1717
原创 日用放大器
我们要实现一个增加、删除、修改、查询功能的持久层服务,那么我只需要声明一个接口,这个接口继承 org.springframework.data.repository.Repository<T, ID> 接口或者他的子接口就行。这里为了功能的完备,我们继承了 org.springframework.data.jpa.repository.JpaRepository<T, ID> 接口。(Java 持久性 API)Java 程序和数据库连接的 Java EE 标准,本质上是一种 ORM 规范。
2024-09-12 09:19:28
889
原创 JavaJDBC
安装数据库驱动程序后,开发者可以按照 JDBC 规范直接在 Java 程序上对数据库进行操作,由数据库厂商负责具体实现。PreparedStatement 类继承自 Statement 类,在 JDBC 开发中用来取代前者。JDBC 由 ResultSet 类返回 select 语句执行结果,读取 executeQuery 方法返回的数据。JDBC 由 Connection 类负责连接数据库,参数中输入数据库 URL、账号、密码。JDBC 首先要使用反射机制加载驱动类,并创建其对象。
2024-09-11 09:01:57
622
原创 JavaServlet
Servlet 可以设置初始化参数,供Servlet内部使用。Servlet需要在web.xml中配置(MyEclipse中创建Servlet会自动配置),一个Servlet可以设置多个URL访问。通过 request 对象提供的 getRequestDispatche(String path)方法返回一个 RequestDispatcher 对象,调用这个对象的 forward 方法可以实现请求转发。Servlet 程序运行在服务器端,处理浏览器带来的 HTTP 请求,并返回响应给浏览器,实现用户交互。
2024-09-11 08:56:31
846
原创 JavaNIO
NIO 模型中,在执行读写操作时数据会先存入缓冲区,该线程可以先处理其他连接,一定时间后再对缓冲区读取或写出。BIO 通信通常使用线程池机制实现伪异步:每建立一个连接就创建一个线程,在执行读写操作时该线程将被阻塞,直到数据流读写完成。在服务器和客户端通信的过程中,服务器线程可以先处理其他请求,客户端会主动通知服务器返回了结果。在服务器和客户端通信的过程中,服务器线程会一直等待请求结果返回,无法处理其他请求。在服务器和客户端通信的过程中,服务器线程可以先处理其他请求,定时检查结果是否返回。
2024-09-10 08:54:15
524
原创 I/O (输入输出)
在类中声明实现 Serializable 接口,表示允许 Java 程序对这个类的对象序列化:JVM 会将对象的成员变量保存为一组字节,这些字节可以再被 JVM 组装成对象。BufferedOutputStream 类将输出字节数据暂存到缓冲区数组,BufferedWriter 类将输出字符流数据暂存到缓冲区数组。BufferedInputStream 类将输入字节数据暂存到缓冲区数组,BufferedReader 类将输入字符流数据暂存到缓冲区数组。将字符流数据转换成字节流,常用于发送网络通信。
2024-09-09 10:07:17
895
原创 Java工具并发容器
JDK 1.7 中, ConcurrentHashMap 类中包含静态内部类 Segment,继承于 ReentrantLock 类用来充当锁的角色,每个 Segment 对象守护若干个保存键值对的链表,共同构成 ConcurrentHashMap 实例中的数组。【阻塞队列】被广泛使用在“生产者-消费者”问题中,其原因是 BlockingQueue 提供了可阻塞的插入和移除的方法。Java 提供的基础容器都是线程不安全的,如果并发条件下多个线程同时对一个容器中的数据进行操作,可能会导致各种意想不到的错误。
2024-09-09 09:44:41
1148
原创 Java基础容器
LinkedHashMap 类提供了 removeEldestEntry 方法,在使用 put 操作插入 Entry 时将自动调用此方法决定是否移除双向链表表头的 Entry:默认返回 false ,可通过重写此方法以实现 LRU 算法。提供 iterator 方法,用来创建一个实现了 Iterator 接口的 iterator 对象:按容器类规定的顺序实现遍历集合。【数组双端队列】实现了 Deque 接口。在迭代元素的时候不能通过集合的方法修改或删除元素,但可以通过迭代器的 remove 方法删除元素。
2024-09-06 08:48:20
1646
原创 Java流 Stream
流处理是对运动中的数据的处理,在生成或接收数据时直接计算数据。流处理可以立即对事件做出反应,且可以处理比其他数据处理系统大得多的数据量:直接处理事件流,并且只保留数据中有意义的子集。Stream 的遍历方式和结果与 Iterator 无差别(便于转化),其优势在于其原型链的设计使得它可以对遍历处理后的数据进行再处理。流处理的每个操作阶段都会封装到一个 Sink 接口里,处理数据后再将数据传递给下游的 Sink。迭代流中的每个数据,即对每个数据进行最后的处理(比如保存到数据库中或打印)。
2024-09-05 16:42:07
1134
1
原创 Java正则匹配
95|98|NT|2000)' 匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。95|98|NT|2000)' 匹配"Windows 3.1"中的 "Windows",但不匹配"Windows 2000"中的"Windows"。正则表达式的编译表示。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。
2024-09-05 16:38:07
967
原创 Java异常
try/catch 代码中的 return 语句会在执行完 finally 后再返回,但 finally 中对返回变量的改变不会影响最终的返回结果。Java 程序中的异常是一个在程序执行期间发生的事件,它中断正在执行程序的正常指令流。finally 代码中应避免含有 return 语句或抛出异常,否则只会执行 finally 中的 return 语句,且不会向上级抛出异常。表示 java 程序编译时检测到的异常。:【异常】表示 java 程序中产生的可以被处理的故障,异常出现时可以由程序进行处理。
2024-09-04 08:58:42
1328
原创 数值比较和排序的常用方法
执行 sort 方法时如果没有重写 compare 方法,默认调用的 compare 方法将会直接调用数据类型的 compareTo 方法,使数据从小到大排列。Arrays/Collections 类定义了 sort 方法对数组或者集合元素进行排列,数值的比较通过调用 Comparator 接口的 compare 方法实现。Comparator 接口的 equals 方法和 Object 类的 equals 方法不同, Object 类的 equals 方法实现在实体类的内部。
2024-09-04 08:49:09
677
原创 Java数据类型
自定义枚举类实际是继承 Enum 类的 final 类,在类中将自定义该类型的 public static final 属性,并引入了相关方法。对字符串数据进行改变,实际是创建新的 String 对象,并改变引用指向新的对象。实际开发中,枚举类通常的形式是有两个参数(int code,Sring msg)的构造器,可以作为状态码进行返回。使代码更具可读性,允许进行编译时检查,预先记录可接受值的列表,并避免由于传入无效值而引起的意外行为。Java 语言提供了八种基本类型,用户无需定义也可以直接使用。
2024-09-02 09:14:13
1451
原创 Java类和接口
/ 变量// static 变量// 构造方法// 方法// static 方法// 初始化块// static 初始化块static{// 内部类变量对象中存储的数据。方法调用时执行的代码。初始化块创建对象前自动执行的代码。内部类定义在类中的类。构造方法在创建对象时自动执行,不返回任何参数(先执行初始化块,再执行构造方法)。未定义任何构造方法时,系统会自动添加无参构造方法。终态声明final 常量: 只能赋值一次,不可更改。final 类: 不可被继承。
2024-09-02 08:50:58
1190
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人