自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

阳阳的博客

热爱技术,享受生活

  • 博客(325)
  • 资源 (17)
  • 收藏
  • 关注

原创 我这半年到底干了啥(附多家详细面经)

有现实中的小伙伴问我,我这半年到底干了啥。怎么博客突然不更新了?最近的一次更新还是在去年12月其实这半年嘛,一直在为面试做准备。算法一直是我的弱项,于是突击了力扣。开了会员,刷了将近700道,有的高频题目都刷了第二遍。我将每次的刷题记录同步到了github中,有需要的可以移步SunAlwaysOnline。下面是我的提交记录还是那句话,如果你想进大厂,算法是必须要过关的。面试前,我也整理了高频的知(ba)识(gu)点(wen),将会陆续发出来,小伙伴们不要着急哈。..

2021-08-01 23:47:38 7960 17

原创 大厂面经(50+)整理,看看大佬们是如何临危不乱的

大厂面经(50+)整理,看看大佬们是如何临危不乱的

2022-08-17 17:55:11 1595 2

原创 面试常问集锦——分布式系列

到底啥是分布式系统开发经验?https://mp.weixin.qq.com/s?__biz=MzU0OTk3ODQ3Ng==&mid=2247484872&idx=1&sn=d28383f3397ef6b250afc5c182fcb200&chksm=fba6edcbccd164dd38701a0e06a381249ebb6ad9d0205df2c605b9634688d0dd58f00a2d645a&scene=21#wechat_redirect图解 |

2022-05-18 19:10:30 2058

原创 java面试高频点深入第四期

第一期内容​​​​​​第二期内容第三期内容mysql:如何解决幻读、锁的分类、主从复制、分库分表;redis:主从复制、热key、大key;框架:MyBatis一二级缓存、只有接口没有实现类怎么实现查询、MyBatis插件原理;分布式部分:接口幂等性、限流算法、降级与熔断;实操部分:排查慢sql;设计模式部分:原型模式、责任链模式、组合与聚合的区别;mq部分:保证消息不丢失、处理重复消息、消息有序性、消息堆积处理、mq宕机怎么保证数据不丢失、消息队列选型;linux.

2022-02-17 14:16:39 1497 1

原创 从Curator实现分布式锁的源码再到羊群效应

本文从源码角度讲解了使用Curator获取分布式锁的流程,接着从等待锁的演化过程角度出发,分析了Zookeeper在分布式锁场景下避免羊群效应的解决方案。

2022-01-02 23:02:07 2051 1

原创 Redis哨兵机制原理浅析

一、前言上一篇文章Redis主从复制原理中简要地说明了主从复制的一个基本原理,包含全量复制、复制积压缓冲区与增量复制等内容,有兴趣的同学可以先看下。利用主从复制,可以实现读写分离、数据备份等功能。但如果主库宕机后,需要运维人员手动地将一个从库提升为新主库,并将其他从库slaveof新主库,以此来实现故障恢复。因此,主从模式的一个缺点,就在于无法实现自动化地故障恢复。Redis后来引入了哨兵机制,哨兵机制大大提升了系统的高可用性。二、什么是哨兵哨兵,就是站岗放哨的,时刻监控周围的一举一动

2021-12-30 23:32:23 2635 6

原创 面试官:能给我画个Zookeeper选举的图吗?

Zookeeper是一个分布式协调框架,提供分布式锁、配置项管理、服务注册与集群管理等功能。为了保证Zookeeper的高可用,一般都会以集群的模式部署。这个时候需要考虑各个节点的数据一致性,那么集群在启动时,需要先选举出一位Leader,再由Leader完成向其他节点的数据同步工作。本文将是Zookeeper系列的第一篇文章,从源码角度讲述Zookeeper的选举算法。

2021-12-26 17:19:48 2020 2

原创 简单谈谈MySQL的两阶段提交

