Java识堂
这个作者很懒,什么都没留下…
展开
-
面试官:如何保证缓存和数据库的一致性?
针对这种不一致的情况,我们可以对更新数据库和缓存的操作加一个分布式锁,这样就能保证数据的一致性。基于内存缓存利用率的角度,我们一般不会采用同步更新的操作,因为有可能更新完的缓存并不一定会马上读取,导致缓存中缓存了大量无用的数据,降低缓存命中率。为了保证缓存和数据库的实时一致,我们不能用定时任务来更新缓存,我们要同时更新数据库和缓存,对应的方案有如下两种。从上图看,还是会存在数据不一致的情况,但是在实际中这个问题出现的概率并不高,因为要满足如下3个条件。除了并发的情况,我们还需要考虑异常的情况。原创 2024-03-09 21:46:55 · 307 阅读 · 0 评论 -
面试官:怎么解决MySQL死锁问题?
mysql中的行锁在分析死锁之前,我们先来回忆一下MySQL中的行锁。MySQL有如下三种类型的行锁,本节只简单介绍一下,想深入了解看我的其他文章Record Lock:对单个记录加锁Gap Lock:锁住记录前面的间隙,不允许插入记录Next-key Lock:同时锁住数据和数据前面的间隙,即数据和数据前面的间隙都不允许插入记录如何排查死锁?发生死锁的条件互斥,共享资源X和Y只能被一个线程占用占有且等待,线程T1已经取得共享资源X,在等待共享资源Y的时候,不释放共享资源X不可抢.原创 2022-03-12 17:34:26 · 4111 阅读 · 0 评论 -
面试官:说说常用的排序算法呗
十大排序算法思路汇总在面试的过程中经常会遇到手写排序算法,所以本文就简单总结一下。不对算法的细节做介绍,只做一个概括性的描述。交换类:通过元素之间的两两交换来实现排序插入类:将数分为2部分,依次将无序的数插入到有序的数列中选择类:从待排序数列中找到最小值或者最大值元素,放到已拍好序的序列后面计数排序和基数排序可以认为是桶排序的一种特殊实现,都不是通过元素之间的比较来实现排序的冒泡排序冒泡排序,从头开始,依次比较数组中相邻的2个元素,如果后面的数比前面的数大,则交换2个数,否则不交换。每进行.原创 2021-11-07 21:16:50 · 2304 阅读 · 2 评论 -
面试官:生产环境发生问题,你一般怎么排查?(网络篇)
网络篇计算机网络的性能指标常用数据量单位一个比特就是二进制数据中的一个1或01Byte = 8 bitKB = 210BMB = KKB = 220BGB = KMB = 230BTB = K*GB = 240B常用速率单位kb/s = 103b/s (bps) (一秒传输1000个比特)Mb/s = kkb/s = 106b/s (bps)Gb/s = kMb/s = 109b/s (bps)Tb/s = k*Gb/s = 1012b/s (bps)有一个待发送的数据块,大小.原创 2021-10-17 20:52:57 · 1665 阅读 · 0 评论 -
面试官:生产环境发生问题,你一般怎么排查?(Linux工具篇)
CPU篇平均负载本篇文章是我看了极客时间《Linux性能优化实战》专栏做的一个总结当系统变慢时,我们经常用uptime或者top命令来查看系统的负载情况,如下命令所示[root@VM-0-14-centos ~]# uptime 15:30:04 up 108 days, 23:29, 1 user, load average: 0.07, 0.05, 0.05值含义15:30:04当前时间up 108 days, 23:29系统运行时间1 user.原创 2021-10-13 10:01:05 · 2265 阅读 · 0 评论 -
面试官:生产环境发生问题,你一般怎么排查?(JVM命令行监控工具篇)
介绍在生产环境中,经常会遇到各种各样奇葩的性能问题,所以掌握最基本的JVM命令行监控工具还是很有必要的名称主要作用jps查看正在运行的Java进程jstack打印线程快照jmap导出堆内存映像文件jstat用于收集HotSpot虚拟机各方面的运行数据jinfo显示虚拟机配置信息jhat用于分析heapdump文件,用Eclipse Memory Analyzer替代即可jps:查看正在运行的Java进程jps可以列出正在运行的Jav.原创 2019-02-06 22:34:42 · 2266 阅读 · 0 评论 -
面试官:分布式ID的生成策略有哪些?
介绍在很多业务系统中,我们经常会遇到生成全局唯一的分布式ID的需求,如IM系统,订单系统等。那么生成全局唯一的分布式ID的方法有哪些呢?UUID// 3eece1c6-5b57-4bce-a306-6c49e44a1f90UUID.randomUUID().toString()本地生成,生成速度快,但识别性差,没有顺序性可以用来标识图片等,不能用作数据库主键数据库自增主键我们原来刚开始做IM系统的时候就单独建了一个表来获取自增id作为消息的ID,单独开一张表来获取自增id也不会影响对消息.原创 2021-09-19 16:02:48 · 564 阅读 · 0 评论 -
面试官:从浏览器输入URL到页面展示出来,中间发生了什么?
前言这应该算是一个很经典的面试题了,前端工程师,后端工程师,包括网络工程师都有可能被问到。开放度很高,每个人都可以针对自己熟悉的部分,进行深入的讲解。总体来说,分为如下几个部分1.DNS解析2.建立TCP连接,发送HTTP请求3.服务端处理请求并返回HTTP响应4.浏览器解析渲染页面5.关闭连接DNS解析DNS解析就是获取服务器IP地址的过程。互联网上每一台计算机的唯一标识是它的IP地址,但是IP地址并不方便记忆。用户更喜欢用方便记忆的网址去寻找互联网上的其它计算机,例如www.baid.原创 2019-09-08 11:29:36 · 3455 阅读 · 1 评论 -
面试官:MySQL事务的隔离性是如何实现的?
并发场景最近做了一些分布式事务的项目,对事务的隔离性有了更深的认识,后续写文章聊分布式事务。今天就复盘一下单机事务的隔离性是如何实现的?隔离的本质就是控制并发,如果SQL语句就是串行执行的。那么数据库的四大特性中就不会有隔离性这个概念了,也就不会有脏读,不可重复读,幻读等各种问题了对数据库的各种并发操作,只有如下四种,写写,读读,读写和写读写-写事务A更新一条记录的时候,事务B能同时更新同一条记录吗?答案肯定是不能的,不然就会造成脏写问题,那如何避免脏写呢?答案就是加锁读-读MySQL读操.原创 2021-09-04 12:02:47 · 2088 阅读 · 8 评论 -
面试官:说一下类加载的过程
加载当我们要使用一个类的时候,要通过ClassLoader将类加载到内存中类加载阶段主要完成如下三件事情通过全类名,获取类的二进制流解析类的二进制流为方法区内的数据结构创建一个java.lang.Class类的实例,表示该类型,作为方法区这个类的访问入口通过全类名,获取类的二进制流的方式有很多种从zip压缩包中获取从网络中获取运行时计算生成,如动态代理技术…对于非数组类型的加载阶段,即可以使用Java虚拟机内置的类加载器去完成,也可以使用用户自定义的类加载器去完成链接链接.原创 2021-07-22 15:08:01 · 3868 阅读 · 11 评论 -
面试官:RocketMQ如何保证消息的可靠性投递?
介绍要想保证消息的可靠型投递,无非保证如下3个阶段的正常执行即可。生产者将消息成功投递到brokerbroker将投递过程的消息持久化下来消费者能从broker消费到消息发送端消息重试producer向broker发送消息后,没有收到broker的ack时,rocketmq会自动重试。重试的次数可以设置,默认为2次DefaultMQProducer producer = new DefaultMQProducer(RPODUCER_GROUP_NAME);// 同步发送设置重试次数为.原创 2021-04-23 00:08:50 · 1613 阅读 · 2 评论 -
面试官:Spring声明式事务在那些情况下会失效?
编程式事务在Spring中事务管理的方式有两种,编程式事务和声明式事务。先详细介绍一下两种事务的实现方式配置类@Configuration@EnableTransactionManagement@ComponentScan("com.javashitang")public class AppConfig { @Bean public DruidDataSource dataSource() { DruidDataSource ds = new DruidDat.原创 2021-04-11 19:14:31 · 1589 阅读 · 3 评论 -
面试官:BeanFactory和FactoryBean有哪些区别?
区别说实话,他俩初了名字比较像以外,好像没有其他共同点了。BeanFactory和FactoryBean有哪些区别?BeanFactory是一个最基础的IOC容器,提供了依赖查找,依赖注入等基础的功能FactoryBean是创建Bean的一种方式,帮助实现复杂Bean的创建和BeanFactory相关的还有一个高频的面试题ApplicationContext和BeanFactory有哪些区别?BeanFactory是一个最基础的IOC容器,提供了依赖查找,依赖注入等基础的功能Appl.原创 2021-04-07 11:40:03 · 787 阅读 · 1 评论 -
面试官:@Resource和@Autowired有啥区别?
自动绑定(Autowiring)模式模式说明no默认值,未激活 Autowiring,需要手动执行依赖注入对象byName根据被注入属性的名称作为Bean名称进行依赖查找,并将对象设置到该属性byType根据被注入属性的类型作为依赖类型进行查找,并将对象设置到该属性constructor特殊的byType类型,用户构造器参数@Autowired是Spring中的注解,@Resource是JSR-250中提供的注解,即Java提供的注解,从包名就可以看出.原创 2021-03-31 17:48:43 · 855 阅读 · 0 评论 -
面试官:说一下Spring Boot的启动过程把!
介绍Spring Boot相对于Spring在启动流程上来说并没有太大的区别,只是借助于SpringApplication将启动过程模版化了,并在其中增加了批量注册,自动装配的功能,并开放了一系列的扩展点对了还有一个重要的区别,原来基于servlet的web应用,是由servlet容器如tomcat来启动spring容器,现在是spring容器来启动servlet容器常见的扩展点有如下几种SpringApplicationRunListenerSpringApplicationRunListen.原创 2021-03-28 17:57:24 · 5728 阅读 · 5 评论 -
面试官:Spring Boot 自动装配是如何实现的?
Enable注解是如何实现的?当我们使用Spring Boot的时候,只需要在启动类上加@SpringBootApplication注解即可,非常方便。@SpringBootApplication是一个复合注解@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan其中自动装配的功能就是由@EnableAutoConfiguration注解实现的,那么@EnableAutoConfiguration是如何实现这个神奇的功能的?.原创 2021-03-27 16:05:43 · 1616 阅读 · 1 评论 -
面试官:如何手写一个Spring Boot starter
蛮荒的年代最近用了一些spring-boot-starter-data的组件(redis,mongodb,jpa,elasticsearch等),才意识到Spring Boot真是极大的简化了开发的流程。以演进的视角来分享一下spring boot是如何通过自动装配来简化开发的XML配置Spring是一个容器,里面保存了你所需要的对象和对象之间的依赖关系。当我们需要对象A时,不用从头开始new,只需要告诉Spring把A给我,Spring就会把对象A给你,即IOC。刚开始这些对象以及对象之间的依赖关.原创 2019-12-10 11:33:32 · 3421 阅读 · 1 评论 -
面试官:说一下Spring MVC的启动流程呗!
基于XML配置的容器启动过程我们常用的Spring MVC是基于Servlet规范实现的,所以我们先来回顾一下Servlet相关的内容。如果我们直接用Servlet来开发web应用,只需要继承HttpServlet,实现service方法即可,HttpServlet继承自Servlet,Servlet中常用的方法如下public interface Servlet { // 初始化,只会被调用一次,在service方法调用之前完成 void init(ServletConfig con.原创 2021-03-25 16:15:20 · 1263 阅读 · 0 评论 -
面试官:Spring MVC拦截器有哪些应用场景?
自定义拦截器最近接手了一个web项目,功能先不说哈,安保措施写的挺好的,分享一下这个项目是怎么用拦截器的。我们要写自己的拦截器一般有两种方式。实现HandlerInterceptor接口继承HandlerInterceptorAdapter抽象类我就直接继承了HandlerInterceptorAdapter抽象类,按需重写部分实现即可(框架老套路了哈,接口一般都会提供一个对应的抽象类)HandlerInterceptor有如下3个方法public interface HandlerInt.原创 2019-08-27 12:53:33 · 2200 阅读 · 0 评论 -
面试官:如何快速定位慢SQL
开启慢查询日志在项目中我们会经常遇到慢查询,当我们遇到慢查询的时候一般都要开启慢查询日志,并且分析慢查询日志,找到慢sql,然后用explain来分析系统变量MySQL和慢查询相关的系统变量如下参数含义slow_query_log是否启用慢查询日志, ON为启用,OFF为没有启用,默认为OFFlog_output日志输出位置,默认为FILE,即保存为文件,若设置为TABLE,则将日志记录到mysql.show_log表中,支持设置多种格式slow_query_l.原创 2019-02-23 12:35:07 · 7944 阅读 · 1 评论 -
面试官:MySQL是如何解决幻读的?
介绍众所周知,在不同隔离级别下,会发生如下问题。√ 为会发生,×为不会发生隔离级别脏读不可重复读幻读read uncommitted(未提交读)√√√read committed(提交读)×√√repeatable read(可重复读)××√serializable (可串行化)×××不知道这些问题是如何产生的,可以看如下文章《面试官:脏读,不可重复读,幻读是如何发生的?》那么mysql是如何避免脏读,不可重复度,幻读的?其实.原创 2021-02-06 21:06:58 · 2841 阅读 · 2 评论 -
面试官:内存泄漏,内存溢出如何排查?
前言我们先来了解一下Java堆的组成机构。对于大多数应用来说,Java堆(Java Heap)是Java虚拟机锁管理的内存中最大的一块。Java堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存堆的结构如下新生代老年代的具体划分比例如下分代的主要作用就是为了更高效的管理内存内存泄漏和内存溢出是2个不同的概念内存泄漏:对象已经不使用了,但是还占用着内存空间,没有被释放内存溢出:堆空间不够用了,通常表现为OutOfMe.原创 2021-03-13 16:12:53 · 3662 阅读 · 2 评论 -
面试官:Object类有哪些方法?
方法介绍1.getClass()final,native方法,获得运行时类型。2.hashCode()hashCode()方法主要用于hash表,比如HashMap,当集合要添加元素时,大致按如下步骤:先调用该元素的hashCode()方法获取hashCode,hashCode对数组取模定位到它应该放置的物理位置如果这个位置上没有元素,就直接存储在这个位置上如果这个位置上已经有元素,就调用equals()方法进行比较,相同的话就更新,不相同的话放到链表后面所以重写equals()方法时.原创 2021-02-28 20:01:33 · 596 阅读 · 0 评论 -
面试官:ClassLoader的原理及应用
前言我原来面试的时候被问过一个这样的问题,如果在你项目中建一个java.lang.String的类,那系统中用的String类是你定义的String类,还是原生api中的String类?你可以试一下,发现最终系统中用的还是原生api中的String类,为什么会出现这种情况呢?这还得从类的加载过程说起。我们都知道Java是跨平台的,是因为不同平台下的JVM能将字节码文件解释为本地机器指令,JVM是怎么加载字节码文件的?答案就是ClassLoader,先来打印看一下ClassLoader对象publ.原创 2018-09-18 14:38:41 · 3251 阅读 · 0 评论 -
面试官:Get和Post的区别是什么?
介绍对参数的数据类型,GET只接受ASCII字符,而POST没有限制,允许二进制。GET在浏览器回退/刷新时是无害的,而POST会再次提交请求。GET请求只能进行url编码(application/x-www-form-urlencoded),而POST支持多种编码方式(application/x-www-form-urlencoded 或 multipart/form-data),可以为二进制使用多重编码。POST 比 GET 更安全,因为GET参数直接暴露在URL上,POST参.原创 2019-03-09 11:19:42 · 778 阅读 · 0 评论 -
面试官:final关键字有哪些作用?
介绍final关键字的作用有如下几种final修饰类时,表明这个类不能被继承final修饰方法,表明方法不能被重写final修饰变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能改变;如果是对象类型的变量,只能保证它的引用不变,但对象的内容是可以改变的修饰类final修饰类时,表明这个类不能被继承// 编译错误,提示// Cannot inherit from final 'java.lang.String'public class ClassDemo extends S.原创 2019-08-18 10:59:43 · 1161 阅读 · 0 评论 -
面试官:说一下Spring Bean的生命周期呗
Bean的生命周期BeanFactory的默认实现为DefaultListableBeanFactory,Bean生命周期和方法映射如下BeanDefinition注册阶段:registerBeanDefinitionBeanDefinition合并阶段:getMergedBeanDefinitionBean实例化前阶段:resolveBeforeInstantiationBean实例化阶段:createBeanInstanceBean实例化后阶段:populateBeanBean属性赋值前.原创 2020-06-20 18:57:35 · 4164 阅读 · 5 评论 -
面试官:Synchronized和Lock接口有哪些区别?
Lock接口的使用既然有了synchronized,为啥还要提供Lock接口呢?也许你会说Lock接口比synchronized性能高。在jdk1.5之前确实如此,但是在jdk1.6之后,两者性能差不多了。直接来看Lock接口的定义,看看比synchronized多了哪些功能?public interface Lock { // 加锁 void lock(); // 能够响应中断 void lockInterruptibly() throws InterruptedExcepti.原创 2021-01-03 19:00:29 · 949 阅读 · 0 评论 -
面试官:说一下Synchronized底层实现,锁升级的具体过程?
介绍这是我去年7,8月份面试的时候被问的一个面试题,说实话被问到这个问题还是很意外的,感觉这个东西没啥用啊,直到后面被问了一波new Object,Integer对象等作为加锁对象行吗?会出现哪些问题?为啥java6后synchronized性能大幅上升?我彻底蒙蔽了。下面详细总结一下synchronized使用方式我们知道并发编程会产生各种问题的源头是可见性,原子性,有序性。而synchronized能同时保证可见性,原子性,有序性。所以我们在解决并发问题的时候经常用synchronized,当.原创 2020-02-09 12:01:09 · 32458 阅读 · 33 评论 -
面试官:String类为什么被设计为不可变的?
从哪看出来String类是不可变的?public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[];}String类的值是保存在value数组中的,并且是被private final修饰的p原创 2020-06-20 16:17:19 · 8148 阅读 · 13 评论 -
面试官:让你写一个爬虫系统,如何对url进行去重?(布隆过滤器,亿级数据过滤算法)
介绍我们以演进的方式来逐渐认识布隆过滤器。先抛出一个问题爬虫系统中URL是怎么判重的?你可能最先想到的是将URL放到一个set中,但是当数据很多的时候,放在set中是不现实的。这时你就可能想到用数组+hash函数来实现了。index = hash(URL) % table.length即求出URL的hash值对数组长度取模,得到数组的下标,然后设置table[index] = 1,当然数...原创 2020-04-05 21:07:34 · 2986 阅读 · 1 评论 -
面试官:同样是注册中心,Zookeeper和Eureka有哪些区别?
CAP定理在分布式系统的发展中,影响最大的莫过于CAP定理了,是分布式系统发展的理论基石。2000年,加州大学的计算机科学家 Eric Brewer提出了CAP猜想2002 年,麻省理工学院的 Seth Gilbert 和 Nancy Lynch 从理论上证明了 CAP 猜想,CAP猜想成为了CAP定理CAP定理,简单来说就是分布式系统不可能同时满足Consistency 一致性、Availability 可用性、Partition Tolerance 分区容错性三个要素Consisten.原创 2021-01-01 16:14:29 · 2977 阅读 · 1 评论 -
面试官:MVCC是如何实现的?
MVCC有啥作用?mvcc即多版本并发控制,通过读取指定版本的历史记录,并通过一些手段保证读取的记录值符合事务所处的隔离级别,在不加锁的情况下解决读写冲突如果小伙伴对mvcc不熟,估计看了这句话会有点蒙,没事,等看完这篇文章你就能看懂这句话了对于使用InnoDB存储引擎的表来说,聚集索引记录中都包含下面2个必要的隐藏列trx_id:一个事务每次对某条聚集索引记录进行改动时,都会把该事务的事务id赋值给trx_id隐藏列roll_pointer:每次对某条聚集索引记录进行改动时,都会把旧的版本写入.原创 2020-12-14 00:24:31 · 4586 阅读 · 2 评论 -
面试官:索引为什么会失效?
联合索引是如何存储的查询主要针对组合索引,满足如下2个条件即可满足左前缀原则需要查询的列和组合索引的列顺序一致查询不要跨列构造数据如下,其中在name,address,country上建了联合索引CREATE TABLE `people` ( `name` varchar(50) NOT NULL, `address` varchar(50) NOT NULL, `country` varchar(50) NOT NULL, KEY `idx_name_addr_count.原创 2018-11-04 19:31:20 · 6262 阅读 · 8 评论 -
面试官:脏读,不可重复读,幻读是如何发生的?
介绍数据库事务的四大特性原子性(Atomic)一致性(Consistency)隔离性(Isolation)持久性(Durability)√ 为会发生,×为不会发生隔离性脏读不可重复读幻读read uncommitted(未提交读)√√√read committed(提交读)×√√repeatable read(可重复读)××√...原创 2019-03-03 01:33:42 · 10915 阅读 · 15 评论 -
面试官:怎么查找/etc目录下大于1M的文件?
介绍find命令应该是Linux下进行搜索最常用的一个命令了,功能强大,可以按照各种条件来搜索。怎么查找/etc目录下大于1M的文件?find /etc -size +1M下面我们来看具体的语法格式find [路径] [选项] [操作]选项含义-name根据文件名进行查找-perm根据文件权限进行查找-prune排除 查找目录-user根据文件属主查找-group根据文件属组查找-mtime -n | +n根据文件更改时间查找.原创 2019-07-05 17:17:13 · 3774 阅读 · 0 评论 -
面试官:Mybatis一级缓存和二级缓存同时开启,先查询哪个缓存?
介绍要想回答这个问题,必须把一级缓存和二级缓存的实现搞明白,详细介绍一下我们知道Mybatis有一级缓存和二级缓存,底层都是用HashMap实现的key为CacheKey对象(后续说原因),value为从数据库中查出来的值。Mybatis的二级缓存模块是装饰器的典型实现,不清楚装饰者模式的看如下文章面试官:说一下装饰者模式的作用,以及哪些地方用到了装饰者模式吧画一个简易的装饰者模式类图Component(组件):组件接口或抽象类定义了全部组件实现类以及所有装饰器实现的行为。Concret.原创 2020-11-08 18:35:34 · 3635 阅读 · 1 评论 -
面试官:说一下Mybatis插件的实现原理?
介绍我之前有篇文章大概写了一下mybatis插件的实现原理面试官:MyBatis你只写了接口为啥就能执行sql啊?Mybaits插件的实现主要用了责任链模式和动态代理动态代理可以对SQL语句执行过程中的某一点进行拦截,当配置多个插件时,责任链模式可以进行多次拦截,责任链模式的UML图如下可以看到在一条责任链中,每个Handler对象都包含对下一个Handler对象的引用,一个Handler对象处理完消息会把请求传给下一个Handler对象继续处理,以此类推,直至整条责任链结束。这时我们可以改变.原创 2020-11-08 18:31:35 · 822 阅读 · 0 评论 -
面试官:Redis中过期的key是怎么被删除的?
介绍我们可以给Redis中的key设置过期时间,那么当key过期时Redis是如何处理的呢?redis过期key的删除策略有如下两种惰性删除定时删除惰性删除客户端在访问key的时候,对key的过期时间进行校验,如果过期了就立即删除定时删除Redis会将设置了过期时间的key放在一个独立的字典中,定时遍历这个字典来删除过期的key,遍历策略如下每秒进行10次过期扫描,每次从过期字典中随机选出20个key删除20个key中已经过期的key如果过期key的比例超过1/4,则进行步骤一.原创 2020-06-13 22:49:23 · 2321 阅读 · 3 评论 -
面试官:如何实现一个RPC框架?
介绍当开发一个单体项目的时候,大家肯定都写过类似的代码。即服务提供方和服务调用方在一个服务中public interface HelloService { public String sayHello(String content);}public class HelloServiceImpl implements HelloService { @Override public String sayHello(String content) { retu.原创 2020-10-30 18:12:12 · 1763 阅读 · 1 评论