自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 阿里云11月12日官方故障报告来了

2023 年 11月 12 日 17:39 起,阿里云云产品控制台访问及管控 API调用出现异常、部分云产品服务访问异常,工程师排查故障原因与访问密钥服务 (AK)异常有关。访问密钥服务 (AK)在读取白名单数据时出现读取异常,因处理读取异常的代码存在逻辑缺陷,生成了一份不完整白名单,导致不在此白名单中的有效请求失败,影响云产品控制台及管控 API 服务出现异常,同时部分依赖 AK 服务的产品因不完整的白名单出现部分服务运行异常。

2023-11-16 10:52:14 230

原创 硬核剖析ThreadLocal源码,面试官看了直呼内行

工作面试中经常遇到ThreadLocal,但是很多同学并不了解ThreadLocal实现原理,到底为什么会发生内存泄漏也是一知半解?今天一灯带你深入剖析ThreadLocal源码,总结ThreadLocal使用规范,解析ThreadLocal高频面试题。1. ThreadLocal是什么ThreadLocal是线程本地变量,就是线程的私有变量,不同线程之间相互隔离,无法共享,相当于每个线程拷贝了一份变量的副本。目的就是在多线程环境中,无需加锁,也能保证数据的安全性。2. ThreadLocal的使用

2022-10-25 10:21:24 279 1

原创 我说HashMap初始容量是16,面试官让我回去等通知

众所周知HashMap是工作和面试中最常遇到的数据类型,但很多人对HashMap的知识止步于会用的程度,对它的底层实现原理一知半解,了解过很多HashMap的知识点,却都是散乱不成体系,今天一灯带你一块深入浅出的剖析HashMap底层实现原理。看下面这些面试题,你能完整的答对几道?1. HashMap底层数据结构?JDK1.7采用的是数组+链表,数组可以通过下标访问,实现快速查询,链表用来解决哈希冲突。链表的查询时间复杂度是O(n),性能较差,所以JDK1.8做了优化,引入了红黑树,查询时间复杂度是

2022-10-17 14:40:56 276

原创 MySQL查询性能优化七种武器之索引下推

前面已经讲了MySQL的其他查询性能优化方式,没看过可以去了解一下:MySQL查询性能优化七种武器之索引潜水MySQL查询性能优化七种武器之链路追踪今天要讲的是MySQL的另一种查询性能优化方式 — 索引下推(Index Condition Pushdown,简称ICP),是MySQL5.6版本增加的特性。1. 索引下推的作用主要作用有两个:减少回表查询的次数减少存储引擎和MySQL Server层的数据传输量总之就是了提升MySQL查询性能。2. 案例实践创建一张用户表,造点数据验证一

2022-09-15 17:41:30 398

原创 MySQL到底有没有解决幻读问题?这篇文章彻底给你解答

