![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Interview
文章平均质量分 62
lisin-lee-cooper
这个作者很懒,什么都没留下…
展开
-
Spring 事务失效的几种场景
1.抛出检查异常导致事务不能正确回滚spring 默认只会回滚非检查异常,需要配置rollbackFor属性指定回滚2.业务方法内自己try-cache异常导致事务不能正确回滚事务通知只有捕获到目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉解决:cache中原样抛出异常或者cache代码块中执行 TransactionInterceptor.currentTransactionStatus().setRollbackOnly();3.日志Aop切面 中捕获了s原创 2022-05-09 00:16:34 · 276 阅读 · 0 评论 -
Sharding-jdbc执行流程分析
一.流程分析(1)解析sql,获取片键值,在本例中是order_id(2)Sharding-JDBC通过规则配置数据库和表路由规则 t_order_$->{order_id % 2 + 1},知道了当order_id为偶数时,应该往 t_order_1表插数据,为奇数时,往t_order_2插数据。(3)于是Sharding-JDBC根据order_id的值改写sql语句,改写后的SQL语句是真实所要执行的SQL语句。(4)执行改写后的真实sql语句(5)将所有真正执行sql绑定表 :指原创 2022-05-10 14:35:51 · 653 阅读 · 0 评论 -
seata实现2PC事务
一.业务说明本实例通过seata实现分布式事务,模拟两个账户跨行转账交易过程业务框架:数据库:MySQL-5.7.25,微服务框架:spring-boot-2.1.3、spring-cloud-Greenwich.RELEASEseata客户端(RM、TM):spring-cloud-alibaba-seata-2.1.0.RELEASE seata服务端(TC):seata-server-0.7.1 下载地址...原创 2022-04-28 22:20:27 · 1142 阅读 · 0 评论 -
分布式事务解决方案
一.什么是2PC2PC即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase)、提交阶段(commit phase),2是指两个阶段,P是指准备阶段,C是指提交阶段。准备阶段(Prepare phase):事务管理器给每个参与者发送Prepare消息,每个数据库参与者在本地执行事 务,并写本地的Undo/Redo日志,此时事务没有提交。 (Undo日志是记录修改前的数据,用于数据库回滚,Redo日志是记录修改后的数据,用于提交事务后写入数 据文件);提交阶段(commit原创 2022-04-28 16:24:41 · 246 阅读 · 0 评论 -
类初始化和实例初始化面试题
public class Father { private int a = testA(); private static int b = testB(); static { System.out.println("(1)"); } Father() { System.out.println("(2)"); } { System.out.println("(3)"); } pri原创 2022-04-22 21:30:38 · 423 阅读 · 0 评论 -
RocketMQ原理及解析
1 如何保证消息的可靠性传输生产者丢失数据:生产者设置同步提交消息,并且手动提交,将消息同步刷盘到从节点后在返回成功,broker :主从复制,同步刷盘消费端:消费重试,只有返回consume_success 才算消费完成,保证消息的可靠性,最终还是消费16次还是失败的会进死信队列2.如何保证消息不被重复消费消费端消费消息的幂等1 服务端代码根据messageId 设置分布式锁,获取锁再做业务操作2 更新数据库时校验业务的状态3 或者设置唯一索引3.如何保证消息的顺序性...原创 2022-04-07 16:46:55 · 3047 阅读 · 0 评论 -
zuul 和 gateway 原理分析
一. zuul 原理分析zuulServlet 源码public class ZuulServlet extends HttpServlet { private ZuulRunner zuulRunner; public void init(ServletConfig config) throws ServletException { ... } public void service(javax.servlet.ServletReques原创 2022-03-29 00:23:45 · 420 阅读 · 1 评论 -
Spring 解决循环依赖
一. Bean的生命周期二. 什么是什么是三级缓存 /** 1级缓存 Cache of singleton objects: bean name to bean instance. */ private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); /** 2级缓存 Cache of early singleton objects: bean name to bean i原创 2022-03-27 23:43:39 · 635 阅读 · 0 评论 -
Redis 面试知识点
1 为什么使用Redis分布式缓存记录用户收藏数,评论数缓存热点数据搜索记录2 Redis 数据结构Redis数据结构解析3 分布式锁Redis分布式锁4 布隆过滤器向布隆过滤器中添加 key 时,会使用多个 hash 函数对 key 进行 hash 算得一个整数索引值然后对位数组长度进行取模运算得到一个位置,每个 hash 函数都会算得一个不同的位置。再把位数组的这几个位置都置为 1 就完成了 add 操作;向布隆过滤器询问 key 是否存在时,跟 add 一样,也会把 hash 的原创 2022-03-25 00:23:26 · 1096 阅读 · 0 评论 -
Spring 面试知识点
一. IOC 部分1.1 IOC思想将获取对象的方式交给了Spring容器,这种将控制权交给别人的思想称作控制反转,根据beanName去获取和创建对象的过程称作依赖查找1.2 依赖查找和依赖注入的区别依赖注入的作用目标通常是类成员,依赖查找的作用目标可以是方法体内也可以是方法体外;依赖注入通常借助一个上下文被动的接受,依赖查找同产主动使用上下文搜索。1.3 BeanFactory和ApplicationContext 的对比BeanFactory 接口提供了一个抽象的配置和对象的管理机制A原创 2022-03-24 14:56:47 · 860 阅读 · 0 评论 -
接口幂等实现方案
一.接口未做幂等带来的问题1.1 填写某些form表单时,保存快速点了两次,数据库中新增两条相同的数据;1.2 微服务调用超时重试1.3 mq消费时读取到重复消息接口幂等性是指用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用,以上操作未做接口幂等的话都可能产生重复数据二.主要实现方式2.1 悲观锁select * from oder where order id = #{orderId} for update;对需要修改的数据加锁处理,判断业务是否已执原创 2022-03-16 10:40:03 · 455 阅读 · 0 评论 -
Redis 缓存与数据库双写一致性
双写一致性要求:缓存不能读到脏数据缓存可能会读到过期数据,但要在可容忍时间内实现最终一致这个可容忍时间尽可能的小一.先更新数据库,再更新缓存线程A更新数据库,线程A更新缓存线程B更新数据库,线程B更新缓存因为网络等原因,线程A更新缓存晚于线程B更新缓存,导致缓存与数据库不一致延时双删二.先删除缓存,再更新数据库线程A删除缓存,线程A更新数据库;线程B查询缓存不存在,更新缓存线程A更新数据库晚于线程B更新缓存,导致缓存与数据库不一致三.先更新数据库,再删除缓存缓存失效,线程A查询数原创 2022-03-15 21:45:56 · 796 阅读 · 0 评论 -
Redis高可用模式
一.主从复制读写分离,适用于读多写少场景,但是master宕机后,redis写入将不可用。二.哨兵模式Sentinel集群会对Redis的主从架构中的Redis实例进行监控,一旦发现了master节点宕机了,就会选举出一个Sentinel节点来执行故障转移,从原来的slave节点中选举出一个,将其提升为master节点,然后让其他的节点去复制新选举出来的master节点。三.集群模式主从复制和哨兵模式无法扩展写能力Redis Cluster要求至少需要3个master才能组成一个集群,同时每个m原创 2022-03-15 21:24:57 · 1065 阅读 · 0 评论 -
Redis 数据持久化
一.持久化的两种方式RDB:Redis Database,某个时刻Redis内存中的数据快照AOF:Append Only File,所有修改内存数据的指令合集两种方式都会生成相应的文件落地到磁盘上。二.RDBsave命令直接调用rdbsave方法,此时会阻塞Redis主进程,直至快照文件生成;bgsave命令会fork出一个子进程,由fork出来的子进程调用rdbsave。父进程会继续响应来自客户端的读写请求。子进程完成RDB文件生成之后会给父进程发送信号,通知父进程保存完成。基于这个策略,原创 2022-03-15 20:49:14 · 1034 阅读 · 0 评论 -
计算机操作系统
一.什么是操作系统操作系统就是一种运行在内核态的软件:1.为应用程序(程序员)提供资源集的清晰抽象2.管理硬件资源操作系统为应用程序提供基本抽象,从而使应用程序在此基础上可以组合功能;操作系统用来管理复杂系统的各个部分,对资源的请求进行分配,调节不同程序见相互冲突的资源请求.二.进程2.1进程模型:是对程序的一种抽象,是正在执行程序的一种实例(包含寄存器,程序计数器,变量的当前值,拥有自己的虚拟CPU(真正的CPU在进程之间来回切换)1、进程和程序的区别1:举个例子 ,比如我们做一个蛋糕,程原创 2022-03-14 16:55:35 · 1746 阅读 · 0 评论 -
MySQL 事务
一.什么是事务原子性原子性指整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作都执行成功,才算整个事务成功。事务中任何一个SQL 语句执行失败,已经执行成功的SQL 语句也必须撤销,数据库状态应该退回到执行事务前的状态。一致性一致性指事务将数据库从一种状态转变为下一种一致的状态。在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。事务是一致性的单位,如果事务中某个动作失败了,系统可以自动撤销事务一返回初始化的状态。隔离性隔离性还有其他的称呼,如并发控制(concurrenc原创 2022-03-14 14:24:43 · 304 阅读 · 0 评论 -
MySQL 锁
一.什么是锁锁机制用于管理对共享资源的并发访问,InnoDB 存储引擎会在行级别上对表数据上锁 ,从而允许对多种不同资源提供并发访问;对于MyISAM 引擎,其锁是表锁设计。二.锁的类型1.一致性锁定读(不可重复读)一致性的非锁定读 指 InnoDB 存储引擎通过行多版本控制(multi versioning) 的方式来读取当前执行时间数据库中行的数据;快照数据其实就是当前行数据之前的历史版本,每行记录可能有多个版本。一个行记录可能有不止一个快照数据,一般称这种技术为行多版本技术。由此带来的并发控原创 2022-03-11 17:33:57 · 502 阅读 · 0 评论 -
MySQL索引
一.什么是索引索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。索引的一个主要目的就是加快检索表中数据,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。二.索引设计原则重复率小的列建立索引唯一列建唯一索引频繁查询的列建立索引枚举列不宜建索引##查看索引show index from {table_name}##新增索引alter tabl原创 2022-03-11 15:30:16 · 1299 阅读 · 0 评论 -
SpringAop简述
作用:Spring 的两大特性之一, 主要提供面向切面的编程思想,区分于面向对象编程。原理(动态代理+反射):spring通过反射的形式,为目标类动态生成代理类,将切面植入到代理对象中。这样代理类可以在目标方法执行之前、之后,处理一些额外的通知事件。aop目标aop的最终目的是实现代码的完全解耦。实现完全模块化,使得大型项目开发与管理,更加容易代理静态代理:目标接口,目标类,代理类。对于大型复杂的项目,编写太多的目标代理类是个非常庞大的工程。动态代理:jdk动态代理:动态生成的代理类,和目标原创 2022-03-09 23:19:23 · 208 阅读 · 0 评论 -
SpringIOC特性
一alias(别名)1.xml方式配置public class TestService { public TestService() { System.out.println("TestService初始化成功"); }}<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi原创 2021-04-08 20:49:46 · 135 阅读 · 0 评论 -
JAVA多线程面试知识点
一.JAVA线程创建方式1.1 继承Thread 类Therad 类是实现了Runnable接口的一个实例,代标一个线程的实例,启动线程的唯一方法是通过Thread 类的start() 实例方法,是一个native方法,将启动一个新线程,执行run()方法。public class MyThread extends Thread { public void run() { System.out.println("MyThread.run()"); } } MyThread myThre原创 2022-02-12 16:00:37 · 579 阅读 · 0 评论 -
JVM面试知识点
一.基本概念1.1 JVM是可运行Java代码的假象机器,包括一套字节码指令集,一套寄存器,一个栈,一个垃圾回收,堆,和一个方法存储域,运行在操作系统上,与硬件没有直接交互。运行过程:① Java 源文件—->编译器—->字节码文件② 字节码文件—->JVM—->机器码1.2 运行时数据区程序计数器(线程私有):当前线程所执行的字节码的行号指示器,执行java方法的话,计数器记录的是虚拟机字节码指令的地址,如是Native方法,则为空。虚拟机栈(线程私有):描述jav原创 2022-01-28 17:51:14 · 1924 阅读 · 0 评论 -
JAVA集合面试知识点
线程安全: Vector、HashTable线程不安全:HashMap、TreeMap、HashSet、ArrayList、LinkedList2、 Arraylist与 LinkedList 异同Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向循环链表数据结构;ArrayList 查询 O(1),插入 O(n);LinkedList 查询 O(n),插入 O(1);ArrayList的空 间浪费主要体现在在list列表的结尾会预留一定的容量空间,而Li.原创 2022-03-03 15:36:01 · 439 阅读 · 0 评论 -
JAVA基础面试知识点
一.JAVA异常分类及处理1.1 异常分类Error: Error 类是指 java 运行时系统的内部错误和资源耗尽错误。应用程序不会抛出该类对象。如果出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止。Exception(RuntimeException、CheckedException): Exception 又 有 两 个 分 支 , 一 个 是 运 行 时 异 常 RuntimeException ,如 : NullPointerException 、 ClassCastExcep原创 2022-02-13 18:53:29 · 297 阅读 · 0 评论 -
Redisson分布式锁
一.什么是锁锁主要是用来实现资源共享同步,只有获取到了锁才能访问该同步代码,否则等待其他线程使用结束释放锁。二.redis实现分布式锁主要步骤1.指定一个 key 作为锁标记,存入 Redis 中,指定一个 唯一的用户标识 作为 value;2.当 key 不存在时才能设置值,确保同一时间只有一个客户端进程获得锁,满足 互斥性 特性。3.设置一个过期时间,防止因系统异常导致没能删除这个 key,满足 防死锁 特性。4.当处理完业务之后需要清除这个 key 来释放锁,清除 key 时需要校验 va原创 2022-03-03 00:23:12 · 7278 阅读 · 0 评论 -
Redis数据结构解析
一.五种数据结构String:字符串类型List:列表类型Set:无序集合类型ZSet:有序集合类型Hash:哈希表类型二.RedisObjectredisObject 用来表示所有的key 和 value ,用redisObject 结构体来表示String 、Hash、List、Set、ZSet;redisObject 结构:数据类型(type)编码方式(encoding)数据指针 (ptr)虚拟内存(vm)其他信息三.数据的编码方式和应用场景3.1 StringStr原创 2022-03-01 17:29:40 · 655 阅读 · 0 评论 -
Java异常处理
必检异常:不可避免 必须进行异常处理,要不编译器报错Exception以及它的子类(除去RuntimeException)免检异常:RuntimeException以及它的子类异常处理方式Java编译期异常必须要进行处理,否则Java源文件在编译时编译器会提示错误,且源文件无法成功编译Java编译期异常的处理方式有两种:使用try、catch、finally关键字捕获异常使用throws关键字声明抛出异常使用try、catch、finally捕获异常 try{ //可能会出现异.原创 2022-02-28 17:37:28 · 329 阅读 · 0 评论 -
面向对象编程思想(OOP)
一.什么是面向对象(object Oriented Programming)面向对象思想将客观世界中的事物描述为对象,并通过抽象思维方法将需要解决的实际问题分解为人民易于理解的对象模型,然后通过这些对象模型来构建应用程序的功能;**二. 面向对象的概念:**对象、类、封装、继承、多态对象:客观具体存在的事务,如这个人,这个桌子,由属性和行为组成;类: 对大量对象共性的抽象,是对客观事务的抽象,也由属性和成为组成;三.三大基本特征封装: 把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让原创 2022-02-28 14:58:22 · 10154 阅读 · 0 评论 -
CAP理论
一.CAP原理解读CAP 也就是 Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性) 这三个单词首字母组合。一致性(Consistence) : 所有节点访问同一份最新的数据副本。可用性(Availability): 非故障的节点在合理的时间内返回合理的响应(不是错误或者超时的响应)。分区容错性(Partition tolerance) : 分布式系统出现网络分区的时候,仍然能够对外提供服务。二.为什么存在CAP分布式系统中原创 2022-02-24 15:09:24 · 165 阅读 · 0 评论 -
【设计模式】【创建型】单例模式
/** * 饿汉式 * 类加载的时候完成实例化,线程安全 * @Date 2022-02-24 11:38 */public class HungaryHanStyle { private static HungaryHanStyle instance = new HungaryHanStyle(); private HungaryHanStyle() { } public static HungaryHanStyle getInstance() {原创 2022-02-24 14:12:22 · 241 阅读 · 0 评论 -
redis 缓存击穿、穿透、雪崩
一.击穿大量的请求过来,被查询的key缓存失效,导致直接查询数据库,导致数据库cpu飙升,服务器响应变慢甚至宕机。解决方案1 加锁更新key失效后可以放一部分请求同步加锁更新,其他请求阻塞等待获取缓存值。2 缓存预热启动定时任务,去异步更新缓存值二. 穿透查询的数据缓存和数据库中都不存在,每次请求都会访问数据库解决方案1 缓存空值或默认值2 布隆过滤器三.雪崩击穿的加强版,同一时间大量key同时缓存失效解决方案1 key值过期时间分散2 热点数据永不过期,双写同步更新缓存原创 2022-02-24 11:31:40 · 427 阅读 · 0 评论 -
数据库隔离级别
一.事务的四大特性1.原子性:一个事务中的操作,要么全成功,要么全失败;2.一致性:一个事务执行之前和执行之后都必须处于一致状态,如A向B转账,A+B的总金额转账前后总金额一致;3.隔离性:两个事务操作同一张表时,互不影响;4.持久性:事务一旦提交,不会丢失,改变是永久的。二. 隔离级别1.脏读:在A 事务中读到B事务未提交的数据2.不可重复读:A 事务每次查询都读取最新数据,B 事务对数据做出多次修改时,A 事务读取的结果是每一次B事务提交后的数据。3.幻读:...原创 2022-02-17 15:20:15 · 325 阅读 · 0 评论 -
Spring相关面试题
一.IOC面试整理1.1什么是SpringSpringFramework 是一个开源的、松耦合的、分层的、可配置的一站式企业级 Java 开发框架,它的核心是 IOC 与 AOP ,它可以更容易的构建出企业级 Java 应用,并且它可以根据应用开发的组件需要,整合对应的技术。1.2为什么使用SpringIOC:组件之间的解耦(由强依赖降为弱依赖)AOP:切面编程可以将应用业务做统一或特定的功能增强,能实现应用业务与增强逻辑的解耦容器与事件:管理应用中使用的组件 Bean、托管 Bean 的生命原创 2021-12-09 20:27:03 · 417 阅读 · 0 评论 -
两个队列实现栈
public class TwoQueuesStack { private static Queue<Integer> queue = new LinkedList<>(); private static Queue<Integer> help = new LinkedList<>(); public static void push(int num) { queue.add(num); } pub原创 2021-10-29 10:48:04 · 39 阅读 · 0 评论 -
两个栈实现队列
public class TwoStacksQueue { private static Stack<Integer> push = new Stack<>(); private static Stack<Integer> pop = new Stack<>(); public static void push(int num) { push.push(num); } public static i原创 2021-10-29 10:46:38 · 34 阅读 · 0 评论 -
两个线程交替打印
public class PringThread implements Runnable { int i = 1; @Override public void run() { while (true) { synchronized (this) { notify(); if (i <= 100) { System.out.printl原创 2021-10-29 10:33:34 · 54 阅读 · 0 评论 -
MySQL的MVCC实现原理
一.MVCC概念百度百科:Multi-Version Concurrency Control 多版本并发控制,MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问;在编程语言中实现事务内存。当前读:select lock inshare mode;select for update;updateinsert;delete;读取的是记录的最新版本,读取时保证其他事务不能修改当前读取的记录,读取的记录会被加锁;快照度:不加锁的select操作都是快照度,非串行的隔离原创 2021-09-01 10:20:34 · 154 阅读 · 0 评论 -
mysql隔离级别和spring事务传播行为
Spring 事务管理一个数据库事务被视为单一的操作单元,这些操作要么全部执行成功,要不全部不执行,不存在成功一部分和失败一部分的情况,事务的概念可以描述为具有以下四个关键属性(ACID):1.原子性(Atomicty) : 事务应该当作一个单独单元的操作,整个序列操作要么成功,要么失败2.一致性(Consistency):事务执行后,数据库状态与其他业务状态一致,如转账业务,转账前后两个账户余额相加金额需要一致3.隔离性(Isolation):事务执行过程中,不同的事务各不影响,即并发过程原创 2021-03-25 20:32:22 · 169 阅读 · 1 评论 -
Java内存模型
一.JMM概念抽象的概念,描述一组规则或规范,通过这组规范定义了各个变量(实例变量,静态字段和构成数组对象的元素)的访问方式,JVM运行程序的实体是线程,每个线程JVM都会为其创建一个工作内存,工作内存是每个线程的的私有数据区域,java内存模型规定中的变量都存储在主内存,主内存是共享数据,所有线程都能访问,但是线程对变量的操作都必须在工作内存中完成,工作内存存放的是主内存中的副本,线程通信都需要通过主内存来完成。百度百科:内存模型描述了程序中各个变量(实例域、静态域和数组元素)之间的关系,以及在实际计原创 2021-08-24 17:47:31 · 77 阅读 · 0 评论 -
WebSocket详解
一.WebSocket介绍WebSocket 是一种在单个TCP连接上进行全双工的通信的协议;允许服务器主动向客户端推送数据,浏览器和服务器完成一次握手就可以创建持久性的连接。并进行双向数据传输。二.websocket和http区别HTTP 协议为单项协议,只能是浏览器向服务器发送请求,服务器才能将数据传送给浏览器;HTTP 1.1 有长连接,长连接短时间内保持连接,保持TCP不断开;短链接是每次请求都需要三次握手才能发送请求,每个请求对应一个response。三.websocket心跳检测流程原创 2021-08-19 16:52:11 · 637 阅读 · 0 评论