自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(191)
  • 资源 (1)
  • 收藏
  • 关注

原创 spring源码分析aop链执行详细过程

spring aop执行链详细解说

2022-10-13 15:56:39 635 1

原创 mybatis和mybatis-plus最佳实践

mybatis和mybatis-plus最佳实践

2022-10-11 16:38:53 490

原创 mysql优化最佳实践一

mysql优化最佳实践

2022-10-09 13:11:29 1337 3

原创 mysql关于如何彻底解决和理解幻读问题

mysql如何彻底解决幻读问题

2022-09-05 10:55:48 440

原创 红黑树B树B+树区别及其适用场景

红黑树,B树,B+树的深度理解

2022-08-22 16:20:47 3325

原创 idea关于git的使用

idea如何使用git

2022-07-28 00:27:00 142

原创 Linux命令之ln命令使用

ln命令使用

2022-06-27 16:20:09 1268

原创 消息队列-kafka提交offset问题

说明:转载本人掘金文章概述offset是相对Consumer来说的,offset是用来帮助记录某个主题某个分区的消费情况的。当你每提交一次offset,意味着向kafka汇报一次消费进度,对于提交offset所以又分为同步和异步提交同步和异步提交offset对比同步提交:1.每次处理完一条消息,然后调用consumer.commitSync()提交offset2.在调用consumer.commitSync()方法时候会堵塞住,严重影响消费者性能3.每次提交都会向__consumer_offs

2022-05-18 14:00:53 3586 4

原创 消息队列-kafka关于CommitFailedException问题

说明:转载本人掘金文章概述提交offset失败这个异常也是我们开发中常见的异常,那么这个异常是怎么引起的呢?只要我们明白原因,那么就能避免,特别是在异步提交情况下(offset丢失),导致重复消费,消息一直卡在最后一批,导致业务数据受到严重的破坏。了解消费者实例机制1.kafka消费者都是按照批量消息拿过来消费的,因为发送也是批量的,这样可以提高kafka性能2.kafka中消费者有个参数max.poll.interval.ms(获取下一批消息间隔时间),如果上一批还没在这个事件之内处理完,那么k

2022-05-17 16:12:25 864 2

原创 消息队列-kafka消费异常问题