MySQL InnoDB引擎在Repeatable Read(可重复读)隔离级别下,到底有没有解决幻读的问题?网上众说纷纭,有的说解决了,有的说没解决,甚至有些大v的意见都无法达成统一。今天就深入剖析一下,彻底解决这个幻读的问题。解决幻读问题之前,先普及几个知识点。1. 并发事务产生的问题先创建一张用户表,用作数据验证:CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(1

2022-09-13 21:49:02 354

原创 三道MySQL联合索引面试题,淘汰80%的面试者,你能答对几道

众所周知MySQL联合索引遵循最左前缀匹配原则,在少数情况下也会不遵循(有兴趣,可以翻一下上篇文章)。创建联合索引的时候,建议优先把区分度高的字段放在第一列。至于怎么统计区分度,可以按照下面这种方式。创建一张测试表,用来测试:CREATE TABLE `test` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', `a` int NOT NULL, `b` int NOT NULL, `c` int NOT NULL, PRIMAR

2022-08-23 10:26:53 563

原创 学会使用MySQL的Explain执行计划,SQL性能调优从此不再困难

上篇文章讲了MySQL架构体系,了解到MySQL Server端的优化器可以生成Explain执行计划,而执行计划可以帮助我们分析SQL语句性能瓶颈,优化SQL查询逻辑,今天就一块学习Explain执行计划的具体用法。1. explain的使用使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈。在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,并不会执行这条SQL。就比如下面这个:输出这

2022-08-15 21:36:09 316 1

原创 老程序员总结的四条工作经验教训,一部血泪史,推荐观看

想来从事互联网工作已经很多年了,已经从当初的懵懂少年逐渐退化成老油条。刚毕业的时候,真是个愣头青,什么都不懂,也什么都看不惯。整天加班忙得要死,还要忍受领导批评指责。期间踩过很多坑,今天特意总结四条经验教训,送给年轻的程序员们。程序员在工作中,接需求的时候,千万不要做小需求、小优化、小迭代。你以为是偷个懒,减轻自己的工作量,其实大大加重了自己的工作量。在你做了很多个小需求之后,你就会接触到很多业务模块的人,他们的业务、产品、运营、测试、开发、用户,有问题都会直接找你,每天都会看到钉钉未读消息99+,每个人回

2022-06-29 08:00:00 382

原创 高级程序员必知必会,一文详解MySQL主从同步原理,推荐收藏

MySQL主从同步是基于Bin Log实现的,而Bin Log记录的是原始SQL语句。Bin Log共有三种日志格式,可以binlog_format配置参数指定。常见的主从同步架构有一主多从、双主多从。一般是主库负责所有读写请求,而从库只负责容灾恢复和冗余备份。如果做了读写分离的话,主库负责写请求,从库负责读请求,可以提升数据库性能。一般是主库1负责所有读写请求,主库2不对外提供服务,只用来容灾恢复。相比一主多从架构,双主多从架构可以减少宕机时间,更快恢复数据库可用状态。当主库数据发生变更时,写入本地Bi

2022-06-26 16:42:43 4725

原创 彻底搞懂三大MySQL日志,Redo Log、Undo Log、Bin Log

MySQL实现事务、崩溃恢复、集群的主从复制,底层都离不开日志,所以日志是MySQL的精华所在。只有了解MySQL日志,才算是彻底搞懂MySQL。今天一灯就带你深入浅出的学习MySQL的三大日志系统,Redo Log(重做日志)、Undo Log(恢复日志)、Bin Log(备份日志)。Redo Log 记录的是物理日志,也就是磁盘数据页的修改。作用: 用来保证服务崩溃后,仍能把事务中变更的数据持久化到磁盘上。MySQL事务中持久性就是使用Redo Log实现的。你可能会问,为什么需要写Redo Log B

2022-06-25 11:08:59 269

原创 记一次排查线上MySQL死锁过程,不能只会curd,还要知道加锁原理

昨晚我正在床上睡得着着的,突然来了一条短信。啥,线上MySQL死锁了,我赶紧登录线上系统,查看业务日志。能清楚看到是这条insert语句发生了死锁。MySQL如果检测到两个事务发生了死锁,会回滚其中一个事务,让另一个事务执行成功。很明显,我们这条insert语句被回滚了。但是我们怎么排查这个问题呢?到底跟哪条SQL产生了死锁?好在MySQL记录了最近一次的死锁日志,可以用命令行工具查看:在死锁日志中,可以清楚地看到这两条insert语句产生了死锁,最终事务2被会回滚,事务1执行成功。这两条insert

2022-06-23 21:37:18 262

原创 面试官问我一条update语句加了多少锁?我总结了全套八股文

标题:面试官问我一条updat语句加了多少锁?我总结了全套八股文面试开始,直入正题。面试官: 看你简历上面写着精通MySQL,我问你一个MySQL锁相关的问题,你看一下这条SQL会对哪些数据加锁?表结构是这样的:我: age是非唯一性索引,MySQL的锁是加在索引上面的,应该只会对age=10的数据加锁。面试官: 确定吗?我: 嗯…,应该是的。面试官: 【嘲讽】,这就是你精通MySQL的水平吗?今天面试就先到这里吧,后面有消息会主动联系你。我: 这条SQL具体对哪些数据加锁,还需要看表中有哪些数据。My

2022-06-21 23:05:24 109

原创 MySQL的锁这么多,不知从何学起,看完这篇文章就够了

MySQL有两个核心的知识点,索引和锁。前几篇文章已经详细讲解了MySQL索引实现机制,今天再一起学习一下MySQL的锁。当多个事务并发操作同一批数据的时候,如果不加锁,就无法保证事务的隔离性,最后导致数据错乱。加锁是为了保证并发操作下数据的正确性。按锁的粒度可分为:表锁、页面锁、行锁、记录锁、间隙锁、临键锁按锁的属性可分为:共享锁、排它锁按加锁机制可分为:乐观锁、悲观锁下面依次介绍一下这几种锁:MyISAM和InnoDB引擎均支持表锁。优点:开销小,加锁快,不会出现死锁。缺点:锁定力度大,发生锁冲突概率高

2022-06-18 16:24:50 216

原创 面试官问我MySQL事务的底层原理?幸亏我总结了全套八股文

面试开始,直入正题。面试官: 看你简历上面写着精通MySQL,我先问你事务的特性是什么?我: 这个我知道,事务有四大特性,分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),简称ACID。原子性是指事务中所有操作要么全部成功,要么全部失败。一致性是指事务执行前后,数据始终处于一致性状态,不会出现数据丢失。隔离性是指事务提交前的中间状态对其他事务不可见,即相互隔离。持久性是指事务提交后,数据的修改永久保存在数据库中。面试官: 嗯,