一、简单回顾三种日志在讲解两阶段提交之前,需要对MySQL中的三种日志即binlog、redo log与undo log有一定的了解。在这三种日志中,很多同学会把binlog与redo log混淆,下面使用一张表格来简单对比下两者的区别。...

2021-12-21 22:36:11 13758 17

原创 Redisson可重入与锁续期源码分析

Redisson是一个可以在java项目中使用的Redis客户端,其屏蔽了原子性、可重入、锁续期的诸多细节,内部实现各种各样的锁。例如可重入锁、公平锁、MultiLock与Red Lock与读写锁等,今天主要分析可重入锁与锁续期的源码。

2021-12-18 00:42:03 2845 4

原创 面试官:说说你了解几种限流算法,手写个demo?

在流量突增的场景下,为了保证后端服务在整体上一个稳定性,我们需要对请求进行限流,来避免系统崩溃。不过限流会对少部分用户的请求直接进行拒绝或者延迟处理,影响这些用户的体验。本文会介绍一些常见的限流算法,并在最后附上对分布式限流的一些思考。

2021-12-05 22:55:58 10752 13

原创 从源码中窥探出事务失效的8种原因

核心流程解读我们从一段简单的代码入手,从头到尾分析以下其中的奥秘。如果在一个controller中调用service方法,该方法被@Transaction注解修饰。controller方法: @GetMapping("/save") public String saveStudent() { testService.save(); return "success"; }service方法: @Transactional

2021-11-30 23:45:47 1513

原创 8种方案,保证缓存和数据库的最终一致性

​我们通常使用缓存机制来提升系统的性能,缓存系统下的读写操作,一般都需要操作数据库与缓存。对于读操作,一般是先查询缓存,查询不到再查询数据库,最后回写进缓存。而对于写操作,究竟是先删除(更新)缓存,再更新数据库,还是先更新数据库,再删除(更新)缓存呢?由于对数据库以及缓存的整体操作,并不是原子性的,再加上读写并发,究竟什么样的方案可以保证数据库与缓存的一致性呢?下面介绍8种方案,配合读写时序图,希望你能从其中了解到保证一致性的设计要点。

2021-11-25 23:42:24 10183 6

原创 探究MySQL的索引结构选型

本文将探究MySQL索引结构的技术选型,分析哈希表、二叉搜索树、AVL树、红黑树、B树与B+树各自的优缺点。解释了MySQL最终选择B+树作为其索引的组织方式的原因,并在最后增加了3道常问的面试题。

2021-11-20 14:15:15 5141 3

原创 从源码角度结合详细图例剖析过滤器与拦截器

