自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 不愧是阿里内部“千亿级并发系统架构设计笔记”面面俱到,太全了

金九银十招聘季来了,不知道大家有没有发现一件事,现在不管是互联网大厂,还是初创公司,那些面试官总喜欢拿高并发和你说事。即使,他们公司的业务量只有几万的QPS,但是就想拿这个来考考你,看看你的底子扎不扎实。在现今IT界特别是程序员,如果你对于高并发都没有接触和了解过未免也有些太孤陋寡闻,而作为一个优秀的程序员,高并发系统架构设计师必须要掌握的。很简单,现在大多数互联网公司都会用到高并发系统架构设计。...

2022-08-30 21:28:25 506 7

原创 Java 全栈知识体系( PDF 可下载)

40000 +字长文总结,民工哥已将此文整理成PDF文档了,需要的见文后下载获取方式。全栈知识体系总览Java入门与进阶面向对象与Java基础 Java 基础 - 面向对象 Java 基础 - 知识点 Java 基础 - 图谱 & Q/A 基础知识点复习完了以后,我们需要深入的理解Java中的一些基础机制: Java 基础 - 泛型机制详解 Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本

2022-03-17 15:03:00 5137 94

原创 redis 的持久化方式各有什么优点?

当开启了混合持久化时,在 AOF 重写日志时,fork 出来的重写子进程会先将与主线程共享的内存数据以 RDB 方式写入到 AOF 文件,然后主线程处理的操作命令会被记录在重写缓冲区里,重写缓冲区里的增量命令会以 AOF 方式写入到 AOF 文件,写入完成后通知主进程将新的含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的的 AOF 文件。所以,RDB 快照就是记录某一个瞬间的内存数据,记录的是实际数据,而 AOF 文件记录的是命令操作的日志,而不是实际的数据。

2022-09-27 19:58:23 657 1

原创 数据库MVCC如何解决可重复读问题?

事务是在 MySQL 引擎层实现的,我们常见的 InnoDB 引擎是支持事务的,事务的四大特性是原子性、一致性、隔离性、持久性,我们这次主要讲的是隔离性。当多个事务并发执行的时候,会引发脏读、不可重复读、幻读这些问题,那为了避免这些问题,SQL 提出了四种隔离级别,分别是读未提交、读已提交、可重复读、串行化,从左往右隔离级别顺序递增,隔离级别越高,意味着性能越差,InnoDB 引擎的默认隔离级别是可重复读。

2022-09-27 19:39:32 1047

原创 如何简单理解 Redis 的缓存穿透、击穿和雪崩?

缓存异常会面临的三个问题:缓存雪崩、击穿和穿透。其中,缓存雪崩和缓存击穿主要原因是数据不在缓存中,而导致大量请求访问了数据库,数据库压力骤增,容易引发一系列连锁反应,导致系统奔溃。不过,一旦数据被重新加载回缓存,应用又可以从缓存快速读取数据,不再继续访问数据库,数据库的压力也会瞬间降下来。因此,缓存雪崩和缓存击穿应对的方案比较类似。而缓存穿透主要原因是数据既不在缓存也不在数据库中。因此,缓存穿透与缓存雪崩、击穿应对的方案不太一样。

2022-09-27 17:03:32 618 2

原创 tcp 为什么要三次握手,两次不行吗?为什么?

你想想,两次握手的情况下,「被动发起方」在收到 SYN 报文后,就进入 ESTABLISHED 状态,意味着这时可以给对方发送数据,但是「主动发起方」此时还没有进入 ESTABLISHED 状态,假设这次是历史连接,「主动发起方」判断到此次连接为历史连接,那么就会回 RST 报文来断开连接,而「被动发起方」在第一次握手的时候就进入 ESTABLISHED 状态,所以它可以发送数据的,但是它并不知道这个是历史连接,它只有在收到 RST 报文后,才会断开连接。客户端连续发送多次 SYN 建立连接的报文,在。

2022-09-27 16:53:18 5965

原创 深入理解Java Stream流水线

本文详细介绍了Stream流水线的组织方式和执行过程,学习本文将有助于理解原理并写出正确的Stream代码,同时打消你对Stream API效率方面的顾虑。如你所见,Stream API实现如此巧妙,即使我们使用外部迭代手动编写等价代码,也未必更加高效。

2022-09-25 21:56:16 268

原创 堪称零瑕疵!仅用了330页直接封神,我要吹爆这份RocketMQ笔记