2022-06-17 11:46:00 598

原创 记一次ThreadLocal引发的线上故障,年终奖没了,可能还面临辞退

记一次惨痛的线上ThreadLocal引发的故障,3个月的年终奖没了,可能还会面临辞退。耗子逗猫 —— 没事找事前几天,在工作不太忙的时候,为了展示我在工作中积极主动,技术能力较强,并给领导留个好印象,我就去翻翻项目代码有没有可优化的空间。没想到,我真让我找着啦。祸端就此埋下了!有用户反馈查询订单列表接口有点慢,我就去打印每一步的耗时信息。发现查询订单之前,需要先根据用户ID查询用户信息,而查询用户信息接口需要调用用户团队提供的服务,有时候网络较慢的时候,耗时达到200毫秒。而查询订单接口层层调用的时候,调

2022-06-16 15:19:42 110

原创 一篇文章讲清楚MySQL的聚簇/联合/覆盖索引、回表、索引下推

面试官: 看你简历上用过MySQL,问你几个简单的问题吧。什么是聚簇索引和非聚簇索引?我: 举个例子:有这么一张用户表用户表中存储了这些数据:那么在索引中,这些数据是怎么存储的呢?MySQL的InnoDB引擎中索引使用的B+树结构。别问为什么根节点存储了(1,4)两个元素,左子节点又存储了(1,2,3)三个元素,下面带有三个叶子节点,叶子节点之间又用有序链表相连?问就是B+树的特性,不了解的可以翻一下上期的文章。如上图所示,叶子节点中存储了全部元素的索引,就是聚簇索引。一般主键索引就是聚簇索引,如果表中

2022-06-15 19:10:34 507

原创 面试官问我消息队列为啥会丢失消息?幸亏我总结了全套八股文

面试官: 我看到你的简历上写着项目中用到了消息队列,还用的是kafka,你有遇到过消息队列丢失消息的情况吗?我: [疑问] 消息队列还能丢失消息?那谁还用消息队列!你是不是搞错了?我没遇到过丢失消息的情况,也没考虑过这个问题。面试官: 嗯…,小伙子,看来有些面试套路,你还是不太懂。今天面试就先到这里吧!给你的简历,我送你下楼。我: 消息队列发送消息和消费消息的过程,共分为三段,生产过程、服务端持久化过程、消费过程,如下图所示。这三个过程都有可能弄丢消息。面试官: 嗯,消息丢失的具体原因是...

2022-06-14 13:03:24 206

原创 面试官:高并发场景下,你们是怎么保证数据的一致性的?

