4.5年常见面试题5(法本-麦当劳1/2)
1.系统交互,有没有调用过Dubbo接口
2.聊一聊SpringCloud几个核心组件
Eureka、Fegin、Ribbon、Hystrix、Zull (其他不是)
SpringCloud简介
3.Feign和OpenFeign区别?服务间调用?
1)Feign是Spring Cloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用接口,就可以调用服务注册中心的服务。
2)OpenFeign是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中.
19年停更/18年以后都用后者了,OpenFeign教程
服务间调用:@GetMapping和@PostMapping?
4.服务怎么注册/怎么进行服务发现?
Eureka 采用的是 Server 和 Client 的模式进行设计,Eureka Server 扮演了服务注册中心的角色,为Client 提供服务注册和发现的功能。Eureka Client 通过客户端注册的方式暴露服务,通过注解等方式嵌入到服务提供者的代码中,当服务启动时,服务发现组件会向注册中心注册自身提供的服务,并周期性地发送心跳来更新服务。如果连续多次心跳不能够发现服务,那么 Eureka Server 就会将这个服务节点从服务注册表中移除,各个服务之间会通过注册中心的注册信息来实现调用。
5.MyBatis如何自定义一个分页?分页怎么做的?
(1) MyBatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页;(2) 可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能,(3) 也可以使用分页插件来完成物理分页。物理分页和内存分页区别
分页插件的基本原理是使用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql,根据 dialect 方言,添加对应的物理分页语句和物理分页参数。
6.复杂的SQL,如何让优化(1000(Queries Per Second,每秒查询数)/TPS(Transactions Per Second,每秒处理事务数))?
1)开启慢查询日志,定位运行慢的SQL语句
2)利用explain执行计划,查看SQL执行情况 (key要有值:命中索引,最好命中主键索引,type要到range,行数要查出尽量少,Extra其他的一些指标也要关注下)
【3)关注索引使用情况:type(一般来说,好的sql查询至少达到range级别,最好能达到ref)
4)关注Rows:行扫描
5)关注Extra:没有信息最好
6)加索引后,查看索引使用情况,index只是覆盖索引,并不算很好的使用索引
7)如果有关联尽量将索引用到eq_ref或ref级别
8)复杂SQL可以做成视图,视图在MySQL内部有优化,而且开发也比较友好
9)对于复杂的SQL要逐一分析,找到比较费时的SQL语句片段进行优化
explain执行计划详解】
7.加联合索引abc三个字段,查询a=?,b=?会生效吗?联合索引怎么生效的?哪些会生效呢?代码中写c=?,b=?,a=?会生效吗?
会生效;
最左前缀匹配原则指的是,在使用联合索引时,MySQL 会根据联合索引中的字段顺序,从左到右依次到查询条件中去匹配,如果查询条件中存在与联合索引中最左侧字段相匹配的字段,则就会使用该字段过滤一批数据,直至联合索引中全部字段匹配完成,或者在执行过程中遇到范围查询,如 >、<、between 和 以%开头的like查询 等条件,才会停止匹配。
a会生效,ab会生效,abc也会生效;
也会生效,因为sql执行有一个优化器(优化器的作用就是它认为的最优的执行方案去执行)。
8.sql中if和else对应MyBatis语言是什么?
或者多个判断
mybatis中的if-else使用及if嵌套使用
9.ArrayList和LinkedList区别?线程并发安全问题用LinkedList好吗?为什么不好?获取线程安全的List有哪些?
是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;
底层数据结构: ArrayList 是 数组;LinkedList 是双向链表数据结构(JDK1.6 之前为循环链表,JDK1.7 取消了循环。)
插入和删除是否受元素位置的影响:
ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行add(E e)方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是 O(1)。但是如果要在指定位置 i 插入和删除元素的话(add(int index, E element))时间复杂度就为 O(n-i)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。
LinkedList 采用链表存储,所以,如果是在头尾插入或者删除元素不受元素位置的影响(add(E e)、addFirst(E e)、addLast(E e)、removeFirst() 、 removeLast()),时间复杂度为 O(1),如果是要在指定位置 i 插入和删除元素的话(add(int index, E element),remove(Object o)), 时间复杂度为 O(n) ,因为需要先移动到指定位置再插入。
是否支持快速随机访问: LinkedList 不支持高效的随机元素访问,而 ArrayList 支持。快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index)方法)。
内存空间占用: ArrayList 的空 间浪费主要体现在在 list 列表的结尾会预留一定的容量空间,而 LinkedList 的空间花费则体现在它的每一个元素都需要消耗比 ArrayList 更多的空间(因为要存放直接后继和直接前驱以及数据)。
LinkedList没有做线程锁,多个线程同步访问的时候可能会导致数据损坏。线程锁就是可以保证某个方法或者某一段代码不会被多个线程同时访问。
获取线程安全的List我们可以通过Vector、Collections.synchronizedList()方法和CopyOnWriteArrayList三种方式
读多写少的情况下,推荐使用CopyOnWriteArrayList方式
读少写多的情况下,推荐使用Collections.synchronizedList()的方式
详解
10.ConcurrentHashMap和普通的HashMap有什么区别?
(1)HashMap不是线程安全的,而ConcurrentHashMap是线程安全的。
(2)ConcurrentHashMapNode + CAS(一条CPU并发原语)+ synchronized 来保证并发安全。
(3)ConcurrentHashMap让锁的粒度更精细一些,并发性能更好。
11.ConcurrentHashMap在1.8以后如何加锁的,原理?
JDK1.8中的ConcurrentHashMap实现,完全重构了JDK1.7,不再使用分段锁,而是给数组中的每个头节点都加锁,并且用的是synchronized。整体采用CAS+synchronized来保证并发的安全性。
synchronized锁升级
有四种状态:无锁,偏向锁,轻量级锁和重量级锁。
当一个对象被创建后,还没有线程进入,这个时候对象处于无锁状态。
这时有个线程A访问同步块获取锁时,锁对象会变成偏向锁,这个是通过CAS修改对象头中的锁标识位,偏向锁顾名思义就是偏向第一次获取到他的线程,第二次执行到代码块时,会先判断持有线程是否改变,没有就不用加锁了,避免了额外开销。
如果发生了锁竞争,这个时候偏向锁就会升级为轻量级锁,也就是自旋锁,通过不断CAS判断锁对是否被成功获。
长时间的自旋比较消耗性能,所以会控制自旋次数,默认是10次,如果超过次数就会升级为重量级锁,升级后,发生锁竞争,没有获取到锁的就会自动挂起,等待被唤醒。
这个升级过程是不可逆的。
put操作
判断表是否为空,如果为空就初始化表initTable(),只有一个线程可以初始化成功。
如果已经初始化,则找到当前key所在桶是判断是否为空,若为空则通过CAS把新节点插入此位置casTabAt(),只有一个线程可以CAS成功
如果key所在桶不为空,则判断节点的hash值是否为-1,若为-1则说明当前数组正在扩容。
如果如果key所在桶不为空,且没在扩容,则给桶中的第一个节点对象加锁synchronized,然后判断是否是链表或者树,然后插入数据。
判断链表长度是否大于8,如果是链表转为红黑树。ConcurrentHashMap实现原理(JDK1.7和JDK1.8)
12.HashMap和ConcurrentHashMap扩容机制?
HashMap 默认的初始化大小为 16。之后每次扩充,容量变为原来的 2 倍。(超过16*0.75(加载因子)才会扩容);
ConcurrentHashMap 容的原理是基于HashMap的,通过使用变化锁和分段锁来保护扩容操作,从而允许在多线程环境中安全地扩容。它的实现提高了多线程编程的性能,同时也带来了安全的索引数据结构。
13.HashMap的Put过程?
1.如果定位到的数组位置没有元素 就直接插入。
2.如果定位到的数组位置有元素就和要插入的 key 比较,如果 key 相同就直接覆盖,如果 key 不相同,就判断是否是一个树节点,如果是就调用e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value)将元素添加进入。如果不是就遍历链表插入(插入的是链表尾部)。
14.HashMap什么情况会丢失数据?
hash冲突?同时两个线程处理
15.MySQL引擎?两个区别?什么时候是行级锁?什么时候表级锁?MVCC用来做什么的?
MyISAM 和InnoDB
1.MyISAM 只有表级锁(table-level locking),而 InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。
2.MyISAM 不支持事务,而 InnoDB 支持。
3.MyISAM 不支持外键,而 InnoDB 支持。
4.MyISAM 不支持数据库异常崩溃后的安全恢复,而 InnoDB 支持。
5.MyISAM 不支持MVCC(多版本并发控制原理),而 InnoDB 支持。
6.虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是两者的实现方式不太一样。
MyISAM索引文件和数据文件是分离的;InnoDB数据文件本身就是索引文件,数据文件本身就是按 B+Tree 组织的一个索引结构,树的叶节点 data 域保存了完整的数据记录。
命中索引时是行级锁;
MVCC和undo log一起解决事务的问题
16.分库分表有没有用过?用的是sharding还是Mycat?
ShardingSphere
Mycat
17.什么场景索引失效?
使用 SELECT * 进行查询;
创建了联合索引,但查询条件未准守最左匹配原则;
在索引列上进行计算、函数、类型转换等操作;
以 % 开头的 LIKE 查询比如 like ‘%abc’;
查询条件中使用 or,且 or 的前后条件中有一个列没有索引,涉及的索引都不会被使用到;
18.事务失效场景?
1.访问权限为private,这样最终会导致事务失效,spring要求被代理方法必须是public的。
2. 方法用final修饰;某个方法是static的,同样无法通过动态代理,变成事务方法。
3. 同一个类中的方法直接内部调用,会导致事务失效。
4.未被spring容器管理.(spring事务的前提是:对象要被spring管理,@Controller、@Service、@Component、@Repository等注解。)
详细场景描述
19.Redis过期的Key需要清理,淘汰策略?
volatile-lru,针对设置了过期时间的key,使用lru算法进行淘汰。
volatile-lfu,针对设置了过期时间的key,使用lfu算法进行淘汰。
allkeys-lru,针对所有key使用lru算法进行淘汰。
allkeys-lfu,针对所有key使用lfu算法进行淘汰。
volatile-random,从所有设置了过期时间的key中使用随机淘汰的方式进行淘汰。
allkeys-random,针对所有的key使用随机淘汰机制进行淘汰。
volatile-ttl,删除生存时间最近的一个键。
noeviction(默认),不删除键,值返回错误。
20.Redis业务场景删除不用的key?
21.Redis数据类型?分别场景?分别的数据结构?
String(字符串):常规数据(比如 session、token、图片地址、序列化后的对象)的缓存;分布式锁(利用 SETNX key value 命令可以实现一个最简易的分布式锁);
Hash(散列):对象数据存储场景(用户信息、商品信息、文章信息、购物车信息);
List(列表):(最新文章、最新动态)信息流展示;(和LinkedList比较像,快速查询)
Set(集合):(文章点赞、动态点赞等场景)需要存放的数据不能重复的场景;(共同好友(交集)、好友推荐(差集))需要获取多个数据源交集、并集和差集的场景;
Zset(有序集合):需要随机获取数据源中的元素根据某个权重进行排序的场景(排行榜)
数据结构的一些介绍
22.Redis持久化策略?优缺点?
RDB:创建快照来获得存储在内存里面的数据在某个时间点上的副本。
AOF:每执行一条会更改 Redis 中的数据的命令,Redis 就会将该命令写入到内存缓存 server.aof_buf 中,然后再根据 appendfsync 配置来决定何时将其同步到硬盘中的 AOF 文件。
rdb的优点:体积更小;恢复更快;性能更高; 缺点:RDB 的数据安全性不如 AOF
一些详细可参考
23.Redis分布式锁?
参考回答
比较多的实现方式
4.5年常见面试题5(法本-麦当劳1/2)相关推荐
- mysql关于时间的面试题,mysql时间设置默认值MySQL常见面试题
1.limit(选出10 到20 条) select * from students order by id limit 9,10; 2.MySQL 会使用索引的操作符号 =,>,=,betwe ...
- java类型转换面试题_JavaSE:数据类型之间的转换(附常见面试题)
数据类型之间的转换 分为以下几种情况: 1)低级到高级的自动类型转换: 2)高级到低级的强制类型转换(会导致溢出或丢失精度): 3)基本类型向类类型转换: 4)基本类型向字符串的转换: 5)类类型向字 ...
- Spring常见面试题及答案汇总1000道(春招+秋招+社招)
Spring面试题以及答案整理[最新版]Spring高级面试题大全(2021版),发现网上很多Spring面试题都没有答案,所以花了很长时间搜集,本套Spring面试题大全,汇总了大量经典的Sprin ...
- Java多线程常见面试题及答案汇总1000道(春招+秋招+社招)
Java多线程面试题以及答案整理[最新版]Java多线程高级面试题大全(2021版),发现网上很多Java多线程面试题都没有答案,所以花了很长时间搜集,本套Java多线程面试题大全,汇总了大量经典的J ...
- MySQL常见面试题及答案汇总1000道(春招+秋招+社招)
MySQL面试题以及答案整理[最新版]MySQL高级面试题大全(2021版),发现网上很多MySQL面试题都没有答案,所以花了很长时间搜集,本套MySQL面试题大全,汇总了大量经典的MySQL程序员面 ...
- Jvm常见面试题及答案汇总1000道(春招+秋招+社招)
Jvm面试题以及答案整理[最新版]Jvm高级面试题大全(2021版),发现网上很多Jvm面试题都没有答案,所以花了很长时间搜集,本套Jvm面试题大全,汇总了大量经典的Jvm程序员面试题以及答案,包含J ...
- Dubbo常见面试题及答案汇总1000道(春招+秋招+社招)
Dubbo面试题以及答案整理[最新版]Dubbo高级面试题大全(2021版),发现网上很多Dubbo面试题都没有答案,所以花了很长时间搜集,本套Dubbo面试题大全,汇总了大量经典的Dubbo程序员面 ...
- Java常见面试题,2021年及答案汇总
Java常见面试题,2021年及答案汇总 其实,博主还整理了,更多大厂面试题,直接下载吧 下载链接:高清172份,累计 7701 页大厂面试题 PDF 1.什么是ThreadPoolExecutor? ...
- mybatis基础综合/常见面试题
概念/作用: 持久层框架,通过xml或注解的方式将要执行的各种 statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句.最后mybatis ...
- Python爬虫常见面试题(二)
前言 之所以在这里写下python爬虫常见面试题及解答 一是用作笔记,方便日后回忆: 二是给自己一个和大家交流的机会,互相学习.进步,希望不正之处大家能给予指正: 三是我也是互联网寒潮下岗的那批人之一 ...
最新文章
- 谈国内软件测试盲点和与国外的差别
- BED文件如何排序,sort按列排序
- XamarinSQLite教程创建数据表
- 【PAT乙级】 1015 德才论 (25 分)
- Java 比较两个日期的方法
- UE4 在C++ 动态生成几何、BSP体、BRUSH ---- MESH_GENERATION
- 侣信即时通讯系统全新发布
- 计算机加域后数据库无法登录,客户端多台计算机登录域失败,显示如下
- html - html5 audio 音乐自动播放,循环播放等9款播放器
- 计算机硬盘哒哒响,教你轻松解决硬盘异响(咔咔或者嗒嗒声)
- Labwindows/CVI 编写CAN通讯的上位机
- gitlab无法推送
- js解决m3u8视频无法播放问题
- 简单提取iOS13的ipsw固件的内置壁纸(或文件)
- 利用输入法输入汉字,如何统计字数
- 常用函数式接口及Stream流
- suse linux 修复模式,用 SuSE Linux Rescue Mode 恢复超级用户口令
- [转贴] 这是我和一个偷吃禁果的女孩子的故事
- C语言读取指定文件夹下面的所有文件
- 设置里怎么开启微信定位服务器,微信定位开启怎么设置(如何开启微信定位功能)...