RocketMQ天生为金融互联网领域而生,追求高可靠、高可用、高并发、低延迟RocketMQ在阿里集团也被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景其主要功能有:RocketMQ 核心的四大组件:Name Server、Broker、Producer、Consumer ,每个组件都可以部署成集群模式进行水平扩展。小编为了大家能在简历上写熟练RocketMQ,这份大师级的RocketMQ核心笔记以及RocketMQ原理电子书,今天就拿出来分享给大家通过本笔记可以让大家

2022-09-25 21:19:52 337

原创 Springboot启动扩展点超详细总结,再也不怕面试官问了

我们从这些spring&springboot的扩展点当中,大致可以窥视到整个bean的生命周期。在业务开发或者写中间件业务的时候,可以合理利用spring提供给我们的扩展点,在spring启动的各个阶段内做一些事情。以达到自定义初始化的目的。此篇总结,如果有错误或者疏漏的地方,恳请指正。

2022-09-25 21:14:04 247

原创 金九银十想面BAT?那这些JDK动态代理的面试点你一定要知道

代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。代理模式UML图:结构示意图:为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间,从而在设计上获得了更大的灵活性。

2022-09-22 22:00:24 179

原创 来说说缓存穿透、缓存击穿、缓存雪崩都是什么?怎么解决?

然后有可能DBA会紧急重启DB,但是刚一恢复,新的请求立马又把DB打垮了。但是如果一个高频的热点数据,在失效的一瞬间,它的大量请求就会直接打到DB上,这样在DB还没有返回数据给Redis的时候,DB承受了热点请求的压力,就好像缓存是一个水桶,然后突然水桶破了一个洞,直接冲垮了后面的堤坝(DB)。面试的时候就被问到了这个问题,具体描述就是,正常的请求都是先请求到缓存(就当我们的缓存是Redis吧),如果缓存中存在数据,就直接返回,如果缓存中不存在请求的数据,就查询数据库,然后将查询到的数据再放到缓存中。

2022-09-22 21:31:44 170

原创 调优达到上限?这份尊享版性能实战套餐,让你领先别人好几个级别

在Java程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。性能调优的步骤主要有:衡量系统现状、设定调优目标、寻找性能瓶颈、性能调优,验证是否达到调优目标。现代大规模关键性系统中的Java性能调优,是一项富有挑战的任务。你需要关注各种问题,包括算法结构、内存分配模式以及磁盘和文件I0的使用方式。性能调优最困难的是找出问题,即便是经验丰富的人也会被他们的直觉所误导。性能杀手总是隐藏在最意想不到的地方。

2022-09-22 21:25:18 154

原创 这三年被分布式坑惨了,曝光十大坑

而如果消息不可避免地被消费多次,如果我们开发人员能通过技术手段保证数据的前后一致性,那也是可以接受的,这让我想起了 Java 并发编程中的 ABA 问题,如果出现了 [ABA问题),若能保证所有数据的前后一致性也能接受。Kafka 有一个 偏移量 的概念,代表着消息的序号,每条消息写到消息队列都会有一个偏移量,消费者消费了数据之后,每过一段固定的时间,就会把消费过的消息的偏移量提交一下,表示已经消费过了,下次消费就从偏移量后面开始消费。可能熬夜到天亮,结果升级失败,则需要回滚,其实对技术团队都是一种煎熬。

2022-09-22 20:47:54 137

原创 惊艳!阿里出产的MyCat性能笔记,带你领略什么叫细节爆炸

如今随着互联网的发展,数据的量级也是成指数式的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求,这个时候NoSQL的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库。如何使用关系型数据库解决海量存储的问题呢?此时就需要做数

2022-09-22 20:32:51 127

原创 synchronized相关面试题,你接得住吗?

觉得不错小伙伴记得转发关注哦,后续会持续更新精选技术文章!

2022-09-22 19:52:55 209

原创 2022最新Java面经整理 | 数据库篇(一)MySQL

11、上面提到了B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据,什么是聚簇索引?16、那么在哪些情况下会发生针对该列创建了索引但是在查询的时候并没有使用呢?12、联合索引是什么?10、Hash索引和B+树所有有什么区别或者说优劣呢?8、Hash索引和B+树所有有什么区别或者说优劣呢?10、什么是聚簇索引?何时使用聚簇索引与非聚簇索引?5、MySQL中InnoDB引擎的行锁是怎么实现的?13、在建立索引的时候,都有哪些需要考虑的因素呢?4、MyISAM索引与InnoDB索引的区别?