面试的时候,总会遇到这么一个场景。面试官:你们的服务的QPS是多少?我:我们的服务高峰期访问量还挺大的,大约是3万吧。面试官:这么大的访问量,你们的服务器能撑住吗?有加缓存吗?我:有的,我们使用了Redis做缓存,接口优先查询缓存,缓存不存在,才访问数据库。这样可以减少数据库访问压力,加快查询效率。面试官:一份数据存储在两个地方,更新数据的时候,你们是怎么保证数据的一致性的?看到了吧,好的面试官一般不直接问你数据一致性的解决方案,而是循循善诱,结合具体的使用场景,再问你解决方法。如果你没做过这方面,没有线上

2022-06-13 19:33:06 189

原创 面试官问我消息队列为啥会丢失消息?幸亏我总结了全套八股文

面试开始,直入正题。面试官: 我看到你的简历上写着项目中用到了消息队列,还用的是kafka,你有遇到过消息队列丢失消息的情况吗?我: [疑问] 消息队列还能丢失消息?那谁还用消息队列!你是不是搞错了?我没遇到过丢失消息的情况,也没考虑过这个问题。面试官: 嗯…,小伙子,看来有些面试套路,你还是不太懂。今天面试就先到这里吧!给你的简历,我送你下楼。我: 消息队列发送消息和消费消息的过程,共分为三段,生产过程、服务端持久化过程、消费过程,如下图所示。这三个过程都有可能弄丢消息。面试官: 嗯,消息丢失的具体原因是

2022-06-12 11:13:12 183

原创 面试官问我MySQL索引为啥用B+树?我让他去问作者

面试开始,直入正题。面试官: 你知道MySQL索引底层数据结构为啥用B+树?而不用B树、红黑树或者普通二叉树?我: 这事谁知道作者咋想的?他可能是用B+树习惯了,个人爱好吧。面试官: 你倒是挺看得开。今天的面试就先到这吧,后面有消息会主动联系你。我: 要知道MySQL索引底层数据结构为啥用B+树,先要了解一下什么样的数据结构更适合建索引。为了保证数据安全性,一般都是把数据存储在磁盘里面。当我们需要查询数据的时候,需要读取磁盘,就产生了磁盘IO,相比较内存操作,磁盘IO读取速度是非常慢的。由于所需数据可能在磁

2022-06-11 15:15:45 196

原创 面试官问我订单ID是怎么生成的?难道不是MySQL自增主键?

程序媛本就稀有,美女面试官更是难寻。具体长什么样呢?就像下面这样:这么温柔可爱的面试官,应该不会为难我吧。嗯,应该是的,毕竟我这么帅气,面试可能就是走个过场。美女面试官是不是单身?毕竟程序员都不善交流,因为我也是单身,难道我的姻缘就在此注定。孩子的名字我都想好了。一冰!好名字。面试官: 小伙子,你低着头笑什么呐。开始面试了,你知道订单ID是怎么生成的吗?我: 还能咋生成?用数据库主键自增呗。面试官: 这样不行啊。数据库主键顺序自增,每天有多少订单量被竞争对手看的一清二楚,商业机密都暴露了。况且单机MySQ

2022-06-10 14:21:27 1339

原创 面试官问我怎么实现分布式锁?幸亏我总结了全套八股文

面试开始, 直入正题。面试官: 你有没有参与过秒杀系统的设计?我: 没有,我平时都是开发后台管理系统、OA办公系统、内部管理系统,从来没有开发过秒杀系统。面试官: 嗯…,小伙子很实诚。今天就先到这里吧,后面有消息会主动联系你。我: 参与过秒杀系统,并独立负责过秒杀系统的架构设计(【狗头】是的,都是我设计的)。面试官: 这样才对,这样我才能接着往下问。你在设计秒杀系统的时候,怎么防止商品超卖?比如活动中只有一台iPhone,最终卖出100台,肯定不行,平台要亏钱。我: 肯定要加锁,不过由于秒杀系统请求量较大,

2022-06-09 10:07:07 186

原创 面试官问我怎么分库分表?幸亏我总结了一套八股文