过滤器示例:@Componentpublic class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("Filter.init"); } @Override public void doFilter(ServletRequest se

2021-11-14 22:30:35 2920 2

原创 一次因线程池使用不当造成生产事故的排查记录与思考

某日当我点开熟悉的界面,一个又一个请求失败的提示赫然出现在屏幕上,不会是昨晚上线的代码有问题吧?吓得我急忙按F12查看了响应——"exception":"java.lang.OutOfMemoryError","message":"unable to create new native thread"出现了内存溢出的情况,无法创建更多的本地线程。接着查看了实例的监控大盘,发现每个实例的JVM线程数量都处于9000+的规模,且还有上涨的趋势。这是其中一个实例的线程数量监控图:10.

2021-11-09 23:51:03 3900 7

原创 Redis主从复制原理

单机Redis面临的问题单机Redis在发生故障时,由于无法做到故障转移,所以接下来的请求将会直接打到数据库。大量的查询使得数据库连接数达到峰值,且内部锁冲突严重,造成慢查询、连接超时等后果。所以这个时候,我们想着能不能将Redis数据以多副本的形式保存在多台Redis上,当发生故障时,快速地手动去切换连接的Redis?当然,Redis本身也提供了这个功能。主从模式能将Master节点的数据冗余到多台Slave上,配合哨兵模式能够快速感知Master宕机从而进行主从切换实现故障转移。

2021-11-04 21:09:41 1220 2

原创 22张图,带你入门分布式一致性算法Raft

Raft节点的角色划分与任期在Raft中,有以下三种角色:Follower 跟随者所有节点的初始状态,内部都会有一个超时时间。对于每一个Follower,其超时时间是随机的。这个超时时间,规定了在倒计时结束后仍然收不到Leader的心跳,Follower就会转变为Candidate。为什么每个Follower的超时时间是随机的,改成一样的可以吗?不可以,相同的超时时间会造成多个Follower同时转变为Candidate,选票被瓜分,导致获取不到半数以上的选票,就需要进行新一轮的选举

2021-10-30 22:31:17 2440 3

原创 通俗易懂的MySQL事务及MVCC原理,我先收藏了!

一、事务简介与四大特性事务指的是一组命令操作,在执行的过程中,要么全部成功,要么全部失败。由引擎层支持事务,MyISAM就不支持事务,而InnoDB是支持事务的。事务具有以下四大特性(ACID):原子性(Atomicity):指事务不可分割,要么全部成功,要么全部失败,不可能存在部分成功或部分失败的情况。如果执行某一条语句失败后,将会触发之前所有执行过的语句的回滚,因此靠的是undo log。 一致性(Consistency):在事务执行前后,数据的完整性没有遭到破坏。一致性是mysql追

2021-10-25 23:30:00 14105 10

原创 9张图,带你了解一致性哈希原理

假设我们现在做一个简单的文件缓存服务,由于文件数过多,我们先使用3台机器用来存储文件。为了由文件名(假设文件名称不重复)能得到存储的机器,考虑先对文件名做hash运算,接着对3取余,得到的余数即为所在机器的编号。这套系统运行了很久,后来文件数量慢慢增多,3台机器存不下了,现在我们考虑扩充到4台。这个时候,我们的算法更新为hash(文件名)%5。那么使用该算法获取abc.txt文件所在的缓存机器时,在其hash值为10的时候,将会映射到0号机器上,而之前是存储在1号机器上的,这个时候就会重

2021-10-21 22:55:56 2370 5

原创 还记不住Spring Bean的生命周期?看这篇你就知道方法了!

一、前言上次我们在手把手教你解决循环依赖,一步一步地来窥探出三级缓存的奥秘中分析了Spring解决循环依赖的方式,在第6节中的doCreateBean(AbstractAutowireCapableBeanFactory类中)其实已经隐约看到了Bean的生命周期的几个阶段。 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] ar

2021-10-16 23:33:53 4130 7

原创 谈谈Redis的持久化——AOF日志与RDB快照

一、前言对于Mysql,数据是持久化在磁盘上的。如果误删数据,可以使用binlog进行恢复;突然宕机时,其本身可以借助redo log进行崩溃恢复。更多关于Mysql日志的内容,可以参考我的另外一篇文章数据库日志——binlog、redo log、undo log扫盲而对于Redis,一般是把数据直接存储在内存中。如果不做任何持久化工作,在出现宕机后,内存中的全部数据就会丢失。显然,业务方是不能容忍这样的情况发生的。好在Redis提供了一系列的持久化机制,分别是AOF日志与RDB快照。二

2021-10-11 23:17:17 1550

原创 单例模式的6大种类,如何保证线程安全、反射安全以及序列化安全,这次终于通透了