2022-09-22 19:36:43 899

原创 全网最通俗易懂的Kafka入门!

我之前写过的消息队列入门使用消息队列不可能是单机的(必然是分布式or集群)数据写到消息队列,可能会存在数据丢失问题,数据在消息队列需要持久化(磁盘?数据库?Redis?分布式文件系统?)想要保证消息(数据)是有序的,怎么做?为什么在消息队列中重复消费了数据下面我以Kafka为例对这些问题进行简单的解答,进而入门Kafka。

2022-09-22 16:19:55 211

原创 Java如何实现消费数据隔离?

代码看似简单,业务看似容易理解,但是要知道的是即便是很多小公司的生产项目都没有这种设计。一把梭可真的是太常见了(功能又不是不能实现,代码又不是不能跑,最主要的:人也不是不能跑)这篇文章主要讲述了一个思路:在消费MQ的时候,多group是可以实现数据隔离的,想要提高消费的吞吐量,可以再做一层缓冲区(前提是消费是IO密集型的)

2022-09-22 16:09:10 356

原创 SpringBoot接入GrayLog

之前我好像是在知乎看到过类似的一段话:一个工具或框架使用优秀,就取决于它的入门的难易。如果一个框架要花很长时间才能弄懂,那可能它做得并没那么好。我其实不会经常去研究各种使用的框架它的细节原理,也不会蒙头就去看源码,没什么必要,毕竟它没出问题啊。像GrayLog这种工具类的框架,如果在公司不是主要的维护者,其实不必太过于纠结他的实现细节,可以从总体上把握他的设计思想。换我建议,真要学习,还得是看它的具体存储(比如Elasticsearch的原理)学习就要带有利益点。

2022-09-22 15:56:00 186

原创 微服务架构,这一篇就够了!

所有的微服务都是独立的Java进程跑在独立的虚拟机上,所以服务间的通信就是IPC(inter process communication),已经有很多成熟的方案。原来的Monolithic方式开发,所有的服务都是本地的,UI可以直接调用,现在按功能拆分成独立的服务,跑在独立的一般都在独立的虚拟机上的 Java进程了。它通常不依赖其他服务。后台有N个服务,前台就需要记住管理N个服务,一个服务下线/更新/升级,前台就要重新部署,这明显不服务我们 拆分的理念,特别当前台是移动应用的时候,通常业务变化的节奏更快。

2022-09-21 20:52:09 1986

原创 21道SpringMVC高频面试题(2022最新)

11、@RequestMapping 和 @GetMapping 注解有什么不同?12、@RequestParam 和 @PathVariable 两个注解的区别。10、@RestController 和 @Controller 有什么区别?19、Spring MVC 的拦截器和 Filter 过滤器有什么差别?9、@RequestMapping 注解有什么用?7、Spring MVC的常用注解由有哪些?8、@Controller 注解有什么用?6、Spring MVC的主要组件?

2022-09-21 20:43:04 455

原创 面试官:如何用 Redis 实现分布式锁?

可以看到,解锁是有两个操作,这时就需要 Lua 脚本来保证解锁的原子性,因为 Redis 在执行 Lua 脚本时,可以以原子性的方式执行,保证了锁释放操作的原子性。加锁失败后,客户端向所有 Redis 节点发起释放锁的操作,释放锁的操作和在单节点上释放锁的操作一样,只要执行释放锁的 Lua 脚本就可以了。这样一来,即使有某个 Redis 节点发生故障,因为锁的数据在其他节点上也有保存,所以客户端仍然可以正常地进行锁操作,锁的数据也不会丢失。基于 Redis 实现分布式锁的。Redlock 算法的基本思路,

2022-09-20 20:10:00 331

原创 为什么书上说是 TCP 四次挥手,但是实际会出现 TCP 三次挥手?

网上查了下资料说,设置 TCP_QUICKACK 并不是永久的,所以每次读取数据的时候,如果想要立刻回 ACK,那就得在每次读取数据之后,重新设置 TCP_QUICKACK。如果客户端是用 close 函数来关闭连接,那么在 TCP 四次挥手过程中,如果收到了服务端发送的数据,由于客户端已经不再具有发送和接收数据的能力,所以客户端的内核会回 RST 报文给服务端,然后内核会释放连接,这时就不会经历完成的 TCP 四次挥手,所以我们常说,调用 close 是粗暴的关闭。抓包的结果如下,可以看到是四次挥手。