面试开始,直入正题。面试官:小伙子,看到你的简历上面写了项目中有对MySQL进行分库分表,为什么要进行分库分表?我:不知道啊!谁知道老大咋想的,反正我来的时候就已经分好了。面试官:嗯…,今天的面试就先到这吧,有后续面试会通知你,我送你下去。我:当MySQL单表数据量过大,比如超过5千万条的时候,读写性能变得很差。而且常规的优化手段已经不起作用了,比如:SQL调优、添加索引、主从复制、读写分离。这时候就需要用到MySQL终极优化方案 — 分库分表。面试官:不错,我该怎么判断项目是需要分库还是要分表?是先分库还

2022-06-08 22:19:02 411

原创 装上这几个Intellij idea插件,保证让你爱上写代码

程序员都知道写代码是一件低调又枯燥的事情,一天到晚盯着电脑屏幕看。怎么能让写代码变成一件酷炫的事情,那就从装扮编辑器开始。安装了这些插件,保证同事看到后,都会问你。兄弟,你安装了什么插件,让我也装一下。Idea编辑器的界面灰蒙蒙的,有点性冷淡的风格,看多了人都有点抑郁。像下面这样:装上Vuesion Theme插件,界面顿时艳丽许多,人也跟着精神了。装上Atom Material ICons插件之后,这图标也太漂亮了吧!也太丰富了吧!简直不敢相信,连不同功能的文件夹都用不同的图标标识出来,顿时高大上了有没

2022-06-08 22:13:46 353

原创 面试官问我为啥要用MQ,幸亏总结全套八股文

互联网公司的项目没有不用到MQ(消息队列)的,在简历中写上项目中用到MQ,也算是亮点之一。既然你写了,面试官就会问,你对MQ到底了解多少?面试官: 小伙子,我看你简历上写了,在项目中用到了MQ,你们项目为什么要引入MQ?其实这道题就是让你回答MQ的作用是什么?MQ的作用就三个:解耦、异步、削峰。 如果你直接回答这三个作用,会给面试官一种死记硬背的嫌疑,所以要结合实际项目具体分析。面试官你好,我们公司是做电商系统的。核心是交易服务,交易服务要调用另外三个服务,订单服务、库存服务、仓储服务。这三个服务如果有一

2022-06-08 22:09:17 186

原创 Java8已经发布7年了,不会还有人没用过CompletableFuture吧

日常开发中,我们都会用到线程池,一般会用execute()和submit()方法提交任务。但是当你用过CompletableFuture之后,就会发现以前的线程池处理任务有多难用,功能有多简陋,CompletableFuture又是多么简洁优雅。要知道CompletableFuture已经随着Java8发布7年了,还没有过它就有点说不过去了。今天5分钟带你深入浅出CompletableFuture实用教程。输出结果:一般大家都会这样使用线程池,但是有没有思考过这样使用有没有什么问题?反正我发现两个比

2022-06-08 21:59:31 107

原创 阿里面试官:如何实现三个线程交替循环打印?

问题:如何实现三个线程交替循环打印?示例:线程1打印A,线程2打印B,线程3打印C,要求交替打印,并且可以循环打印。输出结果类似:ABCABCABC这道题的难度是五颗星,在面试中也会经常遇到,如果是第一次见到这道题,很难在短时间内想出合理的解决方案。如果只要求交替打印一次的话,实现比较简单,可以用Thread.join()方法,一个线程等待另一个线程执行完成。现在要求循环打印,就涉及线程间通信,必须要用到锁,一把锁肯定不够。例如线程1释放锁之后,线程2和线程3都可能获取到锁,是随机的,现在要求必须是线

2022-06-08 21:56:22 821

原创 非常好用统计接口耗时小工具,Java程序员强烈推荐

我们经常需要统计一个方法的耗时,一般我们会这样做:这样做虽然简单直接,当我们需要分段统计耗时的时候,一不留神就找不到开始时间在哪了。而且也不能汇总结果,不能直观的看到每一步的耗时。有一个简单的小工具,可以帮助我们非常容易的统计方法耗时。名字叫StopWatch,在常见的类库,例如Spring、Apache Commons、Google Guava都有这个工具,功能和实现都是大同小异,推荐使用Spring里的,可以更方便统计耗时的汇总结果。把耗时代码换成StopWatch试一下:输出结果是:只统计了一个