单例模式在日常的开发过程中,我们需要使用到设计模式,而单例模式可谓是最常见的一种。正确的使用单例模式,不仅可以降低内存的使用率,也可以提升整个程序的运行效率。下面我来谈谈自己对单例模式的理解。【1】懒汉式特点:(1)是一种牺牲时间换取空间的策略(2)懒加载,只在需要的时候才实例化对象public class Singleton { private static Singlet...

2021-10-06 17:25:58 2410 3

原创 手把手教你解决循环依赖,一步一步地来窥探出三级缓存的奥秘

先不去管Spring中的循环依赖,我们先实现一个自定义注解,来模拟@Autowired的功能。一、自定义注解模拟@Autowired自定义Load注解,被该注解标识的字段,将会进行自动注入/** * @author qcy * @create 2021/10/02 13:31:20 *///只用在字段上@Target(ElementType.FIELD)//运行时有效,这样可以通过反射解析注解@Retention(RetentionPolicy.RUNTIME)public @

2021-10-03 23:10:01 3735 10

原创 数据库日志——binlog、redo log、undo log扫盲

binlog又称归档日志,由Server层实现与记录,因此对任何引擎都有效。binlog是一种只记录对表中数据以及对表结构产生更改操作的二进制文件,比如有insert、update、delete、create table、alter table等操作,不记录select、show,因为这些操作不会产生任何更改。不过就算一个update未产生数据变化,也是会被记录进去的。binlog是追加写入的,一个文件写满,会重新创建一个文件继续写,文件名称是mysql-bin.xxxxxx,例如myql-bi

2021-09-29 22:27:22 6037 6

原创 常说的分布式系统核心理论CAP与BASE到底是什么

先不管CAP是什么,就谈谈对于一个分布式的系统,它有哪些特征或行为。(1)分布式系统会把微服务部署在多个节点上(2)每个节点都有可能存储数据,一份数据可能在多个节点上有副本(3)节点之间通过网络进行数据的同步假设有个微服务,需要部署在3个节点上,每个节点都需要存储同一份数据id,id的初始值都是1。现在对节点1写入id=2,当网络正常的情况下,节点1会向节点2与节点3进行数据同步,此时3个节点的id值都是2。不管访问哪个节点,读取的id都是一样的值。再对节点1写入id=3时.

2021-09-25 22:04:46 1511 1

原创 RabbitMQ如何在各个环节保证消息不丢失

以RabbitMq为例,消息从生产到消费,要经历三个阶段,分别是生产、队列转发与消费,每个环节都可能丢失消息。一、生产端投递到队列过程中可能丢失消息1、生产端发送消息时,由于网络闪断原因,消息未到达队列。开启队列的confirm机制,mq接收到消息后,回传ack进行确认。2、消息正确到达队列,队列也处理完毕,回传ack时由于网络闪断,生产端未收到ack。进行重试二、队列本身可能丢失消息1、队列处理消息异常mq会回传nack2、消息还没来得及刷盘,mq就宕机了,

2021-09-21 00:07:29 4385 1

原创 new一个对象的背后,竟然有这么多可以说的

作为一名java开发工程师,每天要处理上千个对象,你居然说我没对象?就算没有对象,那就new一个呗。 GirlFriend gf = new GirlFriend();不会就这么容易吧?当然不会!那么GirlFriend对象到底是怎么产生的呢?一、类加载当遇到new指令时,jvm首先去常量池寻找该类的符号应用,找不到,则执行类加载。以下是类加载各个阶段的主要任务,现在记不住也没有什么关系。1. 装载我觉得这里使用装载更好一点。第一,可以避免与类加载过.

2021-09-17 22:20:04 2986 7

原创 还不清楚JDK动态代理?从简单例子到源码再到字节码讲给你听

一、前言Spring中的AOP思想就是对代理模式的经典运用,下面先讲讲代理模式的核心思想,以静态代理为例。二、静态代理示例下面有这样一个例子,委托人在遭遇利益受损的时候,可以委托律师帮忙打官司。先定义一个描述行为的接口:package com.design.proxy.statics;public interface Action { void handle();}委托人,实现这个接口,主要的行为是寻找律师。package com.design.proxy.s

2021-09-10 00:00:45 926

原创 深度思考:老生常谈的双亲委派机制,JDBC、Tomcat是怎么反其道而行之的?

要说双亲委派机制,还得从类加载器的类型谈起一、类加载器的类型类加载器有以下种类:启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) 应用类加载器(Application ClassLoader)启动类加载器内嵌在JVM内核中的加载器,由C++语言编写(因此也不会继承ClassLoader),是类加载器层次中最顶层的加载器。用于加载java的核心类库,即加载jre/lib/rt.jar里所有的class。由于启动类加载器