2022-09-20 20:07:36 990

原创 Redis 大 Key 对持久化有什么影响?

或者,定时检查 Redis 是否存在大 key ,如果该大 key 是可以删除的,不要使用 DEL 命令删除,因为该命令删除过程会阻塞主线程,而是用 unlink 命令(Redis 4.0+)删除大 key,因为该命令的删除过程是异步的,不会阻塞主线程。当 AOF 写回策略配置了 Always 策略,如果写入是一个大 Key,主线程在执行 fsync() 函数的时候,阻塞的时间会比较久,因为当写入的数据量很大的时候,数据同步到硬盘这个过程是很耗时的。相反,如果是常规内存页机制,只用拷贝 4KB。

2022-09-20 19:58:41 130

原创 Redis系列之——深入了解Redis的String,源码层级+极易理解图片解析!

在上一篇文章中,我和大家介绍了Redis的前世今生,,这一篇就和大家一起揭秘Redis神秘的面纱,第一个我们就来聊一聊Redis数据类型中的。

2022-09-18 17:12:47 377

原创 TraceId 搭配 ELK ,碉堡了!

内容看着比较多,实际很容易实现,但真正生产环境要复杂的多,还需不断思考。

2022-09-18 17:02:46 224

原创 如何真正理解Spring的核心思想 ?

其实在很多场景下他俩是可以替换的,但是站在原理层面来说的,区别很明显,@Bean定义的Bean是会经过完整的Bean生命周期的。为什么要使用ASM技术,Spring启动的时候需要去扫描,如果指定的包路径比较宽泛,那么扫描的类是非常多的,那如果在Spring启动时就把这些类全部加载进JVM了,这样不太好,所以使用了ASM技术。在Spring中需要去解析类的信息,比如类名、类中的方法、类上的注解,这些都可以称之为类的元数据,所以Spring中对类的元数据做了抽象,并提供了一些工具类。

2022-09-07 21:08:01 1007

原创 最近面试Java后端开发的感受

如果有,那么你就可以适当描述下项目的需求,然后说,通过读底层代码,我了解了两者的差别,而且在这个实际需求里,我就用了TreeSet,而且我还专门做了对比性试验,发现用TreeSet比HashSet要高xx个百分点。而前者,一直在重复劳动,能力也只一直停留在“会干活”的层面。哪怕你在前三点表现一般,那么至少也能超越将近一般的候选人,尤其当你在SQL优化方面表现非常好,那么你在面试高级开发时,数据库层面一定是达标的,如果你连第四点也回答非常好,那么恭喜你,你在数据库方面的能力甚至达到了初级架构的级别。

2022-09-07 20:42:54 280

原创 Spring 源码阅读 29:基于 XML 配置初始化 Spring 上下文过程总结(10+详细流程图)

最近一直在看 Spring 框架的源码,并且写了一系列文章记录学习的收获,目前主要分析了 Spring 上下文的初始化和 Bean 初始化的一部分源码,文章收录在【Spring Framework 源码解读】专栏中。对 Spring 源码的阅读,可以让我更加了解一直在使用的 Spring 框架,也能让我从其中学到很多开发的技巧,比如设计模式的实践等。随着对 Spring 源码的不断了解,对一些最开始学习到的东西,有了新的认识。因此,在继续学习之前,我打算把前面看过以及记录过的东西,做一个整体回顾。

2022-09-07 16:33:01 238

原创 架构成长之路:Netty之ChannelHandler源码

本节对handler的一个基本内容进行了说明,主要讲解了handlerContext的执行过程,明确了调用链的入口在于pipeline,通过pipeline和context的控制,保证链的执行。channel的生命周期控制pipeline就能控制整个handler的执行。

2022-09-07 16:16:29 141

原创 字节二面:让写一个LFU缓存策略算法,懵了

本篇博客针对LFU做了一个简单的介绍,并详细介绍了如何用java来实现LFU,并且和LRU做了一个简单的比较。针对一种缓存策略。LFU有自己的独特使用场景,如何实现LFU和利用LFU的特性来实现开发过程部分功能是我们需要思考的。实际在使用中LRU的使用频率要高于LFU,不过了解这种算法也算是程序员的必备技能。

2022-09-07 16:11:39 229

原创 面试官:MySQL中InnoDB了解吗?一文深入分析如何避坑