2022-06-08 21:55:11 2852

原创 面试官:你能写个LRU缓存吗?

面试官: 你能手写个LRU缓存吗?你: LRU是什么东西?(一脸懵逼状)面试官: LRU全称Least Recently Used(最近最少使用),用来淘汰不常用数据,保留热点数据。面试官: 今天的面试先到这吧,有其他面试我们会再联系你。别担心,再有人问你LRU,就把这篇文章丢给他,保证当场发offer。目的是把最不常用的数据淘汰掉,所以需要记录一下每个元素的访问次数。最简单的方法就是把所有元素按使用情况排序,最近使用的,移到末尾。缓存满了,就从头部删除。常用的数据结构有数组、链表、栈、队列,考

2022-06-08 21:52:54 126

原创 Java线上惨痛踩坑记录,你也一定遇到过

线上问题年年有,今年特别多。记几次线上惨痛的踩坑记录,希望大家以史为鉴。如果调用上面的方法会发生什么?id是Integer类型,而方法的返回值int类型,会自动拆箱转换,由于id是null,转换成int类型的时候,就会报NullPointerException异常。无论是《阿里Java开发手册》、《代码整洁之道》还是《Effective Java》都建议方法返回值类型尽量写成包装类型,类似Integer。还有实体类、接收前端传参类、给前端的响应类中的属性都要写成包装类型,避免拆箱出错。先看一段代码运行结果

2022-06-08 21:49:25 90

原创 你不知道的Java工具类库,十倍提升开发效率

工作很多年后,才发现有很多工具类库,可以大大简化代码量,提升开发效率,初级开发者却不知道。而这些类库早就成为了业界标准类库,大公司的内部也都在使用,如果刚工作的时候就有人告诉我使用这些工具类库,该多好!一块看一下有哪些工具类库你也用过。1.2 比较两个字符串是否相等,忽略大小写1.3 比较两个对象是否相等当我们用equals比较两个对象是否相等的时候,还需要对左边的对象进行判空,不然可能会报空指针异常,我们可以用java.util包下Objects封装好的比较是否相等的方法源码是这样的1.4 两

2022-06-08 21:45:37 217

原创 Java程序员怎么避免空指针异常?看完这篇文章再也不用担心了

Java程序员工作中遇到最多的错误就是空指针异常,无论你多么细心,一不留神就从代码的某个地方冒出NullPointerException,真是令人头疼。到底怎么避免空指针异常?看完这篇文章,可以帮助你。2. 字符串比较,常量放前面3. 方法返回空集合4. 转String,用valueOf()方法代替toString()valueOf()方法源码是:5. 判空,用工具库apache commons是最强大的,也是使用最广泛的工具类库,用它就行了。6. 用注解帮你检查7. 避免不必要的拆

2022-06-08 21:37:40 3237

原创 一文详解LinkedList源码

上篇文章和一块学习了ArrayList源码,本文再和大家一块学习一下LinkedList源码。LinkedList底层是基于双链表,实现了List和Deque接口,所以既有List增删查改的功能,又有Deque的头尾操作的功能,在队列源码中杯经常使用。先看一下LinkedList的常用方法。...

2022-06-06 16:46:59 332

原创 一文详解ArrayList源码

ArrayList是我们开发中最常用到的集合,但是很多人对它的源码并不了解,导致面试时,面试官问的稍微深入的问题,就无法作答,今天我们一起来探究一下ArrayList源码。

2022-06-06 16:43:33 111

原创 HashMap的高阶用法,开发效率提升10倍

HashMap在工作中使用非常频繁,其实在JDK1.8的时候新增一些更高阶的用法,熟练使用这些方法可以大大提升开发效率,写出更简洁优美的代码。

2022-06-06 16:40:17 252

空空如也

空空如也

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

TA关注的人

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