赞
踩
目录
3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
5. java 中的 Math. round(-1. 5) 等于多少?
8. String str="i"与 String str=new String(“i”)一样吗?
2. Collection 和 Collections 有什么区别?
8. ArrayList 和 LinkedList 的区别是什么?
10. ArrayList 和 Vector 的区别是什么?
12. 在 Queue 中 poll()和 remove()有什么区别?
16. Iterator 和 ListIterator 有什么区别?
5. 说一下 runnable 和 callable 有什么区别?
8. notify()和 notifyAll()有什么区别?
12. 线程池中 submit()和 execute()方法有什么区别?
21. ThreadLocal的内存泄露是怎么回事?怎么解决?
23. synchronized 和 volatile 的区别是什么?
24. synchronized 和 Lock 有什么区别?
25. synchronized 和 ReentrantLock 区别是什么?
28. AQS原理?AQS中为什么要使用双向队列?为什么AQS中的状态用volatile修饰? 说一下volatile的原理
31. 我有一个需求,多个线程同时执行,最终要等所有线程跑完,再把多个线程的结果数据合并,可以怎么实现?
32. 我想先执行线程1,线程1执行完之后,拿线程1的结果传到线程2继续处理,怎么实现?
6. 如果客户端禁止 cookie 能实现 session 还能用吗?
7. spring mvc 和 struts 的区别是什么?
2. final、finally、finalize 有什么区别?
3. try-catch-finally 中哪个部分可以省略?
4. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
1. http 响应码 301 和 302 代表的是什么?有什么区别?
4. Spring boot 配置文件有哪几种类型?它们有什么区别?
「面试必背」Spring Cloud面试题(2022最新版)_柚子茶1990的博客-CSDN博客_springcloud面试题
5. Spring Cloud和SpringBoot版本对应关系
8. 服务注册和发现是什么意思?Spring Cloud 如何实现?
16. 什么是Spring Cloud Zuul(服务网关)?
41. SpringCloud Config 可以实现实时刷新吗?
3. hibernate 中如何在控制台查看打印的 sql 语句?
5. hibernate 实体类可以被定义为 final 吗?
6. 在 hibernate 中使用 Integer 和 int 做映射有什么区别?
11. 在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?
12. hibernate 实体类必须要有无参构造函数吗?为什么?
5. mybatis 是否支持延迟加载?延迟加载的原理是什么?
7. mybatis 和 hibernate 的区别有哪些?
16. rabbitmq 每个节点是其他节点的完整拷贝吗?为什么?
17. rabbitmq 集群中唯一一个磁盘节点崩溃了会发生什么情况?
2. 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
10. MySQL有哪些隔离级别?每种隔离级别会有什么问题?
11. 你用过哪些存储引擎?除了MyIsam和InnoDB还用过其他引擎吗?有什么特点?
16. 说一下MySQL索引原理,为什么使用B+树不用B树?
23. 你知道MySQL的锁吗?MySQL有哪些锁?他们有什么区别?
3. redis 、memcached 、mongoDB 有什么区别?
12. MySQL分布式锁、Redis分布式锁、Zookeeper分布式锁区别?
12. 新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?
面试题大部分来源自科骨铭星感谢大佬!!!
JRE包含了java虚拟机、java基础类库,是使用java语言的编写程序的运行锁需要的软件环境。而 JDK 是程序员开发java程序所需要的开发工具包,提供给程序员使用。
错,不同的两个值,hashCode可能会碰撞出现hashCode()相同
-1
不属于,它属于引用数据类型
不一样 使用String str=“i”,java虚拟机会把它分配到常量池中,而 String str=new String(“i”)创建了一个对象,会被分到堆内存中。
length,equals,subString, indexOf,tostring,
不是必须的,可以有普通方法
不能,因为 final修饰过的不可以被继承
17. Files的常用方法都有哪些?
ArrayList,LinkedList,Vecotr,HashSet,LinkedHashSet,LinkedHashMap,TreeMap,ConcurrentHashMap,HashTable
Collection是集合的顶级父类, Collections是集合的工具类
hashMap 实现了 Map接口,是存储键值对的接口,key不能重复,value 可以重复。一个键值对成为一个Node对象,。
Array. toList() 转为List; toArray()转为数组;
迭代器像是游标,专门用来遍历处理集合的
集合调用iterator()方法,返回Iterator对象,可以通过hasNext 判断是否有下一元素,调用 next()方法返回元素值
守护线程是一种特殊的线程,他用来服务与其他线程,只有当虚拟机停止,他才退出。
notify() 随机唤醒等待这个锁的线程,notifyAll()是唤醒所有
Excutors线程池工具类,使用ThreadpoolExcutor
默认情况下,如果不调用关闭方法,线程池会一直处于 RUNNING 状态,而线程池状态的转移有两个路径:当调用 shutdown() 方法时,线程池的状态会从 RUNNING 到 SHUTDOWN,再到 TIDYING,最后到 TERMENATED 销毁状态;当调用 shutdownNow() 方法时,线程池的状态会从 RUNNING 到 STOP,再到 TIDYING,最后到 TERMENATED 销毁状态。
当调用线程池的 execute() 方法时,线程池会做出以下判断:
当一个任务完成时,它会从任务队列的对头去出下一个任务来执行。
当一个线程空闲超过一定时间时,线程池会判断当前运行线程数是否大于核心线程数,如果大于核心线程数,该线程就会被停掉,直至当前线程数等于核心线程数。
Java线程池中各个参数的合理设置方法 - 开发技术 - 亿速云
没有优化以前,synchronized是重量级锁(悲观锁),使用 wait 和 notify、notifyAll 来切换线程状态非常消耗系统资源;线程的挂起和唤醒间隔很短暂,这样很浪费资源,影响性能。所以 JVM 对 synchronized 关键字进行了优化,把锁分为 无锁、偏向锁、轻量级锁、重量级锁 状态。
锁的级别从低到高依次为:无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级。
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 因此我们举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。如下图所示:
产生死锁的必要条件:
ThreadLocal 是什么?有哪些使用场景?_ConstXiong的博客-CSDN博客_threadlocal是什么
ThreadLocal 是线程本地存储,在每个线程中都创建了一个 ThreadLocalMap 对象,每个线程可以访问自己内部 ThreadLocalMap 对象内的 value。
经典的使用场景是为每个线程分配一个 JDBC 连接 Connection。这样就可以保证每个线程的都在各自的 Connection 上进行数据库的操作,不会出现 A 线程关了 B线程正在使用的 Connection; 还有 Session 管理 等问题。
ThreadLocal原理详解--终于弄明白了ThreadLocal_三七有脾气的博客-CSDN博客_threadlocal原理
ThreadLocal存入值时使用当前ThreadLocal实例作为key,存入当前线程对象中的Map中去。最开始在看源码之前,我以为是以当前线程对象作为key将对象存入到ThreadLocal中的Map中去…
如果ThreadLocal没有外部强引用,那么在发生垃圾回收的时候,ThreadLocal就必定会被回收,而ThreadLocal又作为Map中的key,ThreadLocal被回收就会导致一个key为null的entry,外部就无法通过key来访问这个entry,垃圾回收也无法回收,这就造成了内存泄漏
解决方案:
解决办法是每次使用完ThreadLocal都调用它的remove()方法清除数据,或者按照JDK建议将ThreadLocal变量定义成private static,这样就一直存在ThreadLocal的强引用,也就能保证任何时候都能通过ThreadLocal的弱引用访问到Entry的value值,进而清除掉。
真正从底层理解 Synchronized 实现原理 - 张贤同学 - 博客园
atomic通过CAS (Compare And Wwap)乐观锁机制-自旋锁(它的实现很简单,就是用一个预期的值和内存值进行比较,如果两个值相等,就用预期的值替换内存值,并返回 true。否则,返回 false。)保证原子性,【通过降低锁粒度(多段锁)增加并发性能。这一点是java8做出的改进】从而避免 synchronized 的高开销,执行效率大为提升。
AQS(AbstractQueuedSynchronizer)抽象队列式同步器原理:
如果被请求的资源是共享的空闲的,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待 以及 被唤醒时 锁分配的 机制,这个机制 AQS 是用state 和 CLH 队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
用大白话来说,AQS就是基于CLH队列,用volatile修饰共享变量state,线程通过CAS去改变状态符,成功则获取锁成功,失败则进入等待队列,等待被唤醒。
为什么AQS中的状态用volatile修饰:
volatile + CAS实现非阻塞式线程同步:通过Syncronized的方式当然可以实现线程同步,但是消耗太大;AQS框架使用volatile + CAS实现非阻塞式线程同步,线程同步需要保证3个方面:可见性、有序性、原子性,volatile保证了变量的可见性和有序性,用CAS操作保证变量的原子性。
由此可以看出,volatile关键字的读和普通变量的读取相比基本没差别,差别主要还是在变量的写操作上。
阿里二面,面试官:说说 Java CAS 原理?_爱笑的架构师的博客-CSDN博客
CAS 主要包括两个操作:Compare和Swap,有人可能要问了:两个操作能保证是原子性吗?可以的。
CAS 是一种系统原语,原语属于操作系统用语,原语由若干指令组成,用于完成某个功能的一个过程,并且原
ForkJoin或者CompletableFuture (待补充)
CompletableFuture (待补充)
运行状态下,对于任意一个类,都能够知道它所有的属性和方法,对于任意一个对象,都能够调用他的属性和方法,这种能力就是反射
就是把java对象存储在某一个地方,比如硬盘或者网络上,把内容进行流化。
当你需要把对象在网络上传输,或者保存在文件上,就需要进行序列化
在程序运行期间,创建目标对象的代理对象,并对目标对象中的方法进行功能扩展;AOP就是动态代理的一种应用
定义一个代理对象类,声明静态获取instance实例目标方法,返回 Proxy. newProxyInstance, 重写 invoke方法
能够快速复制对象内容
类实现CloneAble接口,重写 clone 方法
深拷贝是复制出新的对象,浅拷贝是复制了引用,对象还是同一块内存
https://www.jb51.net/article/191825.htm
不能。服务器端调用了requet. getSession()的时候, 产生session对象。创建session的同时 生成sessionId(代表唯一sesssion的字符串), 服务器自动通过Cookie的方式写给浏览器。下次浏览器携带cookie(SessionId)找到对应的session使用。如果用户禁用cookie,则cookie(SessionId)无法存储,浏览器每次访问都不携带任何cookie,包括cookie(SessionId)。
Springmvc与Struts区别? - 牧码良匠 - 博客园
XSS攻击及防御_高爽 Coder的博客-CSDN博客_xss攻击的防御
XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。
避免:
switch(c) {
case '&':
return "&";
case '<':
return "<";
case '>':
return ">";
case '"':
return """;
case ' ':
return " ";
default:
return c + "";
}
}
什么是 CSRF 攻击?如何防范 CSRF 攻击?_不可爱仙女的博客-CSDN博客_检测到csrf攻击
CSRF攻击指的是跨站请求伪造
避免:
Catch 和finally可以省略,但是不能同时省略
会执行。try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗.
什么是异常以及常见的异常类型有哪些_菜鸟也学大数据的博客-CSDN博客_异常类型有哪些
http 协议的 301 和 302 状态码都代表重定向。
区别:
foward是服务器内部的重定向,客户端地址不变,无感知。Redirect客户端新的跳转页面,有请求状态
TCP和UDP的区别_ZJE_ANDY的博客-CSDN博客_tcp和udp区别
两次握手只能保证单向连接是畅通的。因为TCP是一个双向传输协议,只有经过第三次握手,才能确保双向都可以接收到对方的发送的数据。
TCP粘包产生的原因、解决办法_HIT文峯的博客-CSDN博客_tcp 粘包
tcp 粘包可能发生在发送端或者接收端:
java网络:6、OSI 的七层模型都有哪些?_JAVA小摩托不堵车的博客-CSDN博客
get请求和post请求的区别(全面讲解)_心动的偏执的博客-CSDN博客_get请求和post请求的区别
你应该知道的10 种跨域解决方案(附终极方案)_高级盘丝洞的博客-CSDN博客_后端跨域问题解决方案
JSONP的实现原理_过客尘烟的博客-CSDN博客_jsonp如何实现
他是面向切面的简称,通过动态代理模式在程序运行期间,给程序统一添加功能的一种技术。
前置通知、后置通知、返回通知、异常通知、环绕通知
在java中我们以new 关键字进行创建对象,有IOC后让 spring容器帮我们创建需要的依赖对象,我们只需要告诉spirng你需要创建的对象是什么,可以通过 @Bean 或者 @Compent等注解被spring容器扫描读取
在Spring中,只有有状态的单例Bean才会存在线程安全问题。
Spring 创建的bean 是有作用域的,默认的spirng bean的作用域都是单例。
单例分为无状态和有状态的,在Spring 中创建的Service. Dao这些对象,只是查询不做修改,是无状态的,也就没有线程风险。在多线程操作中如果需要对Bean中的成员变量进行数据更新操作,这样的Bean称之为有状态Bean,所以,有状态的单例Bean就可能存在线程安全问题。
而多例的,每次线程访问都会创建新的类型,所以不存在数据共享的问题
spring 自动装配 bean 有哪些方式?_begefefsef的博客-CSDN博客_spring自动装配bean有哪些方式
spring事务实现的几种方式_沉泽·的博客-CSDN博客_spring事务有几种方式
Spring 事务隔离_春风化作秋雨的博客-CSDN博客_spring事务隔离
快速记忆技巧:
核心控制器捕获请求、查找Handler、执行Handler、选择ViewResolver,通过ViewResolver渲染视图并返回;
@Autowired是Spring对组件自动装配的一种方式。常用于在一个组件中引入其他组件
他是基于spring+maven项目的快速整合构建框架,提供了各种启动器,能快速整合框架,不需要繁琐的配置文件
application. properties文件,存储的是键值对的数据信息
两种。. properties 和. yml文件;前者是属性通过. 来连接,后者是显示为有层级结构的形式,更容易观察
有热部署 jar springboot-dev-toos
微服务架构就是将单体的应用程序分成多个应用程序,这多个应用程序就成为微服务,每个微服务运行在自己的进程中,并使用轻量级的机制通信。
Spring Cloud就是微服务系统架构的一站式解决方案,是各个微服务架构落地技术的集合体, 俗称微服务全家桶
优点:
缺点:
总的来说优点大过于缺点,目前看来Spring Cloud是一套非常完善的分布式框架,目前很多企业开始用微服务、Spring Cloud的优势是显而易见的。因此对于想研究微服务架构的同学来说,学习Spring Cloud是一个不错的选择。
服务在发布时 指定对应的服务名(服务名包括了IP地址和端口) 将服务注册到注册中心;注册中心对注册的服务进行管理
可以使用Eureka,Consul,Nacos,Zookeeper
默认情况下,如果Eureka Service在一定时间内没有接收到某个微服务的心跳,Eureka Service会进入自我保护模式,在该模式下Eureka Service会保护服务注册表中的信息,不在删除注册表中的数据,当网络故障恢复后,Eureka Servic 节点会自动退出自我保护模式
从注册中心中根据服务别名获取注册的服务器信息。
CAP原则: 一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)
网关相当于一个网络服务架构的入口,所有网络请求必须通过网关转发到具体的服务。
统一管理微服务请求,权限控制、负载均衡、路由转发、监控、安全控制黑名单和白名单等
网关是对所有服务的请求进行分析过滤,过滤器是对单个服务而言。
Nginx、Zuul、Gateway
通过path配置拦截请求,通过ServiceId到配置中心获取转发的服务列表,Zuul内部使用Ribbon实现本地负载均衡和转发。
使用Nginx的upstream设置zuul服务集群,通过location拦截请求并转发到upstream,默认使用轮询机制对Zuul集群发送请求.
避免单一应用由于并发等原因,导致应用宕机从而导致系统整体无法使用,多负载同时工作,可以很好的解决高并发的问题,实现服务的高可用。
Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。
Ribbon使用discoveryClient从注册中心读取目标服务信息,对同一接口请求进行计数,使用%取余算法获取目标服务集群索引,返回获取到的目标服务信息。
开启客户端负载均衡。
当一个服务调用另一个服务由于网络原因或自身原因出现问题,调用者就会等待被调用者的响应当更多的服务请求到这些资源导致更多的请求等待,发生连锁效应(雪崩效应)
断路器有三种状态
防雪崩利器,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)
雪崩效应是在大型互联网项目中,当某个服务发生宕机时,调用这个服务的其他服务也会发生宕机,大型项目的微服务之间的调用是互通的,这样就会将服务的不可用逐步扩大到各个其他服务中,从而使整个项目的服务宕机崩溃.
发生雪崩效应的原因有以下几点
一般使用使用Hystrix框架,实现服务隔离来避免出现服务的雪崩效应,从而达到保护服务的效果。当微服务中,高并发的数据库访问量导致服务线程阻塞,使单个服务宕机,服务的不可用会蔓延到其他服务,引起整体服务灾难性后果,使用服务降级能有效为不同的服务分配资源,一旦服务不可用则返回友好提示,不占用其他服务资源,从而避免单个服务崩溃引发整体服务的不可用.
Hystrix实现服务降级的功能是通过重写HystrixCommand中的getFallback()方法,当Hystrix的run方法或construct执行发生错误时转而执行getFallback()方法。
声明一个代理接口,服务调用者通过调用这个代理接口的方式来调用远程服务。
两种。spring-cloud调用服务有两种方式,一种是Ribbon+RestTemplate, 另外一种是Feign。
在微服务架构的系统中,我们通常会使用轻量级的消息代理来构建一个共用的消息主题让系统中所有微服务实例都连接上来,由于该主题中产生的消息会被所有实例监听和消费,所以我们称它为消息总线。Spring Cloud Bus就像一个分布式执行器,用于扩展的Spring Boot应用程序,但也可以用作应用程序之间的通信通道。Spring Cloud Bus支持RabbitMQ和Kafka。
Spring Cloud Config是一个统一管理微服务配置的一个组件,具有集中管理、不同环境不同配置、运行期间动态调整配置参数、自动刷新等功能。
spring cloud 的config 介绍_健康平安的活着的博客-CSDN博客_spring-cloud-config
可以
【SpringCloud深入浅出系列】SpringCloud组件之集成Config实现配置自动刷新_奔跑吧邓邓子的博客-CSDN博客
Gateway是在spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot2和Project Reactor等技术。Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:反向代理、熔断、限流、重试等。
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。ORM框架是连接数据库的桥梁,只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。
在 Config 里面把hibernate. show_SQL 设置为 true 即可。
可以
Integer 类型为对象,它的值允许为 null,而 int 属于基础数据类型,值不能为 null。
hibernate的工作原理_皓月星辰_w的博客-CSDN博客_hibernate原理机制
hibernate 缓存机制_@sun林深不见鹿的博客-CSDN博客_hibernate缓存
Hibernate中对象的三种状态_敲得码黛的博客-CSDN博客_hibernate对象的三种状态
必须要,在Hibernate中的实体类实例化时,这个对象是由Hibernate框架创建的,其不会提供默认的无参构造器
不是,RowBounds 表面是在“所有”数据中检索数据,其实并非是一次性查询出所有数据,因为 MyBatis 是对 jdbc 的封装,在 jdbc 驱动中有一个 Fetch Size 的配置,它规定了每次最多从数据库查询多少条数据,假如你要查询更多数据,它会在你执行 next()的时候,去查询更多的数据。就好比你去自动取款机取 10000 元,但取款机每次最多能取 2500 元,所以你要取 4 次才能把钱取完。只是对于 jdbc 来说,当你调用 next()的时候会自动帮你完成查询工作。这样做的好处可以有效的防止内存溢出。 Fetch Size 官方相关文档:http://t. cn/EfSE2g3
Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?_三郎君的博客-CSDN博客_mybatis 是否支持延迟加载?延迟加载的原理是什么?
Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。
延迟加载的原理: 使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,
Mybatis一级缓存和二级缓存 - blayn - 博客园
MyBatis 的一级缓存是基于数据库会话(SqlSession 对象)的,默认开启。二级缓存是基于全局(nameSpace的,开启需要配置。
一级存sql,二级存数据
mybatis有三种基本的Executor执行器:
基于拦截器,在执行sql前进行拦截sql,根据数据库方言重写sql
MyBatis 如何编写一个自定义插件?_ConstXiong的博客-CSDN博客_mybatis 如何编写一个自定义插件
有五种:
消息队列手动确认Ack_漫天雪_昆仑巅的博客-CSDN博客_手动ack
RabbitMq使用场景解析以及优缺点_苗先生的PHP记录的博客-CSDN博客_rabbitmq 的使用场景
Vhost 相当于一个微小的rabbitmq服务,可以按照vhost进行独立隔离权限控制,
生产者 - -> 交换机 - -> 队列 - -> 消费者
141. rabbitmq 怎么避免消息丢失?
rabbitMQ如何避免消息丢失_m0_54850825的博客-CSDN博客_rabbitmq避免消息丢失
跟可靠性稳定这个问题一样的
总结:
以上四个条件都满足才能保证消息持久化成功。
降低了吞吐量,因为使用了硬盘而不是内存。可尽量使用 ssd 硬盘来缓解吞吐量的问题。
主要用于实现高可用与负载均衡。
高可用: 如果集群中的某些MQ服务器不可用,客户端还可以连接到其他MQ服务器。不至于影响业务。
负载均衡:在高并发场景下,单台MQ服务器能处理的消息有限,可以分发给多台服务器。减少消息延迟。
RabbitMQ 集群搭建注意事项_|正心|的博客-CSDN博客_rabbitmq 集群搭建需要注意哪些问题?
不是,原因有以下两个:
不能进行以下操作:
唯一磁盘节点崩溃了,集群是可以保持运行的,但你不能更改任何东西。
RabbitMQ 对集群的停止的顺序是有要求的,应该先关闭内存节点,最后再关闭磁盘节点。如果顺序恰好相反的话,可能会造成消息的丢失。
1. kafka 可以脱离 zookeeper 单独使用吗?为什么?
2. kafka 有几种数据保留的策略?
3. kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 kafka 将如何处理?
4. 什么情况会导致 kafka 运行变慢?
5. 使用 kafka 集群需要注意什么?
1. zookeeper 是什么?
2. zookeeper 都有哪些功能?
3. zookeeper 有几种部署模式?
4. zookeeper 怎么保证主从节点的状态同步?
5. 集群中为什么要有主节点?
6. 集群中有 3 台服务器,其中一个节点宕机,这个时候 zookeeper 还可以使用吗?
7. 说一下 zookeeper 的通知机制?
INNODB 把最大的自增id记录在内存,重启会丢失,重新获取最大,id是6
一般情况下,我们创建的表的类型是InnoDB,如果新增一条记录(不重启mysql的情况下),这条记录的id是8;但是如果重启(文中提到的)MySQL的话,这条记录的ID是6。因为InnoDB表只把自增主键的最大ID记录到内存中,所以重启数据库或者对表OPTIMIZE操作,都会使最大ID丢失。
但是,如果我们使用表的类型是MylSAM,那么这条记录的ID就是8。因为MylSAM表会把自增主键的最大ID记录到数据文件里面,重启MYSQL后,自增主键的最大ID也不会丢失。
注:如果在这7条记录里面删除的是中间的几个记录(比如删除的是3,4两条记录),重启MySQL数据库后,insert一条记录后,ID都是8。因为内存或者数据库文件存储都是自增主键最大ID
select version();
原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)
char 是一种固定长度的存储方式,不够用空格填充,而varchar长度不固定
单精度、双精度
MySQL的索引是如何实现的_LiveEveryDay的博客-CSDN博客_mysql 索引是怎么实现的
explain 查看 SQL 是如何执行查询语句的,从而分析你的索引是否满足需求。 explain 语法:explain select * from table where type=1。
MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY) - 于果alpha - 博客园
INNORDB 、MyISAM 、MEMORY。
MyISAM与InnoDB 的区别(9个不同点)_Chackca的博客-CSDN博客_myisam
MySQL用B+树(而不是B树)做索引的原因_Janson_Lin的博客-CSDN博客_mysql为什么用b+树不用b树
联合索引在B+树上的存储结构及数据查找方式_问北的博客-CSDN博客_b+树 联合索引
之所以会有最左前缀匹配原则和联合索引的索引构建方式及存储结构是有关系的。
limit偏移量不变,随着查询记录量越来越大,所花费的时间也会越来越多。
limit查询记录数不变,随着查询偏移的增大,尤其查询偏移大于10万以后,查询时间急剧增加。
(1) 原因分析
select * from user where sex = 1 limit 100,10
由于 sex 列是索引列,MySQL会走 sex 这棵索引树,命中 sex=1 的数据。
然后又由于非聚簇索引中存储的是主键 id 的值,且查询语句要求查询所有列,所以这里会发生一个回表的情况,在命中 sex 索引树中值为1的数据后,拿着它叶子节点上的值也就是主键 id 的值去主键索引树上查询这一行其他列(name、sex)的值,最后返回到结果集中,这样第一行数据就查询成功了。
最后这句 SQL 要求limit 100, 10,也就是查询第101到110个数据,但是 MySQL 会查询前110行,然后将前100行抛弃,最后结果集中就只剩下了第101到110行,执行结束。
小结一下,在上述的执行过程中,造成 limit 大偏移量执行时间变久的原因有:
MySQL数据库的查询优化器是采用了基于代价的方式,而查询代价的估算是基于CPU代价和IO代价。如果MySQL在查询代价估算中,认为全表扫描方式比走索引扫描的方式效率更高的话,就会放弃索引,直接全表扫描。
(2) 优化方式
t5表有200万数据,id为主键,text为普通索引
1> 使用覆盖索引
如果一条SQL语句,通过索引可以直接获取查询的结果,不再需要回表查询,就称这个索引为覆盖索引。
在MySQL数据库中使用explain关键字查看执行计划,如果extra这一列显示Using index,就表示这条SQL语句使用了覆盖索引。
让我们来对比一下使用了覆盖索引,性能会提升多少吧。
没有使用覆盖索引
select * from t5 order by text limit 1000000, 10;
这次查询花了3.690秒,让我们看一下使用了覆盖索引优化会提升多少性能吧。
使用了覆盖索引
select id, `text` from t5 order by text limit 1000000, 10;
从上面的对比中,超大分页查询中,使用了覆盖索引之后,花了0.201秒,而没有使用覆盖索引花了3.690秒,提高了18倍多,这在实际开发中,就是一个大的性能优化了。
2> 子查询优化
因为实际开发中,用SELECT查询一两列操作是非常少的,因此上述的覆盖索引的适用范围就比较有限。
所以我们可以通过把分页的SQL语句改写成子查询的方法获得性能上的提升。
select * from t5 where id>=(select id from t5 order by text limit 1000000, 1) limit 10;
其实使用这种方法,提升的效率和上面使用了覆盖索引基本一致。
但是这种优化方法也有局限性:
3> 延迟关联
和上述的子查询做法类似,我们可以使用JOIN,先在索引列上完成分页操作,然后再回表获取所需要的列。
select a.* from t5 a inner join (select id from t5 order by text limit 1000000, 10) b on a.id=b.id;
事务是逻辑上的一组操作,要么都执行,要么都不执行。
MVCC(Multi Version Concurrency Control的简称),代表多版本并发控制。与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)。
MVCC最大的优势:读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能
MVCC是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间)。当然存储的并不是实际的时间值,而是系统版本号(system version number)。每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。
InnoDB 中 MVCC 的实现方式为:每一行记录都有两个隐藏列:DATA_TRX_ID、DATA_ROLL_PTR(如果没有主键,则还会多一个隐藏的主键列)。
虾皮二面:MySQL 中有哪些锁?表级锁和行级锁有什么区别?
当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。
MyISAM 仅仅支持表级锁(table-level locking),一锁就锁整张表,这在并发写的情况下性非常差。
InnoDB 不光支持表级锁(table-level locking),还支持行级锁(row-level locking),默认为行级锁。行级锁的粒度更小,仅对相关的记录上锁即可(对一行或者多行记录加锁),所以对于并发写入操作来说, InnoDB 的性能更高。
sql优化的N种方法_持续更新_王会举的博客-CSDN博客_sql优化
show global status like 'com_______'
通过该命令可以查看当前数据库下的增删改查的使用次数,来采取对应的优化处理. value值就是执行的次数.show variables like '%slow_query_log%';
慢查询日志profile分析
SELECT @@profiling;
查看profile是否可用SET profiling = 1;
开启profile:show profiles;
查看当前会话下的所有sql执行时间:show profiles for query xx;
这个xx是show profiles;
的query_id 查看具体sql的每个步骤消耗时间show profiles cpu for query xx;
比上个步骤多了一个cpu字段 查看具体sql的cpu消耗时间Redis 是一个基于内存可以持久化的非关系型数据库,他经常配置关系型数据库来做缓存
使用场景: 数据共享,因为是独立的服务器;分布式锁、计数器、点赞 、排行榜
Redis、memcache、MongoDB 对比_四猿外的博客-CSDN博客_memcache mongo redis
因为redis是基于内存的,限制他的效率的因素是内存的大小,全部在内存中,那么单线程就是最快的
Redis缓存穿透、缓存雪崩和缓存击穿_这是一条海鱼的博客-CSDN博客_缓存击穿 缓存穿透 缓存雪崩
String(字符串 用法: 键 值),Hash(哈希 类似Java中的 map 用法: 键 键值对), List(列表 用法:键 集合 不可以重复),Set(集合 用法:键 集合 可以重复),Zset(sorted set 有序集合 用法: 键 值 值)
Lettucter、jedis、Redisson
Jedis 只是简单的封装了 Redis 的API库,可以看作是Redis客户端,它的方法和Redis 的命令很类似。Redisson 不仅封装了 redis ,还封装了对更多数据结构的支持,以及锁等功能,相比于Jedis 更加大。但Jedis相比于Redisson 更原生一些,更灵活。
https://www.jb51.net/article/224160.htm#_label1
该方案的弊端: 集合双删策略+缓存超时策略设置,这样最差的结果就是在超时时间内数据存在不一致,又增加了写请求的耗时。
区别:
如何用Redis实现分布式锁?_小夏陌的博客-CSDN博客_redis怎么实现分布式锁
分布式锁的几种使用方式(redis、zookeeper、数据库)_南北雪树的博客-CSDN博客
分布式锁的作用及实现(Redis)_LiQiyaoo的博客-CSDN博客_分布式锁的作用
Redis内存淘汰策略_超级码里喵的博客-CSDN博客_redis内存淘汰策略
Redis ZSet 的几种使用场景_渣一个的博客-CSDN博客_redis zset使用场景
延迟队列、排行榜、限流
Redis-跳跃表(skip List)_养歌的博客-CSDN博客_redis跳跃表
跳表全称叫做跳跃表,简称跳表。跳表是一个随机化的数据结构,
跳跃表(skiplist)是一个用于有序元素序列快速搜索的随机化的数据结构
Redis之事务(详细解析)_故明所以的博客-CSDN博客_redis 事务
redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令
redis事务没有隔离级别,不保证原子性
一文读懂Redis的四种模式,单机、主从、哨兵、集群 - 爱码网
Redis集群原理详解_张维鹏的博客-CSDN博客_redis集群
这种将哈希槽分布到不同节点的做法使得用户可以很容易地向集群中添加或者删除节点。
JVM主要组成部分及其作用_小猫的秋刀鱼的博客-CSDN博客_jvm组成
JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载器)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地库接口)。
作用 :首先通过编译器把 Java 代码转换成字节码,类加载器(ClassLoader)再把字节码加载到内存中,将其放在运行时数据区(Runtime data area)的方法区内,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能
JVM运行时数据区了解一下?_索码理的博客-CSDN博客_说一下jvm 运行时数据区
运行时数据区包括堆、方法区、栈、本地方法栈、程序计数器。
堆解决的是对象实例存储的问题,垃圾回收器管理的主要区域。
方法区可以认为是堆的一部分,用于存储已被虚拟机加载的信息,常量、静态变量、即时编译器编译后的代码。
栈解决的是程序运行的问题,栈里面存的是栈帧,栈帧里面存的是局部变量表、操作数栈、动态链接、方法出口等信息。
与栈功能相同,本地方法栈执行的是本地方法,一个Java调用非Java代码的接口。
程序计数器中存放的是当前线程所执行的字节码的行数。JVM工作时就是通过改变这个计数器的值来选取下一个需要执行的字节码指令。
堆的物理地址是不连续的,性能相对较慢,是垃圾回收区工作的区域。在GC时,会考虑物理地址不连续,而使用不同的算法,比如复制算法,标记-整理算法,标记-清楚算法等。
栈中的物理地址是连续的,LIFO原则,性能较快。
堆因为是不连续的,所以分配的内存是在运行期确认的,因此大小不固定,一般堆大小远远大于栈。
栈是固定大小的,所以在编译期就确认了。
堆中存放的是对象实例和数组,该区域更关注的是数据的存储
( 静态变量放在方法区,静态对象仍然放在堆中)
栈中存放的是局部变量,栈针,操作数栈,返回结果等。该区更关注的是程序方法的执行。
堆是线程共有的,栈是线程私有的。
如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出java.lang.StackOverFlowError。而如果是堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError。
-Xss选项设置栈内存的大小。-Xms选项可以设置堆的开始时的大小,-Xmx选项可以设置堆的最大值
栈和队列的概念_伟大的车尔尼的博客-CSDN博客_什么是栈和队列
栈和队列是常见的数据结构。栈的特点是后进先出,添加元素、删除元素和查看元素都在栈顶操作。队列的特点是先进先出,添加元素在队尾操作,删除元素和查看元素在队首操作。
区别:
一文搞懂双亲委派模型_许大侠0610的博客-CSDN博客_双亲委派模型
双亲委派模型,其实就是一种类加载器的层次关系。当一个类加载器收到类加载任务时,会先交给自己的父加载器去完成,因此最终加载任务都会传递到最顶层的BootstrapClassLoader,只有当父加载器无法完成加载任务时,才会尝试自己来加载。
16. 类的加载过程(类的生命周期)详解_幻の心的博客-CSDN博客_类加载过程
给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。
目前主流的java虚拟机都摒弃掉了这种算法,最主要的原因是它很难解决对象
之间相互循环引用的问题。尽管该算法执行效率很高。
目前主流的编程语言(java,C#等)的主流实现中,都是称通过可达性分析(Reachability Analysis)来判定对象是否存活的。这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的。如下图所示,对象object 5、object 6、object 7虽然互相有关联,但是它们到GC Roots是不可达的,所以它们将会被判定为是可回收的对象。
在Java语言中,可作为GC Roots的对象包括下面几种:
虚拟机栈(栈帧中的本地变量表)中引用的对象。
方法区中类静态属性引用的对象。
方法区中常量引用的对象。
本地方法栈中JNI(即一般说的Native方法)引用的对象。
强引用,软引用,弱引用,虚引用
四种级别由高到低依次为: 强引用 > 软引用 > 弱引用, 虚引用
浅谈一下JVM常用的四种垃圾回收算法_Java世界上最好的语言的博客-CSDN博客_jvm垃圾回收算法有哪些
说一下 jvm 有哪些垃圾回收器?_哪 吒的博客-CSDN博客_jvm有哪些垃圾回收器
在JDK1.3之前,单线程回收器是唯一的选择。它的单线程意义不仅仅是说它只会使用一个CPU或一个手机线程去完成垃圾收集工作。而且它进行垃圾回收的时候,必须暂停其它所有的工作线程(Stop The World,STW),直到它收集完成。它适合Client模式的应用,在单CPU环境下,它效率高效,由于没有线程交互的开销,专心垃圾收集自然可以获得最高的单线程效率。
并行垃圾回收器是通过多线程进行垃圾收集的。也会暂停其它所有的工作线程(Stop The World,STW)。适合Server模式以及多CPU环境。一般会和JDK1.5之后出现的CMS搭配使用。
CMS(Concurrent Mark Sweep)收集器是一种以获得最短回收停顿时间为目标的收集器。从名字就能知道它是标记-清除算法的。但是它比一般的标记-清除算法要复杂一些,分为以下4个阶段:
G1从整体看还是基于标记-清除算法的,但是局部上是基于复制算法的。
CMS垃圾收集器详解_一枚深蓝的博客-CSDN博客_cms垃圾收集器
CMS全程为Concurrent Mark Sweep,即 并发标记清除,对比以上的收集器,最大的区别在于 并发:在GC线程工作的时候,用户线程 不会完全停止,用户线程在 部分场景下与GC线程一起并发执行。但是,无论是什么垃圾收集器,Stop the world是一定无法避免的。CMS只是在 部分的GC场景下可以让GC线程与用户线程并发执行。
CMS的涉及目的是为了避免【老年代GC】出现长时间的卡顿(stop the word)。
CMS主要是实现了标记清除垃圾回收算法,可分为5个步骤:
新生代回收器:Serial、ParNew、Parallel Scavenge
老年代回收器:Serial Old、Parallel Old、CMS
整堆回收器:G1
新生代垃圾回收器一般采用的是复制算法,复制算法的优点是效率高,缺点是内存利用率低;老年代回收器一般采用的是标记-整理的算法进行垃圾回收。
分区:分代垃圾回收器分为两个区:新生代、老生代。
占比:新生代默认占总空间的 1/3,老生代默认占总空间的 2/3。
新生代,使用复制算法,新生代又分为 3 个区:Eden、From Survivor、To Survivor,默认比例是 8:1:1,执行流程如下:
常用调优工具分为两类,
Console是从java5开始,在JDK中自带的java监控和管理控制台,用于对JVM中内存, 线程和类等的监控。
jvisualvm,jdk自带全能工具,可以分析内存快照、线程快照;监控内存变化、GC变化等。
MAT,Memory Analyzer Tool,一个基于Eclipse的内存分析工具,是一个快速、功能丰富的Javaheap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。
GChisto,一款专业分析gc日志的工具。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。