- 博客(53)
- 收藏
- 关注
原创 maven笔记
IDEA会自带maven,不需要额外下载安装。仓库类型常用命令中文含义说明mvn clean清理这个命令可以用来清理已经编译好的文件mvn compile编译将 Java 代码编译成 Class 文件mvn test测试项目测试mvn package打包根据用户的配置,将项目打成 jar 包或者 war 包mvn install安装手动向本地仓库安装一个 jarmvn deploy上传将 jar 上传到私服常用命令
2021-12-24 10:35:35
424
原创 Hibernate-validation参数校验详解
@Validated是@Valid的扩展:@Valid是javax的,@Validated是Hibernate-validation基于javax扩展的。引入依赖包<!-- 参数校验:在 SpringBoot 2.4 以前,web-starter默认引入 spring-boot-starter-validation 包,而自 SpringBoot 2.4.0 以后官方将其排除,需要单独引入spring-boot-starter-validation包。注意是starter包,否则需要手动配置,
2021-12-06 20:32:42
717
原创 加速访问github
亲测有效的方法1、使用代理加速通过以下3个网址均可进入github首页。raw.githubusercontent.com , gist.github.com , gist.githubusercontent.comclone时使用以下地址:https://ghproxy.com/{实际github的域名}如:https://ghproxy.com/https://github.com/mountainest/notes.git2、将github迁到码云,然后往github同步代码。参考:让
2021-12-02 22:42:33
1490
1
原创 并发编程java实现原理
volatile保证了有序性和可见性,不保证原子性。三重功效:64位写的原子性、内存可见性、禁止重排序(通过内存屏障禁止)。重排序分类:编译器重排序、指令重排序、内存重排序(指令的执行顺序和写入主内存的顺序不完全一致)CAS在Unsafe包中,通过native类型方法实现原子操作。synchronizedjava对象头里面会保存锁标志位以及当前持有锁的线程ID,包括无锁、偏向锁、轻量级锁、重量级锁等类型。monitorEnter、monitorExit另,wait()、notify(
2021-05-07 01:29:24
327
1
原创 秒杀系统设计思路
负载均衡LVS只做请求分发,不承接流量,所以QPS远超nginx。但是,功能赶不上nginx,比如转发出去的请求,如果后端服务器突然挂掉,nginx能够再次转发到其他服务器,而LVS做不到。参考:https://www.cnblogs.com/arjenlee/p/9262737.html隔离熔断限流降级本地+远程预扣库存本地预扣库存解决高并发问题,库存均分到多个本地服务,每个服务最多卖这么多。远程扣库存防止少卖,某个本地服务挂掉之后,会导致少卖,可以增加本地buff进行修正。批量扣
2021-05-01 15:27:25
275
1
原创 Redis高可用方案的实现原理
Redis哨兵模式哨兵也是一种特殊的redis,哨兵节点采用raft一致性算法,所以要求哨兵节点至少3个并且奇数。1、每个哨兵每秒对各个Redis数据节点做心跳检测。2、如果发现某个节点超时未响应,则对该节点进行主观下线。如果主管下线的节点是master节点,还要咨询其他的哨兵节点,如果过半节点都认为该节点下线,则对该节点做客观下线。3、同时这也是一个选主的过程,一般第一个发现主观下线的节点,会被选为leader哨兵节点。4、由leader哨兵节点对redis数据节点进行故障转移。1)lead
2021-04-28 23:29:02
229
原创 分布式事务一致性方案
强一致性2PC解决不同数据库的事务一致性问题,XA协议。由协调者和参与者两个角色完成。第一阶段:先执行DML语句,但是不提交。第二阶段:根据第一阶段的返回结果,决定是commit还是rollback。缺点:1、性能问题,锁定资源后要等待所有节点返回,不适合高并发场景。2、二阶段时,如果协调者挂掉,存在悬而不决的问题;如果参与者挂掉,不知道是否要回滚。3、存在脑裂问题。3PC2PC的第一阶段拆分为两步,第一阶段只是询问,第二阶段才锁定资源。并且参与者增加了超时判断的功能。TCC解决不同服务之
2021-04-27 23:32:46
352
1
原创 慢SQL优化思路
原则1、是否向数据库请求了不需要的数据。2、MySQL server是否在分析大量超过需要的数据。具体思路是否加锁了?加锁是否合理?是否使用了索引?索引覆盖、索引合并、索引下推、MRR如果是复杂查询是否可以考虑拆分为多条语句?可以提高缓存利用率,减少了关联查询(MySQL只是嵌套循环关联,非哈希关联,效率低)当limit的偏置比较大时,可以使用延迟关联异步读,冗余读重写轻读数据库是否有多从缓存分区分表是否是网速限制限流降级...
2021-04-27 23:00:21
220
原创 linux的IO多路复用技术epoll详解
IO知识缓冲IO:3次拷贝直接IO:2次拷贝内存映射:只剩下一次内存到磁盘文件的拷贝了。零拷贝技术:是指socket通信,在内存中零拷贝,但是仍然有磁盘到内存、内存到网络IO的拷贝。网络IO模型同步异步是针对读写操作由谁来完成,阻塞非阻塞是从函数调用者的角度来说是否需要等待。同步阻塞IO、同步非阻塞IO、IO多路复用(select、poll、epoll)、异步IO高效的三大要素mmap:内存映射,没有内存拷贝,消除了内核态和用户态之间的频繁切换。红黑树:链表:工作流程epol
2021-04-26 21:02:34
707
原创 线程池实现原理,看完此文,不信你还不明白
总体设计线程池运行状态参考:https://zhuanlan.zhihu.com/p/123328822https://www.jianshu.com/p/f030aa5d7a28
2021-04-26 20:31:05
282
原创 linux进程间通信与线程间通信
线程间通信隔离区:仅用于本进程内部的线程间通信,用户态、轻量级、资源开销少。enter、leave互斥量(mutex):命名,内核态,可以实现跨进程的线程间通信。信号量(Semaphore):命名,可以实现跨进程的线程间通信。允许多个线程在同一时刻访问同一份资源,但是线程数有限制。应用:限流、连接池事件:可以实现跨进程的线程间通信,通知进程间通信信号:如SIGINT(ctrl+c)、SIGHUP(session关闭,仍然在后台运行)、SIGTERM(kill命令,用于进程终止前的处理)等。参考
2021-04-26 20:12:45
197
原创 一文学习redis底层数据结构
string int: 数值作为redisObject的指针地址。 raw: redisObject + sdshdr,指针指向sdshdr,redisObject里面保存指针。 embstr: redisObject + sdshdr一起申请一块连续的内存,适合于短字符串。 hash ziplist:采用一块连续内存模拟的双向链表,为了均衡内存使用率和性能,不需要每次申请内存,也省去了next指针的空间的内存开销,pre指针的开销并没有省掉。一般要求节点数小于10...
2021-04-25 20:38:05
144
原创 一文读懂MySQL事务与mvcc、锁的关系
什么是mvcc?目的:提高事务的并发性能。原则:写加锁,读不加锁,读写不冲突,只有写写才冲突。具体措施:保存数据库每个修改的版本,增加两个字段创建时间和删除时间,分别存储创建和删除的事务ID,作为版本号。事务处理的常见问题?脏读:读取未提交的数据,该数据可能会回退。不可重复读:两次读取的数据不一致,针对的update。幻读:读取同一范围的数据,读取的行记录不一样,有新增行或者删除行。更新丢失:其他事务的更新,被覆盖了。事务的acid是怎么保证的?通过mvcc和锁一起共同保证的。
2021-04-21 00:21:17
1423
1
原创 redis常见问题汇总
redis vs memcachedredis支持持久化。 RDB(Redis DataBase,是将redis某一时刻的数据持久化到磁盘中,是一种快照式的持久化方法) AOF(Append Only File,AOF方式是将执行过的写指令记录下来,在数据恢复时按照从前到后的顺序再将指令都执行一遍)redis的数据结构更丰富。redis是目前最快的。参考:https://blog.youkuaiyun.com/liqingtx/article/details/60330555...
2021-04-07 15:43:33
2302
原创 golang知识点汇总
线程 vs 协程一个线程多个协程,比线程粒度更小,有点类似于子程序,协程间的切换比线程切换开销小得多,因为不涉及到CPU调度分派。不需要锁机制,通过共享内存的方式实现协程间的数据传递,开销很小。协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。可以通过进程+协程的方式充分利用多核的能力。参考:https://blog.youkuaiyun.com
2021-04-02 11:20:27
290
原创 springboot常见问题总结
为什么使用springboot?简化配置,约定大于配置。独立运行,不需要达成war包了。应用监控。配置文件有bootstrap和application。 boostrap 由父 ApplicationContext 加载,比 applicaton 优先加载。 boostrap 里面的属性不能被覆盖。AOP面向切面编程。IOC控制反转/依赖注入,松耦合。@SpringbootApplication包括@SpringBootConfiguration、@EnableAutoCo...
2021-04-01 10:43:35
947
原创 MySQL知识点总结
数据库表设计三范式:1、字段原子性,字段不可再分割。2、消除对主键的部分依赖,某个字段依赖复合主键中的一部分。3、消除对主键的传递依赖,不能通过其他字段间接依赖于主键。比如任课老师取决于是什么课,而是什么课又取决于主键id,可以拆分为日程表和任课老师表。索引(B+树)全文索引:模糊查询时使用。普通索引:对关键字没有限制。唯一索引:要求记录提供的关键字不能重复。主键索引:要求关键字唯一且不为null。可以作为外键,唯一索引不可以。一张表只能有一个主键索引,而唯一索引未必。索引使用场
2021-03-23 16:44:44
360
原创 MySQL事务
事务四大特征(ACID):原子性(A):事务是最小单位,不可再分。一致性(C):事务要求所有的DML语句(data manipulation language,包括INSERT、UPDATE、DELETE)操作的时候,必须保证同时成功或者同时失败。隔离性(I):事务A和事务B之间具有隔离性持久性(D):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)隔离性有4个隔离级别,从上往下隔离强度逐渐增强:读未提交:read uncommitted。事物A未提交的数据,事物B可以读取到,这里读
2021-03-19 14:46:36
257
原创 java多线程介绍
线程的三种创建方式1、实现lambda接口Runnable r = ()->{};Thread t = new Thread(r, "线程1");t.start();2、重写thead类Thread t = new ThreadDemo();t.start();3、带返回值Callable<Integer> c = ()->{return 1;};Futuretask<Integer> ft = new Futuretask<>(c);
2021-03-17 08:26:43
268
原创 高并发高可用知识点汇总
线程的三种创建方式1、实现lambda接口Runnable r = ()->{};Thread t = new Thread(r, "线程1");t.start();2、重写thead类Thread t = new ThreadDemo();t.start();3、带返回值Callable<Integer> c = ()->{return 1;};Futuretask<Integer> ft = new Futuretask<>(c);
2021-03-16 22:51:30
518
原创 JVM知识点汇总
JVM < JRE < JDKJVM包括:方法区、堆区虚拟机栈、本地方法栈、程序计数器(PC)执行引擎、GC本地库接口、本地方法库程序计算器是唯一不会出现内存不够的。虚拟机栈存放的方法入口地址、操作数栈、局部变量表、动态链接、出口地址方法区:存储常量、静态变量(非静态类)、方法堆区:分配的类实例。类加载的过程1、加载如果方法区未找到该类,从.class文件里面去加载。2.1、验证对文件格式、需要的虚拟机版本号等进行校验。2.2、预处理为类变量(static变
2021-03-16 22:30:19
265
原创 TCP/IP协议栈
四层模型应用层传输层(TCP、UDP)网络层(IP、ARP)链路层TCP三次握手双方都需要知道双方的接收发送正常。TCP四次挥手由于TCP是双工协议,需要双向都关闭,而开启的时候,客户端的响应报文和服务端的请求报文共用了,所以只有3条。TIME_WAITE:客户端,响应服务端发起的关闭请求之后,等待MLS时长之后,如果还没有收到服务端的重传,说明关闭成功。CLOSE_WAITE:服务端,响应客户端发起的关闭之后,等待应用层发起关闭。TCP流量控制:针对接收端,在接收缓存如果满了
2021-03-16 21:40:04
323
原创 互联网问题汇总
通用基础:linuxTCP/IP协议栈数据结构与算法设计模式编程语言:java,了解JVM、常用开源框架,锁。go,了解协程、channel。中间件:消息队列:kafka、rocketMQ数据库:MySQL、Redis、ElasticSearch部署:nginx、tomcat进阶:高可用、高并发...
2021-03-16 21:01:41
147
原创 Kafka vs 传统消息中间件
差异点 传统消息中间件 Kafka 分布式的架构设计理念 所有的client同时与集群中的其中一个broker建立连接,只有该broker挂掉之后,才会将所有的client全部迁移到其他的broker。 不同的topic被“打散”分布在不同的broker上,client向集群中不同的broker发起连接,这样就降低了单个broker的负载,提高了系统的整体并发度...
2019-11-02 21:58:23
251
原创 彻底弄清分布式锁、分布式队列
<div class="htmledit_views" id="content_views"> <h1><a name="t0"></a>本文概要</h1><p><img alt="" class="has" src="http...
2019-09-15 22:30:26
260
原创 正则表达式
元字符 描述 . 句号匹配任意单个字符除了换行符. [ ] 字符种类. 匹配方括号内的任意字符. [^ ] 否定的字符种类. 匹配除了方括号里的任意字符 * 匹配>=0个重复的在*号之前的字符. + 匹配>=1个重复的+号前的字符. ? 标记?之前的字符为可选. {n,m} 匹配num个大括号之前的字符 (n ...
2019-09-15 20:42:58
210
原创 kafka解读(全貌概况)
一、生产者角度说明:1、每个topic可以创建多个分区,分区可以在启动kafka server时,通过config/servder.properties配置分区数(默认1),也可以在topic启动时配置分区数。2、同属一个topic的多条消息会根据均衡算法平均放到多个分区。3、生产者发送消息时,也可以指定发送到某个分区。二、kafka服务端说明:1、partitionX...
2019-07-14 09:49:46
208
原创 Spring Boot零基础到上线运行(十分钟新手入门实操篇)
一、前言SpringBoot目的是简化工程的操作配置过程,给开发人员留更多的精力提供业务功能。可以方便快速的搭建工程,非常适合构建微服务。二、软件安装1)下载JDK包,并配置系统环境变量。JAVA_HOME=%安装路径%Path=%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;CLASSPATH=.;%JAVA_HOME%\lib;%JAVA_HOME...
2019-06-30 23:55:27
312
原创 gcc和g++的区别
gcc和g++只是一个调用器,根据各自的规则确定是调用对应的编译器(GUN C Compiler or GUN C++ Compiler)。区别如下: gcc g++ 编译阶段 对于c文件,按照c的编译规则; 对于cpp文件,按照c++的编译规则; c文件和cpp文件一律按照c++的编译规则 链接阶段 对于cpp文...
2019-05-23 22:54:25
153
原创 makefile入门
先来个例子:TARGET = mainSRCS = $(wildcard *.c)OBJS = $(SRCS:%.c=%.o)CC = g++$(TARGET):$(OBJS) $(CC) -o $@ $^ #g++ -o $(TARGET) $(OBJS)%.o:%.c $(CC) -c $<.PHONY:clean #没有这一句也OK。但是,如果在当前目录下...
2019-05-14 22:03:40
231
原创 ARP协议
1、背景网络层地址和链路层地址是由不同部门分配的。链路层的MAC地址是由设备制造商定义的,并存储在设备的永久性内存中,不会改变。为了不同协议族中的网络层协议同时运行,工作在特定硬件设备上的任意协议族必须使用特定类型的地址。网络层的IP地址是由用户或网络管理员分配的,并且可以接需选择。例如,为便携设备分配的IP地址可能改变,IP地址通常从维护附近网络连接点的地址池中获得,它在系统启用或配置时分...
2018-11-04 23:33:02
524
原创 const和#define的区别
1、编译处理阶段不同:define是在预处理阶段进行宏展开,const是在编译运行阶段。2、类型和安全检查不同:const常量有具体的类型,在编译阶段会执行类型检查,而define没有。3、存储方式不同:const常量会进行内存分配(C++中,对于简单类型的临时常量会保存在符号表里面进行替换,而不会分配内存),而define仅仅是展开,不会分配内存。4、有些调试工具可以对const进行调试,...
2018-11-03 22:34:48
4375
原创 C语言static关键字使用说明
1、static全局变量与普通的全局变量有什么区别?存储方式:全局变量本身就是静态存储方式,静态全局变量也只能是静态存储方式。这两者在存储方式上并无不同。作用域:非静态全局变量的作用域是整个源程序,而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它,如不能通过extern访问其他源文件的静态全局变量。2、static局部变量和普通局部变...
2018-11-03 22:25:34
706
原创 C语言inline函数说明
一句话总结:inline函数的定义(而不是申明)一般必须在头文件或本C文件内使用之前。inline是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。关键字inline必须与函数实现放在一起才能使函数成为内联,仅将inline放在函数声明前面不起任何作用。如果内联函数在调用之后才定义,则编译器不会进行函数体替换,只会作为一个普通的函数调用。所以如果在C文件中定义,必须先定义后使用,...
2018-11-03 22:13:27
5092
原创 Linux进程地址空间典型布局
其中,数据区包括:1).data:保存已经初始化了的全局变量和局部静态变量。2).bss:未初始化的全局变量和局部静态变量。3).rodata:保存只读变量,如const常量或者字符串常量等。堆区是malloc和new分配的内存。Q&A1)如何直接访问指定地址的内存数据?在平坦的内存模型中,整个内存是一个统一的地址空间,可以使用32位指针(和系统有...
2018-09-08 18:12:34
270
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人