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

原创 我这半年到底干了啥(附多家详细面经)
有现实中的小伙伴问我,我这半年到底干了啥。怎么博客突然不更新了?最近的一次更新还是在去年12月其实这半年嘛,一直在为面试做准备。算法一直是我的弱项,于是突击了力扣。开了会员,刷了将近700道,有的高频题目都刷了第二遍。我将每次的刷题记录同步到了github中,有需要的可以移步SunAlwaysOnline。下面是我的提交记录还是那句话,如果你想进大厂,算法是必须要过关的。面试前,我也整理了高频的知(ba)识(gu)点(wen),将会陆续发出来,小伙伴们不要着急哈。..
2021-08-01 23:47:38
8277
20
原创 面试常问集锦——分布式系列
到底啥是分布式系统开发经验?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
2490
原创 java面试高频点深入第四期
第一期内容第二期内容第三期内容mysql:如何解决幻读、锁的分类、主从复制、分库分表;redis:主从复制、热key、大key;框架:MyBatis一二级缓存、只有接口没有实现类怎么实现查询、MyBatis插件原理;分布式部分:接口幂等性、限流算法、降级与熔断;实操部分:排查慢sql;设计模式部分:原型模式、责任链模式、组合与聚合的区别;mq部分:保证消息不丢失、处理重复消息、消息有序性、消息堆积处理、mq宕机怎么保证数据不丢失、消息队列选型;linux.
2022-02-17 14:16:39
1742
1
原创 从Curator实现分布式锁的源码再到羊群效应
本文从源码角度讲解了使用Curator获取分布式锁的流程,接着从等待锁的演化过程角度出发,分析了Zookeeper在分布式锁场景下避免羊群效应的解决方案。
2022-01-02 23:02:07
2139
1
原创 Redis哨兵机制原理浅析
一、前言上一篇文章Redis主从复制原理中简要地说明了主从复制的一个基本原理,包含全量复制、复制积压缓冲区与增量复制等内容,有兴趣的同学可以先看下。利用主从复制,可以实现读写分离、数据备份等功能。但如果主库宕机后,需要运维人员手动地将一个从库提升为新主库,并将其他从库slaveof新主库,以此来实现故障恢复。因此,主从模式的一个缺点,就在于无法实现自动化地故障恢复。Redis后来引入了哨兵机制,哨兵机制大大提升了系统的高可用性。二、什么是哨兵哨兵,就是站岗放哨的,时刻监控周围的一举一动
2021-12-30 23:32:23
2759
6
原创 面试官:能给我画个Zookeeper选举的图吗?
Zookeeper是一个分布式协调框架,提供分布式锁、配置项管理、服务注册与集群管理等功能。为了保证Zookeeper的高可用,一般都会以集群的模式部署。这个时候需要考虑各个节点的数据一致性,那么集群在启动时,需要先选举出一位Leader,再由Leader完成向其他节点的数据同步工作。本文将是Zookeeper系列的第一篇文章,从源码角度讲述Zookeeper的选举算法。
2021-12-26 17:19:48
2093
2
原创 简单谈谈MySQL的两阶段提交
一、简单回顾三种日志在讲解两阶段提交之前,需要对MySQL中的三种日志即binlog、redo log与undo log有一定的了解。在这三种日志中,很多同学会把binlog与redo log混淆,下面使用一张表格来简单对比下两者的区别。...
2021-12-21 22:36:11
15396
17
原创 Redisson可重入与锁续期源码分析
Redisson是一个可以在java项目中使用的Redis客户端,其屏蔽了原子性、可重入、锁续期的诸多细节,内部实现各种各样的锁。例如可重入锁、公平锁、MultiLock与Red Lock与读写锁等,今天主要分析可重入锁与锁续期的源码。
2021-12-18 00:42:03
3061
4
原创 面试官:说说你了解几种限流算法,手写个demo?
在流量突增的场景下,为了保证后端服务在整体上一个稳定性,我们需要对请求进行限流,来避免系统崩溃。不过限流会对少部分用户的请求直接进行拒绝或者延迟处理,影响这些用户的体验。本文会介绍一些常见的限流算法,并在最后附上对分布式限流的一些思考。
2021-12-05 22:55:58
11067
13
原创 从源码中窥探出事务失效的8种原因
核心流程解读我们从一段简单的代码入手,从头到尾分析以下其中的奥秘。如果在一个controller中调用service方法,该方法被@Transaction注解修饰。controller方法: @GetMapping("/save") public String saveStudent() { testService.save(); return "success"; }service方法: @Transactional
2021-11-30 23:45:47
1686
原创 8种方案,保证缓存和数据库的最终一致性
我们通常使用缓存机制来提升系统的性能,缓存系统下的读写操作,一般都需要操作数据库与缓存。对于读操作,一般是先查询缓存,查询不到再查询数据库,最后回写进缓存。而对于写操作,究竟是先删除(更新)缓存,再更新数据库,还是先更新数据库,再删除(更新)缓存呢?由于对数据库以及缓存的整体操作,并不是原子性的,再加上读写并发,究竟什么样的方案可以保证数据库与缓存的一致性呢?下面介绍8种方案,配合读写时序图,希望你能从其中了解到保证一致性的设计要点。
2021-11-25 23:42:24
12672
6
原创 探究MySQL的索引结构选型
本文将探究MySQL索引结构的技术选型,分析哈希表、二叉搜索树、AVL树、红黑树、B树与B+树各自的优缺点。解释了MySQL最终选择B+树作为其索引的组织方式的原因,并在最后增加了3道常问的面试题。
2021-11-20 14:15:15
5370
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
3033
2
原创 一次因线程池使用不当造成生产事故的排查记录与思考
某日当我点开熟悉的界面,一个又一个请求失败的提示赫然出现在屏幕上,不会是昨晚上线的代码有问题吧?吓得我急忙按F12查看了响应——"exception":"java.lang.OutOfMemoryError","message":"unable to create new native thread"出现了内存溢出的情况,无法创建更多的本地线程。接着查看了实例的监控大盘,发现每个实例的JVM线程数量都处于9000+的规模,且还有上涨的趋势。这是其中一个实例的线程数量监控图:10.
2021-11-09 23:51:03
4260
7
原创 Redis主从复制原理
单机Redis面临的问题单机Redis在发生故障时,由于无法做到故障转移,所以接下来的请求将会直接打到数据库。大量的查询使得数据库连接数达到峰值,且内部锁冲突严重,造成慢查询、连接超时等后果。所以这个时候,我们想着能不能将Redis数据以多副本的形式保存在多台Redis上,当发生故障时,快速地手动去切换连接的Redis?当然,Redis本身也提供了这个功能。主从模式能将Master节点的数据冗余到多台Slave上,配合哨兵模式能够快速感知Master宕机从而进行主从切换实现故障转移。
2021-11-04 21:09:41
1276
2
原创 22张图,带你入门分布式一致性算法Raft
Raft节点的角色划分与任期在Raft中,有以下三种角色:Follower 跟随者所有节点的初始状态,内部都会有一个超时时间。对于每一个Follower,其超时时间是随机的。这个超时时间,规定了在倒计时结束后仍然收不到Leader的心跳,Follower就会转变为Candidate。为什么每个Follower的超时时间是随机的,改成一样的可以吗?不可以,相同的超时时间会造成多个Follower同时转变为Candidate,选票被瓜分,导致获取不到半数以上的选票,就需要进行新一轮的选举
2021-10-30 22:31:17
3237
4
原创 通俗易懂的MySQL事务及MVCC原理,我先收藏了!
一、事务简介与四大特性事务指的是一组命令操作,在执行的过程中,要么全部成功,要么全部失败。由引擎层支持事务,MyISAM就不支持事务,而InnoDB是支持事务的。事务具有以下四大特性(ACID):原子性(Atomicity):指事务不可分割,要么全部成功,要么全部失败,不可能存在部分成功或部分失败的情况。如果执行某一条语句失败后,将会触发之前所有执行过的语句的回滚,因此靠的是undo log。 一致性(Consistency):在事务执行前后,数据的完整性没有遭到破坏。一致性是mysql追
2021-10-25 23:30:00
16279
16
原创 9张图,带你了解一致性哈希原理
假设我们现在做一个简单的文件缓存服务,由于文件数过多,我们先使用3台机器用来存储文件。为了由文件名(假设文件名称不重复)能得到存储的机器,考虑先对文件名做hash运算,接着对3取余,得到的余数即为所在机器的编号。这套系统运行了很久,后来文件数量慢慢增多,3台机器存不下了,现在我们考虑扩充到4台。这个时候,我们的算法更新为hash(文件名)%5。那么使用该算法获取abc.txt文件所在的缓存机器时,在其hash值为10的时候,将会映射到0号机器上,而之前是存储在1号机器上的,这个时候就会重
2021-10-21 22:55:56
2612
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
4282
7
原创 谈谈Redis的持久化——AOF日志与RDB快照
一、前言对于Mysql,数据是持久化在磁盘上的。如果误删数据,可以使用binlog进行恢复;突然宕机时,其本身可以借助redo log进行崩溃恢复。更多关于Mysql日志的内容,可以参考我的另外一篇文章数据库日志——binlog、redo log、undo log扫盲而对于Redis,一般是把数据直接存储在内存中。如果不做任何持久化工作,在出现宕机后,内存中的全部数据就会丢失。显然,业务方是不能容忍这样的情况发生的。好在Redis提供了一系列的持久化机制,分别是AOF日志与RDB快照。二
2021-10-11 23:17:17
1722
原创 单例模式的6大种类,如何保证线程安全、反射安全以及序列化安全,这次终于通透了
单例模式在日常的开发过程中,我们需要使用到设计模式,而单例模式可谓是最常见的一种。正确的使用单例模式,不仅可以降低内存的使用率,也可以提升整个程序的运行效率。下面我来谈谈自己对单例模式的理解。【1】懒汉式特点:(1)是一种牺牲时间换取空间的策略(2)懒加载,只在需要的时候才实例化对象public class Singleton { private static Singlet...
2021-10-06 17:25:58
2627
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
3901
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
7239
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
1674
1
原创 RabbitMQ如何在各个环节保证消息不丢失
以RabbitMq为例,消息从生产到消费,要经历三个阶段,分别是生产、队列转发与消费,每个环节都可能丢失消息。一、生产端投递到队列过程中可能丢失消息1、生产端发送消息时,由于网络闪断原因,消息未到达队列。开启队列的confirm机制,mq接收到消息后,回传ack进行确认。2、消息正确到达队列,队列也处理完毕,回传ack时由于网络闪断,生产端未收到ack。进行重试二、队列本身可能丢失消息1、队列处理消息异常mq会回传nack2、消息还没来得及刷盘,mq就宕机了,
2021-09-21 00:07:29
5860
1
原创 new一个对象的背后,竟然有这么多可以说的
作为一名java开发工程师,每天要处理上千个对象,你居然说我没对象?就算没有对象,那就new一个呗。 GirlFriend gf = new GirlFriend();不会就这么容易吧?当然不会!那么GirlFriend对象到底是怎么产生的呢?一、类加载当遇到new指令时,jvm首先去常量池寻找该类的符号应用,找不到,则执行类加载。以下是类加载各个阶段的主要任务,现在记不住也没有什么关系。1. 装载我觉得这里使用装载更好一点。第一,可以避免与类加载过.
2021-09-17 22:20:04
3273
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
1008
原创 深度思考:老生常谈的双亲委派机制,JDBC、Tomcat是怎么反其道而行之的?
要说双亲委派机制,还得从类加载器的类型谈起一、类加载器的类型类加载器有以下种类:启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) 应用类加载器(Application ClassLoader)启动类加载器内嵌在JVM内核中的加载器,由C++语言编写(因此也不会继承ClassLoader),是类加载器层次中最顶层的加载器。用于加载java的核心类库,即加载jre/lib/rt.jar里所有的class。由于启动类加载器
2021-09-05 22:47:01
2979
9
原创 还好我接住了面试官对线程池的夺命连环问
说说线程池的类图结构说说线程池的核心参数这些核心参数位于ThreadPoolExecutor的构造方法中: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit
2021-09-02 22:45:53
2273
4
原创 我用了上万字,走了一遍Redis实现分布式锁的坎坷之路,从单机到主从再到多实例,原来会发生这么多的问题
一、分布式锁的背景在同一个jvm进程内,我们可以使用synchronized或者lock锁,来完成对共享资源的互斥访问。然而现在大多数系统都是分布式系统,jvm进程分布在不同的节点上,为了全局数据的一致性,这个时候就需要分布式锁了。实现分布式锁,有多种方案(1)借助于数据库,乐观锁使用版本号机制,悲观锁使用for update机制。(2)借助于Zookeeper,通过创建临时的顺序节点。(3)借助于Redis,这篇文章会详细说明Redis锁的演进历程。二、Redis实现分布式锁的
2021-08-29 21:59:52
2232
3
原创 SpringBoot的自动装配原理、自定义starter与spi机制,一网打尽
一、前言Spring简直是java企业级应用开发人员的春天,我们可以通过Spring提供的ioc容器,避免硬编码带来的程序过度耦合。但是,启动一个Spring应用程序也绝非易事,他需要大量且繁琐的xml配置,开发人员压根不能全身心的投入到业务中去。因此,SpringBoot诞生了,虽然本质上还是属于Spring,但是SpringBoot的优势在于以下两个特点:(1)约定大于配置SpringBoot定义了项目的基本骨架,例如各个环境的配置文件统一放到resource中,使用active来启
2021-08-24 23:51:52
10630
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
2573
2
原创 Ribbon源码分析
Ribbon是Netflix公司开源的一个客户端负载均衡的项目,一般配合Eureka使用。不过为了降低其他干扰因素,专注于Ribbon,这一次我们脱离Eureka讲Ribbon。上一篇我们讲了RestTemplate源码分析,今天这一篇打算使用@Ribbon注解使得RestTemplate具有负载均衡的能力。一、简单的例子首先引入ribbon的依赖() <dependency> <groupId>org.springframew
2021-08-14 14:01:43
1983
原创 RestTemplate源码分析
相信RestTemplate是我们在SpringBoot中用过的最多的http客户端,今天来分析他的源码。一、最简单的用法首先需要向容器中注入RestTemplate的Bean实例@Configurationpublic class RestTemplateConfig { @Bean public RestTemplate getRestTemplate() { return new RestTemplate(); }}接着直接使用即可
2021-08-07 16:45:32
2632
4
原创 java面试高频点深入第三期
ava-core:ConcurrentHashMap;多线程:AQS;jvm:内存结构、垃圾回收算法、GC Roots有哪些、创建对象的过程、垃圾回收器;mysql:MVCC机制、事务隔离级别;redis:字符串结构、键过期与内存淘汰机制、怎么解决雪崩、穿透与击穿、为什么会那么快;Spring:Bean的生命周期——BeanFactory 简介以及它 和FactoryBean的区别、Spring家族的区别及联系、如何解决循环依赖;分布式:分布式唯一ID、一致性哈希算法;实操部分:
2021-06-08 09:42:57
1120
原创 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
1294
原创 java面试高频点深入第一期
设计模式部分单例模式的7个问题https://mp.weixin.qq.com/s/BH4S7fcUTulsor4RTG5fZA
2021-05-30 21:17:44
2050
1
原创 面试常问集锦——线上排查部分
实操线上故障如何快速排查?来看这套技巧大全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
2740
kq源码,java语言编写
2020-04-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人