面试汇总

2020 04 19

面试遇到被提问到的问题

1、说说你对微服务的理解
2、redis是单线程的还是多线程的
3、redis高并发如何解决

一、说说你对微服务的理解

1、 什么是单体架构,以及单体架构的优缺点

1.1 单体架构的概述:
一般的单体架构分三层,表现层,业务逻辑层,持久层(数据访问层),这样子的架构把所用的业务场景都放在一个工程中,一次编译,部署在一个服务器。架构图如下

在这里插入图片描述

1.2、单体架构的优缺点
优点:单体架构的开发难度相对较低,开发成本低,开发速度快
缺点:单体架构的业务耦合度相对较高,而且,随着并发量越来越高,单体架构的并发能力短板就显露出来了
(如果一个系统部署在一个tomcat上,一个tomcat的同时访问量是500),随着代码量的增加,代码的可读性就
降低了,而且业务功能的叠加也困难

2、微服务

微服务架构是分布式架构的一种,简单来说微服务是把一个系统拆分成若干个功能模块,通过模块间的相互调用来完成
系统的工作内容。
好处:1、每个微服务的可以单独部署,运行,利于分工,将复杂的问题简单化,微服务之间不相互影响,一个微服务挂了不影响其它的微服务。 
	 2、微服务是一个分布式架构,业务与业务之间完全解耦,具有极强的横向扩充能力。
	 3、微服务技术栈不受限,不同的微服务完全可以用不同的编程语言来写
	 4、局部修改容易部署,哪个模块出现了bug我们只需要解决那个模块的bug就可以了,解决完bug之后,我们只需要重启这个模块的服务即可,部署相对简单,不必重启整个项目从而大大节约时间
	 5、由于微服务单个模块就相当于一个项目,开发这个模块我们就只需关心这个模块的逻辑即可,代码量和逻辑复杂度都会降低,从而易于开发和维护
缺点:
	 1、运维要求较高
	 	对于单体架构来讲,我们只需要维护好这一个项目就可以了,但是对于微服务架构来讲,由于项
	 目是由多个微服务构成的,每个模块出现问题都会造成整个项目运行出现异常,想要知道是哪个模块造成的问题往往
	 是不容易的,因为我们无法一步一步通过debug的方式来跟踪,这就对运维人员提出了很高的要求。
	 2、分布式的复杂性
		 对于单体架构来讲,我们可以不使用分布式,但是对于微服务架构来说,分布式几乎是必会用的技术,由于分布式
	本身的复杂性,导致微服务架构也变得复杂起来。
	 3、接口调整成本高
	 	比如,用户微服务是要被订单微服务和电影微服务所调用的,一旦用户微服务的接口发生大的变动,那么所有依赖
	它的微服务都要做相应的调整,由于微服务可能非常多,那么调整接口所造成的成本将会明显提高。

二、redis是单线程的还是多线程的

redis是单线程的

(1) 绝大部分请求是纯粹的内存操作(非常快速)
(2) 采用单线程,避免了不必要的上下文切换和竞争条件
(3) 非阻塞IO - IO多路复用
IO多路复用中有三种方式:select,poll,epoll。需要注意的是,select,poll是线程不安全的,epoll是线程安全的
redis内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间 这3个条件不是相互独立的,特别是第一条,如果请求都是耗时的,采用单线程吞吐量及性能可想而知了。应该说redis为特殊的场景选择了合适的技术方案。

线程池的原理及作用
		线程集合workerSet和一个阻塞队列
		多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,
		增加处理器单元的吞吐能力
线程池的使用
		     一个线程池包括以下四个基本组成部分:
            1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;
            2、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;
            3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;
            4、任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。
线程池的创建
		- 创建一个单线程的线程池:Executors.newSingleThreadExecutor()
		- 创建一个固定线程的线程池:Executors.newFixedThreadPool()
		- 创建一个可缓存的先程池:Executors.newCachedThreadPool()
		- 创建一个无限大小的线程池:Executors.newScheduledThreadPool()
hashTable和hashMap的区别
		* 1.HashMap是线程不安全的,效率高,JDK1.2版本
		* Hashtable是线程安全的,效率低,JDK1.0版本
		* 2.HashMap可以存储null键和null值
		* Hashtable不可以存储null键和null值
springboot常用注解
mysql脏读,幻读,不可重复读
		- 脏读:指一个事务读取到了另一个事务未提交的数据,造成了与数据库中的数据不一致的情况
		- 幻读:即一个事务A两次或多次读取数据,在此期间,事务B新增了N条数据,然后提交了,造成了事务A两次或多次读取数据出现了数据条数不一致的情况。
		- 不可重复读:即一个事务A两次或多次读取数据,在此期间,事务B读取同一数据,并修改了此数据,然后提交了,造成了事务A两次或多次读取数据出现了数据不一致的情况。
mysql,innoDb原理
redis排序
		SORT<key>  命令来实现,例如:SORT numbers 对number列表元素进行排序
为什么重写equals()方法的同时也要重写hashCode()方法
为了保证相同的两个对象的hashCode值相等。
				两个对象相等,hashcode一定相等
				两个对象不等,hashcode不一定不等
				hashcode相等,两个对象不一定相等
				hashcode不等,两个对象一定不等
什么是redis缓存击穿
 缓存穿透:某个key无论在缓存还是数据库中都没有,这时候请求会到达数据库,大量这种重复的请求把数据库压垮,称为缓存穿透
 缓存击穿:某个key在缓存中存在但是已经过期,这时候需要去查数据库,短时间内大量这样的请求会把数据库压垮,称为缓存击穿
 缓存雪崩:缓存服务器重启或者大量缓存在同一时间失效,会触发大量的数据库查询,这样会压垮数据库,称为缓存雪崩
Redis支持数据类型:
  Str,list,hash,set,zset
Redis持久化方式:
  RDB:指定的时间间隔把缓存中的数据写入磁盘
  AOF:以日志的形式记录每一个,写,和删除的操作,读数据不会记录
Java中的队列
  Queue
        Deque:双端队列
        BlockingQueue:阻塞队列
        AbstractQueue:非阻塞队列
线程实现方式
    1、继承Thread类
    2、实现Runnable接口
    3、实现Callable接口
    4、匿名内部类
Jwt实现原理
Nginx的负载均衡原理
Redis的数据淘汰机智
    1、从设置了过期时间的数据集中选择已经过期的淘汰
    2、从设置了过期时间的数据集中选择用的最少的淘汰
    3、从设置了过期时间的数据集中随意淘汰
    4、从数据集中选择最少用的淘汰
    5、从数据集中随意淘汰
    6、不淘汰(默认)
HashMap的底层结构
		每个元素都是链表(可能表述不准确)的数组,当添加一个元素(key-value)时,就首先计算元素key的hash值,
		以此确定插入数组中的位置,但是可能存在同一hash值的元素已经被放在数组同一位置了,这时就添加到同一hash
		值的元素的后面,他们在数组的同一位置,但是形成了链表,同一各链表上的Hash值是相同的,所以说数组存放的
		是链表。而当链表长度太长时,链表就转换为红黑树,这样大大提高了查找的效率
分布式事务
    4大特点:
          1、原子性:要么都成功,要么都失败
          2、一致性:事务执行之后,从一个一致性状态变成另一个一致性态。
          3、隔离性:事物之间不互相干扰。
          4、持久性:事务执行之后是永久的变更,不可以更改。
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wenriyan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值