说明:转载本人掘金文章概述在kafka中,或者是说在任何消息队列中都有个消费顺序的问题。为了保证一个队列顺序消费,当当中一个消息消费异常时,必将影响后续队列消息的消费,这样业务岂不是卡住了。比如笔者举个最简单的例子:我发送1-100的消息,在我的处理逻辑当中 msg%5==0我就进行 int i=1/0操作,这必将抛异常,一直阻塞在msg=5上,后面6-100无法消费。下面笔者给出解决方案。重试一定次数(消息丢失)@KafkaHandler @KafkaListener(topics = {

2022-05-17 16:11:26 1791

原创 消息队列-kafka如何处理消息堆积问题

说明:转载本人掘金文章概述如何处理消息堆积问题? 这个问题也是经常面试被问到的问题。除此之外当然是有实际应用场景的。笔者在公司就碰到消息堆积问题,笔者公司是做流量监控防网络攻击的,因此需要对路由器所有流量进行处理和风险过滤,你可以想象一个公司的流量数据,公司员工只要在使用电脑就有进出流量,我们就要对每个请求进行处理。除此之外,我见过一些常见错误处理消息堆积问题的方式也分享给大家。增加分区同时增加消费实例kafka中一个消费组内的一个消费者线程只能对应一个主题内的一个分区进行消费,也就是说如果你单独增

2022-05-17 16:10:17 4495

原创 消息队列-kafka消息丢失问题

说明:转载本人掘金文章概述消息队列丢失消息是个经典的问题,也是我们在开发当中容易忽略的问题,最重要是面试当中必考题。消息队列总体上分为三部分:生产者(Producer),消费者(Consumer),消息队列服务端(broker)。不幸的是在使用不当情况下,三个环节都有可能丢失消息,今天我们就来讨论下为什么会丢消息,以及丢消息的解决方案。producer丢失消息问题Producer的作用是向Broker发送消息的。例如在这样一个场景: Producer已经向Broker发送了一条消息,在消息传输到Br

2022-05-17 16:09:26 553

原创 分布式系统CAP理论到BASE理论落地

说明:转载本人掘金文章CAP理论1.Partition tolerance指的是一个分布式系统不能因为多个网段的其中一个网段出现问题,而导致整个分布式的一致性和可用性得不到保证,也就是支持分区容错是一个分布式系统的前提和基础,否则不被称为分布式系统。保证分区容错的言外之意就是,如果你的系统是个分布式系统,那么你的服务节点一定是多副本并且副本节点分布在任意网段的,这是作为一个分布式系统的基本要求。2.Availability指的是分布式系统对于一个任意用户请求,需要在用户预期内得到系统的响应。这里如果没

2022-05-17 16:00:18 370

原创 多线程编程重新认识ReentrantLock

说明:文章转发自本人掘金文章概述ReentrantLock是我们常用的单机锁,可以帮助我们正确同步多线程代码。ReentrantLock是基于AQS实现的,我们可以看看ReentrantLock是怎么基于AQS实现锁机制的。ReentrantLock原理NonfairSync实现1.lock方法(获取锁)a.线程A先获取锁,获取成功,直接运行同步代码(获取锁的线程在head节点)b.线程B,C获取锁发现锁状态已经改变,那么加入到队列中,并且线程被park2.unlock方法(释放锁)a

2022-05-17 15:58:13 137

原创 多线程编程重新认识Volatile & synchronized

说明:转载本人掘金文章 https://juejin.cn/post/7082242009242550285as-if-serial语义as-if-serial语义初衷是为了提高指令执行速度(指令执行顺序优化),大概语义是保证在单线程情况下可以允许多个指令在没有数据依赖的情况下可以进行指令重排。数据没有依赖public static void test3(){ int a=0,b=0; a=1; //和b=1没有数据依赖 b=1; //和a=1没有数据依赖}这种情况

2022-05-17 15:54:00 92

原创 kafka就多方面理论实践总结

说明:转载本人掘金文章 https://juejin.cn/post/7094074279477641246分区立论实践总结理论1.从架构上来说,分区可以达到系统伸缩的目的。增加节点,增加分区,提高整个系统的生产,消费,服务端吞吐量。2.每个分区都是一个消息集合,都是有顺序的。3.消息决定放入哪个分区,可以自己去选择相应的分区策略或者自定义一些自己的分区策略。kafka自带了三种分区策略,分别是:轮询,随机,key有序(key的hash一致特性),默认是轮询,适合大部分场景。实践1.业务中有需

2022-05-17 15:45:05 259

原创 JVM内存调优总结(JDK8)

说明:转载本人掘金文章 https://juejin.cn/post/7094613544687108126内存分配查看内存分配情况1.查看堆总内存 jinfo -flag MaxHeapSize vmid2.查看新生代内存 jinfo -flag NewSize vmid3.查看老年代内存 jinfo -flag OldSize vmid4.查看使用的垃圾收集器 jinfo -flags vmid5.查看元空间(方法区)内存 jinfo -flag MetaspaceSize(MaxMet

2022-05-17 15:42:26 1394

原创 JVM关于CMS和G1垃圾回收器总结

说明:转载本人掘金文章 https://juejin.cn/post/7095305190420512781CMS1.使用的是标记清除算法,对老年代的回收器2.初始标记,标记的是GC Roots的对象,会STW,时间很短3.并发标记是进行标记GC ROOTS关联的对象,时间可能比较长,但是不影响用户线程使用4.重新标记是对并发标记的补充,因为并发标记阶段,用户程序还在运行,其实是个修正过程。5.并发清理,直接多线程清理掉不在GC ROOTS的对象,回收结束总结:缺点:1.使用标记清除算

2022-05-17 15:40:14 2310

原创 Elasticsearch整体架构解析总结升级版

总体架构图1.整体上看一个es集群,一个es集群由多个节点组成2.es一个数据索引由多个分片组成,并且分布在es各个节点中3.es分片又由P(主)分片和R(副)分片组成4.主分片可以读写,副分片只能提供读的功能5.索引一创建,主分片不可改变(参考数据路由算法),副分片可以增加或者减少单个分片架构图1.一个分片内部包含几种文件,segment,commit point,translog,.del文件2.segment可以理解为一个倒排索引,数据全部存在里面,并且是倒排索引结构(索引即数据)

2022-04-03 18:34:45 3549 4

原创 JVM常用工具总结

jps(查看JVM进程基本信息)1.jps 查看所有jvm进程(显示进程id和执行的java入口类)2.jps -m 查看jsp数据+main方法参数3.jps -v 查看jvm启动参数(堆大小,使用编码等)jstat(监视虚拟机各种运行状态信息)jstat -<option> [-t](jvm运行时间) [-h<lines>](多少行重新打印头) <vmid> [<interval>(打印间隔时间) [<count>(打印次数)]]1

2022-04-03 18:31:27 774

原创 JVM关于内存回收总结

theme: channing-cyan概述JVM内存回收,我将从以下几方面分析。分别是回收的区域,回收的数据,回收的依据,回收的算法,常见垃圾回收器来彻底聊一下这个问题。回收的区域1.JVM内存模型分为线程共享和线程独享2.线程独享内存生命周期是等于线程的生命周期,是不需要回收的3.线程共享的内存生命周期是和JVM进程相同的,是需要回收的回收的数据堆回收1.当我们new一个对象或者数组的时候,其实就会将对象和数组的内存分配在堆上2.当堆上数组和对象已经不需要的时候,这些对象和数组.

2022-04-03 18:29:43 1066

原创 缓存一致性问题三种解决方案附上代码

概述缓存一致性问题也是使用缓存中比较经典的问题之一。使用缓存,涉及数据库和缓存两部分数据的维护,既然是两个组件的数据,那么必然有数据一致性问题。常用的解决方案有三种,分别是设置过期时间,先更新数据库,再删缓存,先删缓存,再更新数据库。吗,设置过期时间代码示例1.查询数据@RequestMapping("/cache/db/{userId}")@GetMappingpublic User getUser(@PathVariable Integer userId){ //查询缓存

2022-04-03 18:28:04 1600

原创 布隆过滤器解决缓存穿透方案附上代码

概述缓存击穿,大家多多少少听说过。那么这个问题到底是个什么问题?怎么解决呢?这个问题其实是在高并发场景下,使用缓存提高访问速度,一些非法访问或者说攻击刻意绕过缓存,来直接攻击我们数据库。导致我们缓存形同虚设,并没有起到缓存效果。这个问题解决的根本就是过滤掉非法请求,只允许访问合法数据即可,而布隆过滤器就是用来过滤非法请求的,能达到我们预想的效果。布隆过滤器原理原理图1.首先会初始化一个全0比特位的数组,这个数组长度取决于用户期望存储数据的个数size,以及用户期望的误判率fpp,根据用户size

2022-04-03 18:26:46 1179

原创 Elasticsearch业务常用21种语句操作附Java Api代码

概述我们操作数据习惯使用sql语句,对于非sql语句的数据库中间我们肯定使用得很不习惯.今天我要说的就是Elasticsearch,经常写过的一些语句,可能就忘记了,特别是写一些复杂查询的时候,更是到处百度资料,很是烦人.因此,我特地花了大量时间进行总结(包括 json格式语句和对应java api编写)配置<dependency> <groupId>org.springframework.boot</groupId> <artifactId&

2022-03-11 12:58:58 2647

原创 spring源码分析事件原理图文详解

概述说到事件,大家多少都是首先想到消息中间件,比如kafka,rabbitmq等。spring中也支持事件,分为事件发送和时间监听。spring事件机制原理本质其实就是调用事件发送方法,然后直接回调容器中listener对象。说到这里,大家应该明白,spring事件机制是依赖于当前容器的,说明白点就是一个单机版事件机制。那么使用场景也就是spring容器生命周期的事件应用。参考资料1spring源码分析容器整个生命周期图文详解2spring源码分析AOP原理图文详解代码示例//定义事件发布器@

2022-02-18 13:18:06 1228 5

原创 spring源码分析AOP原理图文详解

概述spring aop是spring特性之一,大部分情况下,我们使用aop特性都是想对功能方法的增强。想要透彻了解aop原理,最好需要提前了解两块内容,一个是java两种动态代理的实现,一个是spring容器初始化bean原理。参考资料1 spring源码分析容器整个生命周期图文详解2java两种实现动态代理方式sping使用aop代码示例//1.开启aop@EnableAspectJAutoProxy@Configurationpublic class MyConfig {}//

2022-02-17 20:23:56 1016

原创 spring源码分析容器整个生命周期图文详解

注册Bean1.注册bean包括bean信息解析,容器创建,注册bean到容器中三部分2.bean信息解析,会将xml,注解,配置类等信息转换为BeanDefinition,加入到Bean工厂3.这部分我们重点关注的是BeanFactoryPostProcessor,这是spring容器留给我们扩展用的, 在容器初始化之前可以添加我们自定义的一些东西,最常见的就是添加bean的注册信息. 4.这部分会提前初始化BeanFactoryPostProcessor和BeanPostProce

2022-02-14 23:54:47 752 2

原创 nginx安装配置总结

nginx安装1.安装nginx https://www.runoob.com/linux/nginx-install-setup.html2.如果需要代理mysql,redis之类的,编译安装nginx时需要--with-stream 举例 ./configure --with-stream --with-pcre=../pcre-8.353.比较熟悉情况下,推荐docker安装nginx常用命令1.nginx -version //查看版本2.nginx //启动3.nginx

2022-01-27 19:44:27 3206 1

原创 Elasticsearch集群环境搭建(Dcoker)

创建networkdocker network create elasticsearch_network安装Elasticsearch1.安装node1docker run --name elastic-node1 \ --net=elasticsearch_network \ -p 9200:9200 \ -e ELASTICSEARCH_CLUSTER_NAME=elasticsearch-cluster \ -e ELASTICSEARCH_CLUSTER_HOSTS=ela

2022-01-27 19:43:34 1408

原创 Elasticsearch重建索引

概述很多情况下,Elasticsearch是需要重建索引的. 比如主分片数量想修改,加了keyword类型等.操作步骤1.首先创建一个新索引,结构一致PUT /myindex_new{ "settings": { "number_of_shards": 2 , "number_of_replicas": 0 }, "mappings": { "properties": { "name":{ "type": "keyword"

2022-01-27 19:42:50 2688

原创 linux防火墙命令

1.查看开放端口 firewall-cmd --list-all 2.开放端口 firewall-cmd --add-port=8080/tcp --permanent 3.加载防火墙 firewall-cmd --reload

2022-01-24 23:24:47 1502

原创 mysql使用redo日志实现事务持久性

概述前面提到,为了减少io操作,加载的数据页先会放到Buffer pool,等到刷盘时机,才会真实将页数据刷到磁盘进行持久化.假设修改好的脏页,在事务已经提交的情况下,突然断电,那么修改的脏页就丢失了,这样没办法保证事务的持久性.这个时候redo日志就派上用场了.redo日志原理1.当执行一条写语句时候,首先会加载到Buffer pool的缓存页中,然后修改页中数据,加入到 flush链表中,我们知道如果这个时候断电,数据其实在只是内存中改了,会导致数据丢失, 这个修改后的脏页再也无法恢复出

2022-01-14 23:10:37 461

原创 mysql中的Buffer Pool

概述innodb存储引擎加载数据是按照页单位来加载的。当我们对一张表做增删改查的情况下,mysql会查找对应的表空间,根据索引找到段,根据段找到页或者区,然后将16k整页数据加载到内存,然后修改页中的记录,保存到磁盘。其实真实情况不是这样,最后一步并不是马上写回磁盘,而是先写到Buffer Pool中,等到了一定时机,才会统一刷盘的,这样mysql可以节省一些io操作,特别是操作频繁的热点数据。也就是说数据修改是暂时写到内存(Buffer Pool)的,其实会存在持久性问题,后续讨论redo,undo日志

2022-01-12 22:14:16 676

原创 mysql查询优化器对sql执行成本的估算

概述mysql中,有个查询优化器,是专门用来估算查询语句的成本的,然后选择一个mysql认为成本最低的方案进行执行。今天我们来了解一下常见查询sql语句的成本是怎么估算的,mysql依据是什么?估算准备知识点1mysql估算基于哪些数据a.mysql既然要估算查询成本,那么必然要进行一些计算,就像我们要去一个地方,想要知道要多久一样。 计算公式是路程除于速度。不同交通工具速度不一样,不同路线总路程也是不一样的。 b.mysql有类似于上面的数据存在。mysql每张表都有统计信息,使用命令S

2022-01-09 15:29:45 654

原创 mysql两表连接原理(搞懂join buf)

概述一般情况下,我们使用mysql都是使用两种查询比较多,一个是单表查询,一个是多表连接。多表连接原理还是很重要的,特别是对查询优化这块的理解。从表空间层面来看,多表都不在一个表空间,那么可想而知这个是不是更加需要考虑优化,更加需要知道其中的原理。原理1.正常情况下表连接1.两张表 stu 和stu_score,也就是一张记录学生基本信息表,一张记录学生成绩表2.现在需要join 两张表,假设 on 条件为 stu.id=stu_score.stu_id作为连接条件 3.基于stu作为驱

2022-01-08 11:49:14 1240

原创 mysql单表访问方法

概述所谓的访问方法就是你想查出一堆数据,然后把sql丢给mysql,然后mysql根据你的表情况(索引,数据量,查询成本),给出mysql自己认为最优的执行方式,这就是访问方法。mysql给这些执行方法取了独立名字,分别是:const,ref,ref_or_null,range,index,all,index merge等值查询(单字段单值)(走单个索引)1.const方法select * from user where id=? //id是主键(聚簇索引)select * from user

2022-01-04 23:59:58 516

原创 mysql表空间解析

概述前面几节,我介绍了行记录,页,索引(B+)的结构,索引的叶子和非叶子节点都是由页构成的,页的大小有16k,可以存储满行记录。那么问题来了,一张表有多个索引,那这些索引又是怎么组织起来的呢,答案就是我们今天要讲的表空间,表空间真是描述了一张表怎么合理存储多个索引的,也就是表数据(索引即数据)。表空间结构解析1.表空间整体结构1.表空间其实是一个文件,存在mysql安装时候的数据目录下面2.每创建一张表,就会生成一个.idb文件,这个文件就是表空间文件3.一个表文件中分为很多extend(

2022-01-03 15:04:52 1036 3

原创 mysql行格式解析

概述mysql行格式虽然在我们写代码的时候不太会关注这个东西,但是了解了还是对我们有一定帮助的,这样我们可以对mysql是怎么存储数据有一定了解,我们可以更好的对mysql进行一些优化和存储的空间的节省.了解行格式,其实就是了解我们插入数据库的每条记录是怎么存储的.行记录分析1.行格式分类COMPACT,Redundant,Dynamic,Compressed,由于现在默认使用的是Dynamic,我们了解这种就行了,其它 的行格式大同小异2.Dynamic行结构分析1.表例子2.dynam

2021-12-29 20:15:56 486

原创 redis集群部署及应用场景

概述redis cluster大家喜欢叫它redis集群,也有人喜欢叫分片集群。总结下来,redis有三种模式,分别是单机,哨兵模式,分片集群。从表面上看使用的机器越来越多了,其实确实是随着数据量读写的变化,需要不断升级三种部署模式,我们下面来看看区别,以及分别适用场景。分片集群原理图说明:如图,分片集群的含义的一目了然,数据分布存储在不同节点。首先客户端会对key进行CRC16计算,计算出来得到一个slot号,然后数据读写就在对应的redis实例上。和哨兵模式对比,分片集群不仅保证了高可用,同时还

2021-12-26 20:00:54 1295

原创 redis使用哨兵主从切换,程序应该做点什么?

概述哨兵通过监控master,如果发现master未回复心跳包,那么会判断为主观下线,票数过半哨兵都认为master主观下线,那么确认为master客观下线,那么接下来会在多个哨兵中选择一个作为leader,去做master切换工作。切换了新的master,通知客户端连接新的master.那么问题来了,程序那边怎么知道新master地址多少?应用程序那边需要做什么改变吗?引入依赖//springboot项目集成redis<dependency> <groupId>org

2021-12-26 15:14:50 543

windows&linux-jdk

jdk-8u281-linux-x64.tar.gz

2021-02-19

空空如也

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

TA关注的人

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