2021-09-05 22:47:01 2501 9

原创 还好我接住了面试官对线程池的夺命连环问

说说线程池的类图结构说说线程池的核心参数这些核心参数位于ThreadPoolExecutor的构造方法中: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit

2021-09-02 22:45:53 2109 4

原创 我用了上万字,走了一遍Redis实现分布式锁的坎坷之路,从单机到主从再到多实例,原来会发生这么多的问题

一、分布式锁的背景在同一个jvm进程内,我们可以使用synchronized或者lock锁,来完成对共享资源的互斥访问。然而现在大多数系统都是分布式系统,jvm进程分布在不同的节点上,为了全局数据的一致性,这个时候就需要分布式锁了。实现分布式锁,有多种方案(1)借助于数据库,乐观锁使用版本号机制,悲观锁使用for update机制。(2)借助于Zookeeper,通过创建临时的顺序节点。(3)借助于Redis,这篇文章会详细说明Redis锁的演进历程。二、Redis实现分布式锁的

2021-08-29 21:59:52 2130 3

原创 SpringBoot的自动装配原理、自定义starter与spi机制,一网打尽

一、前言Spring简直是java企业级应用开发人员的春天,我们可以通过Spring提供的ioc容器,避免硬编码带来的程序过度耦合。但是,启动一个Spring应用程序也绝非易事,他需要大量且繁琐的xml配置,开发人员压根不能全身心的投入到业务中去。因此,SpringBoot诞生了,虽然本质上还是属于Spring,但是SpringBoot的优势在于以下两个特点:(1)约定大于配置SpringBoot定义了项目的基本骨架,例如各个环境的配置文件统一放到resource中,使用active来启

2021-08-24 23:51:52 9855 14

原创 ThreadLocal源码、InheritableThreadLocal与内存泄露,这一篇给你捋顺了

