- 博客(182)
- 收藏
- 关注
原创 什么是SpringBoot自动装配?(含图文详解)
SpringBoot 的自动配置是 SpringBoot 框架的核心特性之一。可以自动配置和加载 SpringBoot 所需的各种组件和功能,从而大大的减少开发人员手动配置的工作。在传统的 Spring 应用程序中,我们需要手动配置各种组件,如数据源、Web 容器、事务管理器等。这些配置需要编写大量的 XML 配置文件或 Java 配置类,增加了开发的工作量和复杂性。而 SpringBoot 的自动装配通过约定优于配置的理念,根据项目的依赖和配置信息,自动进行配置,使得开发人员无需进行大量的手动配置。用 R
2025-03-02 09:47:29
951
原创 秒杀系统的常用架构是什么?怎么设计?
假设消费者拿到一条消息,先判断消息的发送时间,如果这条消息的发送时间和当前时间已经超过了一个阈值(1 分钟),那么就认为出现了消息积压,则将这些消息直接放入 Redis。不同的 MQ 解决方案不同,一个简单通用的方案是:加一张消息发送表,先在消息发送表中记录“待处理”然后再给 MQ 发消息,消费者(下单服务)收到消息生成完订单后,回调发送者(抢购服务)将记录改为“已处理”。设置一个定时任务,隔一段时间去扫描消息发送表,如果发现有消息一直没有被处理,消息很有可能丢失了,那就重发该消息。
2025-02-27 10:08:40
1816
原创 初识微服务架构
将所有业务集中在一个项目中开发,打成一个包部署。优点:1. 架构简单 2. 部署成本低缺点:耦合度高根据业务功能对系统进行拆分,每个业务模块作为一个独立的项目开发,称为一个服务。优点:1. 耦合度底 2. 有利于服务升级拓展。
2024-10-25 11:45:57
201
原创 并查集 --- Java通用模版
并查集常用于处理大规模数据下的元素分组问题,特别是在数据量极大时,使用正常的数据结构可能会导致空间或时间复杂度过高。并查集通过其高效的数据处理能力,能够在有限的时间内完成元素的合并和查询操作,特别适用于竞赛编程和实际工程应用中。leetcode题目: 冗余连接 冗余连接 II 省份数量 最长连续序列 统计无向图中无法互相达到的点数并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题。
2024-10-21 21:36:38
400
1
原创 HTTP快速入门
HTTP 协议主要由三大部分组成:● 起始行(start line):描述请求或响应的基本信息;● 头部字段(header):使用 key-value 形式更详细地说明报文;● 消息正文(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。其中起始行和头部字段并成为 请求头 或者 响应头,统称为 Header;消息正文也叫做实体,称为 body。例如:http://www.someSchool.edu/someDepartment/home.index。
2024-10-21 21:20:17
1263
1
原创 nginx 快速入门
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路,实际上,何谓动?简单来说就是使用分布式的场景,将原先的一台服务器做成一个集群,然后将请求分发到各个服务器上,但是,如何将请求每次转发到不同的服务器呢,Nginx就可以做到。原来我们都是直接访问服务器,现在我们可以使用Nginx 进行反向代理,然后我们访问Nginx,由Nginx将我们的请求分发到不同的服务器上,以实现负载均衡。
2024-10-21 21:13:48
1213
原创 常用数据结构与算法总结(含例题和完整代码)
一、位运算● ^ 可理解为不进位相加● a^a=0● a^0=a题目一一组数中,只有一个数出现的次数是奇数,其他数字出现的次数都为偶数,找出这个出现次数为奇数的数。public static void printOddTimesNum1(int[] arr) { int eor = 0; for (int i : arr) { eor ^= i; } System.out.println(eor);}题目二一组数中,只有两个数出现的次数是奇
2022-04-23 10:28:36
6660
4
原创 常见的设计模式详解
设计模式的类型模式可以分为三大类:创建型模式、结构型模式、行为型模式。GoF的23种设计模式:设计模式的七大原则1、开闭原则(Open Close Principle)开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。2、里氏代换原则(Liskov Substitution Principle)里氏代换
2022-03-06 13:43:01
1055
1
原创 Java内存模型(JMM)、volatile以及CAS详解
接上篇 juc–并发编程的核心问题总结②一、异步回调1. 什么是异步回调我们平时最常见的是同步回调,同步回调是会阻塞的,单个的线程需要等待结果的返回才能继续执行。假设有两个任务A和B,A任务中需要使用B任务计算成果,有两种方法实现:A和B在同一个线程中顺序执行。即先执行B,得到返回结果之后再执行A。A和B并行执行。当A需要B的计算结果时如果B还没有执行完,A可以先做其他的工作,避免阻塞,过一段时间后再询问一次B。我们可以直接在A中写一个方法对B处理完的结果进行处理,然后B处理完之
2021-11-18 14:39:07
822
1
原创 Fork/Join的使用与原理解析
一、什么是ForkJoinJava 7开始引入了一种新的Fork/Join线程池,它可以把一个大任务拆成多个小任务并行执行,然后汇总每个小任务的执行结果得到这个大任务的最终结果。Fork/Join任务的原理:判断一个任务是否足够小,如果足够小则直接计算,否则,就分拆成几个小任务分别计算。fork():在当前线程运行的线程池中创建一个子任务;join():模块子任务完成的时候返回任务结果;二、工作窃取大任务被分割为独立的子任务,并且子任务分别放到不同的队列里,并为每个队列创建一个线程来执行队列里
2021-11-18 08:52:08
721
原创 juc之lock锁、八锁问题、以及常用辅助类
文章中表明星号的地方说明是需要重点掌握的一、juc基础知识1. 什么是jucjava.util.concurrent (juc是包名的简写)在并发编程中使用的工具类,是关于并发编程的API。2. 线程和进程线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位。一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线。线程上下文切换比进程上下文切换要快得多。进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源,某进程.
2021-11-15 12:48:20
1180
2
原创 深入理解java中volatile的特性
一、 对volatile的理解1. volatile是java虚拟机提供的轻量级的同步机制。保证可见性不保证原子性禁止指令重排保证可见性什么是可见性?JMM(java内存模型)JMM是一个抽象的概念本身不存在,它描述的是一组规范,通过这组规范定义了程序中各个变量的访问方式。可见性原子性有序性由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),工作内存是每个线程的私有数据区域,而Java内存模型中规定所有变量都存储在主内存,
2021-09-15 11:17:48
352
1
原创 java集合源码分析②----LinkedList添加元素的过程
LinkedList底层是一个双向链表由下图源码看看出LinkedList实现了Deque接口,所以LinkedList还可以作为队列和栈来使用。静态内部类Node,表示双向链表的结点:LinkedList添加元素的过程(add过程)final Node l = last; //当前节点的最后一个节点final Node newNode = new Node<>(l, e, null); 定义新节点示例: LinkedList<String> list =
2021-08-12 11:41:27
502
原创 java集合源码分析①----ArrayList
ArrayList集合ArrayList底层就是一个长度可以动态调整的Object数组有一个记录数组长度的size字段数组是默认长度是10,还准备有一个空的数组。ArrayList有一个父类,并实现了List等多个接口(RandomAccess, Cloneable, java.io.Serializable接口中一个方法也没有)无参创建:ArrayList list = new ArrayList();JDK1.7中,使用无参数构造方法创建ArrayList对象时,默认底层数组长度
2021-08-08 13:57:55
179
原创 JUC---线程间定制化通信
此博客案例来自尚硅谷JUC视频一、线程间的通信实现两个线程(AA、BB),使得AA线程+1,BB线程-1package com.jess.sync;/** * @program: JUC * @description: 线程间的通信 * @author: Jess * @create: 2021-07-23 13:48 **///第一步 创建资源类,定义属性和操作方法class Share { //初始值 private int number = 0; //.
2021-07-23 14:33:16
264
原创 redis数据结构与对象--常见问题
文章目录1. redis中5种数据类型的编码方式是什么?2. 为什么redis不共享包含字符串的对象?3. 为什么有序集合需要同时使用跳跃表和字典来实现?4. 有序集合同时使用跳跃表和字典会浪费内存吗?5. redis是怎样实现内存回收的?1. redis中5种数据类型的编码方式是什么?①STRING(字符串对象):int、raw、embstrint 编码:值可以用 long 类型保存的整数raw 编码:值可以用 long double 类型保存的浮点数embstr 编码:(只读,修改时需转化为
2021-04-26 12:16:09
206
原创 MySQL解决并发事务带来的问题--锁--锁的内存结构
上篇:MySQL解决并发事务带来的问题–锁InnoDB锁的内存结构对一条记录加锁的本质就是在内存中创建一个锁结构与之关联,那么是不是一个事务对多条记录加锁,就要创建多个锁结构呢?如果一个事务要获取10000条记录的锁,就要生成10000个这样的结构,开销就太大了。InnoDB在对不同记录加锁时,如果符合下边这些条件,那么这些记录的锁就可以被放到一个锁结构中:在同一个事务中进行加锁操作被加锁的记录在同一个页面中加锁的类型是一样的等待状态是一样的锁所在的事务信息:哪个事务生
2021-04-19 20:28:09
353
1
原创 MySQL解决并发事务带来的问题--锁
事务相关:MySQL事务的隔离级别与MVCC详解一、锁事务并发执行时可能带来的各种问题,并发事务访问相同记录的情况大致可以划分为3种:读-读情况:即并发事务相继读取相同的记录。写-写情况:即并发事务相继对相同的记录做出改动。读-写或 写-读情况:也就是一个事务进行读取操作,另一个进行改动操作。1. 脏写问题在写-写情况下会发生脏写问题,而任何一种隔离级别都不允许这种问题的发生。所以在多个未提交事务相继对一条记录做改动时,需要让它们排队执行,这个排队的过程其实是通过锁来实现的。这个所谓的锁其
2021-04-19 20:09:53
556
1
原创 MySQL事务的隔离级别与MVCC详解
一、事务的隔离级别先创建一个表:#主键命名为number,而不是id,是想和后边要用到的事务id做区别CREATE TABLE hero (number INT,name VARCHAR(100),country varchar(100),PRIMARY KEY (number)) Engine=InnoDB CHARSET=utf8;INSERT INTO hero VALUES(1, '刘备', '蜀');对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上
2021-04-19 17:21:52
395
原创 MySQL调节磁盘和CPU的矛盾--InnoDB的缓存
一、缓存的重要性对于使用InnoDB作为存储引擎的表来说,不管是用于存储用户数据的索引(包括聚簇索引和二级索引),还是各种系统数据,都是以页的形式存放在表空间中的,而所谓的表空间只不过是InnoDB对文件系统上一个或几个实际文件的抽象,也就是说我们的数据说到底还是存储在磁盘上的。InnoDB存储引擎在处理客户端的请求时,当需要访问某个页的数据时,就会把完整的页的数据全部加载到内存中,也就是说即使我们只需要访问一个页的一条记录,那也需要先把整个页的数据加载到内存中。将整个页加载到内存中后就可以进行读写访问
2021-04-18 15:27:13
436
1
原创 Mysql快速查询的秘籍--B+树索引的使用
上篇 Mysql快速查询的秘籍–B+树索引的理解一、索引的代价空间上的代价每建立一个索引都要为它建立一棵 B+ 树,每一棵 B+ 树的每一个节点都是一个数据页,一个页默认会占用 16KB 的存储空间,一棵很大的 B+ 树由许多数据页组成。时间上的代价每次对表中的数据进行增、删、改操作时,都需要去修改各个 B+ 树索引。增、删、改操作可能会对节点和记录的排序造成破坏,所以存储引擎需要额外的时间进行一些记录移位,页面分裂、页面回收等操作来维护好节点和记录的排序。一个表上索引建的越多,就会占用越
2021-04-10 11:58:46
434
1
原创 Mysql快速查询的秘籍--B+树索引的理解
一、没有索引时的查找SELECT [列名列表] FROM 表名 WHERE 列名 = xxx;1. 在一个页中查找假设目前表中的记录比较少,所有的记录都可以被存放到一个页中。可以根据搜索条件的不同分为两种情况:以主键为搜索条件以其他列作为搜索条件2. 在很多页中查找大部分情况下我们表中存放的记录都是非常多的,需要好多的数据页来存储这些记录。在很多页中查找记录的话可以分为两个步骤:定位到记录所在的页。从所在的页内中查找相应的记录。在没有索引的情况下,不论是根据主键列或者其他列的值
2021-04-10 10:09:55
549
原创 Mysql存储引擎---InnoDB数据页结构
一、数据页结构数据页代表的这块 16KB 大小的存储空间可以被划分为多个部分,不同部分有不同的功能,各个部分如图所示:一个 InnoDB 数据页的存储空间大致被划分成了 7 个部分,有的部分占用的字节数是确定的,有的部分占用的字节数是不确定的。记录的存储在页的7个组成部分中,我们自己存储的记录会按照我们指定的行格式存储到 User Records 部分。但是在一开始生成页的时候,其实并没有 User Records 这个部分,每当我们插入一条记录,都会从 Free Space 部分,也就是尚未使
2021-04-09 12:17:07
221
原创 一次性理清动态规划---例题图解
一、什么是动态规划?给定一个矩形网络,一个机器人从左上角出发,每次可以向下或向右走一步题目A:求有多少种方式走到右下角(√ 可用动态规划求解)题目B:输出所有走到右下角的路径(× 递归)动态规划题目特点1.计数有多少种方式走到右下角在 n 个数中,有多少种方法选出 k 个数使得和为 sum2.求最值从左上角走到右下角路径的最大数字和给定一个序列,求最长上升子序列长度3.存在性取石子游戏,先手是否必胜能不能选出 k 个数使得和为 sum二、常规解题步骤1. 确定状态
2021-04-03 15:18:23
674
转载 深入理解MySQL索引之B+Tree
正确的创建合适的索引,是提升数据库查询性能的基础。在正式讲解之前,对后面举例中使用的表结构先简单看一下: create table user( id bigint not null comment 'id' primary key, name varchar(200) null comment 'name', age bigint null comment 'age', gender i...
2021-04-01 15:00:22
188
原创 Mysql存储引擎---InnoDB的行格式及行溢出问题
一、局部性原理在InnoDB中,数据会存储到磁盘上,在真正处理数据时需要先将数据加载到内存。表中读取某些记录时,InnoDB存储引擎不需要一条一条的把记录从磁盘上读出来,InnoDB采取的方式是:将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16 KB,也就是说,当需要从磁盘中读数据时每一次最少将从磁盘中读取16KB的内容到内存中,每一次最少也会把内存中的16KB内容写到磁盘中。二、InnoDB行格式一行记录可以以不同的格式存在InnoDB中,行格式分别是
2021-03-31 20:37:15
710
原创 MySQL逻辑架构
MySQL逻辑架构大致分为三层最上层并不是MySQL独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构。比如连接处理、授权认证、安全等等。第二层架构,大多数MySQL的核心服务功能都在这一层,包括查询解析、分析、优化、缓存以及所有的内置函数。所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。第三层包含了存储引擎,存储引擎负责MySQL中数据的存储和提取。每个存储引擎都有它的优势和劣势。服务器通过API与存储引擎进行通信。这些接口屏蔽了不同的存储引擎之间的差异,使得这些差.
2021-03-31 19:19:35
142
原创 dubbo整合springboot
一、导入相关依赖在项目中(提供者、消费者)导入通用接口:<dependency> <groupId>com.jess.gmall</groupId> <artifactId>gmall-interface</artifactId> <version>0.0.1-SNAPSHOT</version></dependency>dubbo依赖<dependency> <gro
2021-03-13 12:10:55
787
原创 dubbo环境搭建及基础实践
一、分布式基础理论1.1 什么是分布式系统?分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统。分布式系统(distributed system)是建立在网络之上的软件系统。1.2 发展演变单一应用架构:当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。垂直应用架构:当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。分布式服务架构:当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作
2021-03-11 18:42:55
343
1
原创 多线程的安全问题
1、共享带来的问题多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测。临界区一个程序运行多个线程本身是没有问题的问题出在多个线程访问共享资源。在多个线程对共享资源读写操作时发生指令交错,就会出现问题。一段代码块内如果存在对共享资源的多线程读写操作,称这段代码块为临界区。static int counter = 0;static void increment()// 临界区{ counter++;}static void decrement()// 临界区{ coun
2021-03-04 16:39:58
497
原创 多线程常见方法及使用
常用方法sleep 与 yieldsleep调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException异常@Slf4j(topic = "c.TestInterrupt")public class TestInterrupt { public static void main(String[] args) thro
2021-03-02 14:58:45
647
原创 Java多线程基础问题
1. 为什么要使用多线程?(1)更多的处理器核心一个单线程程序在运行时只能使用一个处理器核心,那么再多的处理器核心加入也无法显著该程序的执行效率。相反,如果该程序使用多线程技术,将计算逻辑分配到多个处理器核心上,就会显著减少程序的处理时间,并且随着更多处理器核心的加入而变得更有效率。(2)更快的响应时间可以使用多线程技术,将数据一致性不强的操作派发给其他线程处理(也可以使用消息队列)。这样做的好处是响应用户请求的线程能够尽可能快地处理完成,缩短响应时间,提升用户体验。(3)更好的编程模型Java
2021-03-02 11:20:54
182
原创 Java 深入理解及常见易错点整理
1. 什么是java字节码?它是程序的一种低级表示,可以运行在java的虚拟机上。将程序抽象成字节码可以保证java程序员的代码能够运行在各种设备上。2. Math.abs(-2147483648)的返回值是什么?返回值是-2147483648。这是个奇怪的结果,但是是真的,这是一个整数溢出的典型例子。3. 将double变量初始化为无穷大可以使用java的内置常数Double.POSITIVE_INFINITY//或者Double.NEGATIVE_INFINITY4. 变量使用前未进行
2020-11-09 20:41:55
961
原创 DockerFile的构建和使用
一、DockerFile介绍Dockerfile就是用来构建docker镜像的构建文件,是一段命令参数脚本。构建步骤:编写一个dockerfile文件docker build 构建成为一个镜像docker run 运行镜像docker push 发布镜像(DockerHub 、阿里云仓库)很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像。二、DockerFile构建过程基础知识:每个保留关键字(指令)都是必须是大写字母。指令执行从上到下顺序。# 表示注释。每
2020-11-03 09:00:53
569
原创 Docker容器数据卷及使用详解
一、什么是容器数据卷docker理念:将应用和环境打包成一个镜像。那数据保存在哪里呢?如果数据都在容器中,那么我们容器删除,数据就会丢失。(比如在docker中安装了MySQL,如果容器删除了,数据就没了)需求:数据可以持久化且MySQL数据可以存储在本地。容器之间可以有一个数据共享的技术,将Docker容器中产生的数据,同步到本地,这就是卷技术。(其实就是目录的挂载,将我们容器内的目录,挂载到Linux上面)总结:实现容器的持久化和同步操作,且容器间也是可以数据共享的。(多个容器绑定同一个目
2020-11-01 16:33:26
1093
原创 Docker镜像详解(分层理解)
镜像是什么?镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,他包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。将所有的应用和环境直接打包为docker镜像,就可以直接运行。如何得到镜像?从远程仓库下载通过拷贝获取自己制作一个镜像DockerFile一、Docker镜像加载原理UnionFs (联合文件系统)我们下载的时候看到分层的下载就是联合文件系统UnionFs:是一种分层、轻量级并且高性能的文件系统,他支持对文件系统
2020-10-30 16:34:40
5774
7
原创 Docker中安装Nginx详细步骤
命令 docker search nginx命令docker pull nginx下载(默认最新版)docker images查看是否下载成功运行测试-d 后台运行–name 给容器命名-p 宿主机端口:容器内部端口 (Nginx默认端口80)查看容器docker ps测试curl localhost:6666...
2020-10-28 20:37:22
378
1
原创 Docker的常用指令
一. 帮助命令docker version #显示docker的版本信息。docker info #显示docker的系统信息,包括镜像和容器的数量docker 命令 --help #帮助命令帮助文档的地址:https://docs.docker.com/engine/reference/commandline/build/二. 镜像命令docker images #查看所有本地主机上的镜像 可以使用docker image ls代替docker search 搜索镜像docke
2020-10-28 20:10:17
222
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人