以上 InnoDB 的实现和运行原理到这里就介绍完了。总的来讲,作为开发工程师,我们应该掌握数据库几个大的知识点,然后再深入到数据库内部实现的细节,这样才能避免经常写出一些具有性能问题的 SQL,培养调优数据库性能的能力。

2022-09-07 15:50:42 113

原创 关于SpringCloudAlibaba,看阿里这篇笔记真香

这几年以 Netfilix Eureka 为代表的 Spring Cloud 核心中间件纷纷停止更新,再加上许多组件设计老旧,在性能上已无法满足互联网大厂的要求,我们迫切需要一套符合中国特色的微服务架构解决方案,Spring Cloud Alibaba的诞生将慢慢成为主流的微服务技术!如果你还没有系统的学习资料,只需转发后私信回复【000】即可来获取免费领取方式了!

2022-09-07 15:18:22 105

原创 JMM 最最最核心的概念:Happens-before 原则

对于这个问题,从 JDK 5 开始,也就是在 JSR-133 内存模型中,终于给出了一套完美的解决方案,那就是原则,Happens-before 直译为 “先行发生”,《JSR-133:Java Memory Model and Thread Specification》对 Happens-before 关系的定义如下:1)如果一个操作 Happens-before 另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。

2022-09-07 15:07:28 173

原创 后端程序员必备:四种限流算法,图文结合一篇搞定

最近我们系统引入了Guava的RateLimiter限流组件,它是基于令牌桶算法的实现的。本文将跟大家一起学习几种经典的限流算法。

2022-09-07 15:02:42 238

原创 40张图看懂分布式追踪系统原理及实践

从图中可以看出我们只采用了 SkyWalking 的 agent 来进行采样,放弃了另外的「数据上报及分析」,「数据存储」,「数据可视化」三大组件,那为啥不直接采用 SkyWalking 的整套解决方案呢,因为在接入 SkyWalking 之前我们的 Marvin 监控生态体系已经相对比较完善了,如果把其整个替换成 SkyWalking,一来没有必要,Marvin 在大多数场景下都能满足我们的需求,二来系统替换成本高,三来如果重新接入用户学习成本很高。对于技术方案的选型,一定要避免过度设计,过犹不及。

2022-09-06 20:34:29 207

原创 双非本化学跨专业,投岗阿里/滴滴后端三面,最终拿下offer

本科双非化学,跨考了电子硕士,研究生依然双非。无互联网实习,无比赛无论文。(有自动化和高校实训讲师相关的实习经历)22年11开始学Java准备秋招。

2022-09-06 20:08:22 131

原创 这三年被分布式坑惨了,曝光十大坑

而如果消息不可避免地被消费多次,如果我们开发人员能通过技术手段保证数据的前后一致性,那也是可以接受的,这让我想起了 Java 并发编程中的 ABA 问题,如果出现了 [ABA问题),若能保证所有数据的前后一致性也能接受。Kafka 有一个 偏移量 的概念,代表着消息的序号,每条消息写到消息队列都会有一个偏移量,消费者消费了数据之后,每过一段固定的时间,就会把消费过的消息的偏移量提交一下,表示已经消费过了,下次消费就从偏移量后面开始消费。可能熬夜到天亮,结果升级失败,则需要回滚,其实对技术团队都是一种煎熬。

2022-09-06 16:27:48 109

原创 关于Java你不知道的之Java8新特性:HashMap优化

参考:HashMap初始容量为什么是2的n次幂首先看看HashMap中添加元素是怎么存放的第一个截图是向HashMap中添加元素putVal()方法的部分源码,可以看出,向集合中添加元素时,会使用(n - 1) & hash的计算方法来得出该元素在集合中的位置;

2022-09-06 15:14:03 996

原创 硬核\我花5小时肝出这篇Redis缓存解决方案,带你起飞

为了缓解持久层数据库的压力,在服务器和存储层之间添加了一层缓存;当客户端发起请求时,服务器响应处理,会先从redis缓存层查询客户端需要的请求数据,如果缓存层有缓存的数据,会将数据返回给服务器,服务器再返回给客户端;如果缓存层中没有客户端需要的数据,则会去底层存储层查找,再返回给服务器;当客户端想要查询一个数据,发现redis缓存层中没有(即缓存没有命中),于是向持久层数据库查询,发现也没有,于是本次查询失败;

2022-09-05 20:18:13 114

空空如也

空空如也

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

TA关注的人

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