ThreadLocal,可以理解为线程局部变量。同一份变量在每一个线程中都保存一份副本,线程对该副本的操作对其他线程完全是不可见的,是封闭的。一、ThreadLocal简单示例public class Main { private static ThreadLocal<Integer> tl = new ThreadLocal<>(); public static void main(String[] args) { tl.set(1)

2021-08-16 23:10:49 2401 2

原创 Ribbon源码分析

Ribbon是Netflix公司开源的一个客户端负载均衡的项目,一般配合Eureka使用。不过为了降低其他干扰因素,专注于Ribbon,这一次我们脱离Eureka讲Ribbon。上一篇我们讲了RestTemplate源码分析,今天这一篇打算使用@Ribbon注解使得RestTemplate具有负载均衡的能力。一、简单的例子首先引入ribbon的依赖() <dependency> <groupId>org.springframew

2021-08-14 14:01:43 1869

原创 RestTemplate源码分析

相信RestTemplate是我们在SpringBoot中用过的最多的http客户端,今天来分析他的源码。一、最简单的用法首先需要向容器中注入RestTemplate的Bean实例@Configurationpublic class RestTemplateConfig { @Bean public RestTemplate getRestTemplate() { return new RestTemplate(); }}接着直接使用即可

2021-08-07 16:45:32 2362 4

原创 java面试高频点深入第三期

ava-core:ConcurrentHashMap;多线程:AQS;jvm:内存结构、垃圾回收算法、GC Roots有哪些、创建对象的过程、垃圾回收器;mysql:MVCC机制、事务隔离级别;redis:字符串结构、键过期与内存淘汰机制、怎么解决雪崩、穿透与击穿、为什么会那么快;Spring:Bean的生命周期——BeanFactory 简介以及它 和FactoryBean的区别、Spring家族的区别及联系、如何解决循环依赖;分布式:分布式唯一ID、一致性哈希算法;实操部分:

2021-06-08 09:42:57 919

原创 java面试高频点深入第二期

java-core:=HashMap、内存泄漏;多线程:AQS、jvm:内存结构、垃圾回收算法、GC Roots有哪些、创建对象的过程、垃圾回收器;mysql:=索引结构选型、B树与B+树;redis:字符串结构、键过期与内存淘汰机制、怎么解决雪崩、穿透与击穿、为什么会那么快;Spring:BeanFactory 简介以及它 和FactoryBean的区别、Spring家族的区别及联系、Spring中的设计模式、自动装配原理、Spring事务原理、Transaction失效原理;分布

2021-06-04 15:11:01 1002

原创 java面试高频点深入第一期

设计模式部分单例模式的7个问题https://mp.weixin.qq.com/s/BH4S7fcUTulsor4RTG5fZA

2021-05-30 21:17:44 1889

原创 面试常问集锦——Redis部分

Redis面试集锦,看完直接起飞

2021-04-01 22:43:19 301

原创 面试常问集锦——线上排查部分

实操线上故障如何快速排查?来看这套技巧大全https://mp.weixin.qq.com/s/PWNnq07cPYB4o421VFEFHwJAVA线上故障排查全家桶https://mp.weixin.qq.com/s/UTGtusIyScJGOjdZPdU4Ugcpu飚高怎么处理CPU占用100%排查过程 - 云+社区 - 腾讯云(1)top 通过top命令找到,找到最耗CPU的进行PID,从下图种可以发现PID为 15913不断按P可以按照CPU使用率进行排序(2

2021-04-01 22:40:52 2371

kq源码,java语言编写

可以查询垃圾分类、给指定qq发送垃圾分类+关键词则可以查询垃圾分类。监控群关键词,设定关键字后,加入的群里如果有人发送关键词,则会通知主qq,详细的使用方法在我的博客中有四篇博客介绍。

2020-04-22

JAVA常考点之设计模式

面试精华,总结自2018年大厂校招面经,整理出来的高质量面试高频题。

2018-11-17

java面试精华之HashMap

面试精华,总结自2018年大厂校招面经,整理出来的高质量面试高频题。

2018-11-17

java面试精华14

面试精华,总结自2018年大厂校招面经,整理出来的高质量面试高频题。

2018-11-17

java面试精华13

面试精华,总结自2018年大厂校招面经,整理出来的高质量面试高频题。

2018-11-16

java面试精华12

面试精华,总结自2018年大厂校招面经,整理出来的高质量面试高频题。

2018-11-15

java面试精华11

面试精华,总结自2018年大厂校招面经,整理出来的高质量面试高频题。

2018-11-15

java面试精华10

面试精华,总结自2018年大厂校招面经,整理出来的高质量面试高频题。

2018-11-15

java面试精华9

面试精华,总结自2018年大厂校招面经,整理出来的高质量面试高频题。

2018-11-14

java面试精华8

面试精华,总结自2018年大厂校招面经,整理出来的高质量面试高频题。

2018-11-12

java面试精华7

面试精华,总结自2018年大厂校招面经,整理出来的高质量面试高频题。

2018-11-11

java面试精华6

面试精华,总结自2018年大厂校招面经,整理出来的高质量面试高频题。

2018-11-10

java面试精华5

面试精华,总结自2018年大厂校招面经,整理出来的高质量面试高频题。

2018-11-08

java面试精华4

面试精华,总结自2018年大厂校招面经,整理出来的高质量面试高频题。

2018-11-08

java面试精华3

面试精华,总结自2018年大厂校招面经,整理出来的高质量面试高频题。

2018-11-08

java面试精华2

面试精华,总结自2018年大厂校招面经,整理出来的高质量面试高频题。

2018-11-08

JAVA面试精华1

面试精华,总结自2018年大厂校招面经,整理出来的高质量面试高频题。

2018-11-08

空空如也

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

TA关注的人

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