处理高并发问题
1、负载均衡,服务器端可以做负载均衡集群,分摊系统的工作,减少单一服务器的资源负担
2、缓存,对于高并发场景来说,大多数都是读多写少,所以缓存是必须用到的,redis可以轻松解决几万的并发
3、分库分表,对于表的设计来说,将一个数据库分为若干个库,可以对抗更高的并发,对于表来说也是,多个表的数据量保持少一点,可以提高sql的性能
4、读写分离,对于高并发来说,多数是读多写少,没必要将所有请求集中在一个库上,主从架构,主库写入,从库读取,缓解数据库的压力
5、MQ(消息队列),对于耗时时间比较长的请求可以使用MQ排队,异步处理,减轻服务器压力,增加稳定性
Spring Cloud几大组件?
1、服务的注册中心:Eureka
2、负载均衡:Ribbon/Feign
3、网关:Zuul
4、配置中心:Config
5、熔断器:Hystrix
对于Cookie的理解
Cookie是当你浏览网站时,由web服务器存储在你的机器硬盘上的一个文本文件,记录了用户名、密码、网页的信息、停留时间等
对于熔断与降级的理解
1、触发条件不同
熔断一般是某一个服务器宕机引起的,降级一般是从整体的负荷上考虑
2、管理目标的层次不同
熔断是一个框架级的处理,没有层次之分,每一个微服务都需要,降级有层次之分,一般是从最外围开始
谈谈对单例模式和工厂模式的理解
单例模式简单理解就是一个特殊的类,通过单例模式可以保证系统中一个类中只有一个实例 工厂模式就是实例化对象模式,通过工厂模式可以代替new操作
常见的运行时异常
ArthmeticException(算术异常)
ClassCastException(类装换异常)
ClassNotFoundException(类检查异常)
IndexOutOfBoundsException(下标越界异常)
NumberFormatException(数字格式异常)
NullPointerException(空指针异常)
SecurityException(安全异常)
数据库左连接和右连接的区别
左连接Where只影响右表,右连接Where只影响左表
数据库的存储过程
简单来说就是为了以后的使用而保存的一条或者多条sql语句的集合,可以理解为批处理文件,但是作用不仅限于批处理
数据库索引什么时候失效
条件中有or、like查询以%开头、!=
Jvm调优方式,怎么调优
利用调优工具:Jconsole,jProfile,VisualVM
Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法 有很详细的跟踪。
JProfiler:商业软件,需要付费。功能强大。
VisualVM:JDK自带,功能强大,与JProfiler类似。推荐。
如何调优:
观察内存释放情况、集合类检查、对象树,以上工具提供了堆信息查看功能,可以查看堆空间大小分配、提供垃圾回收功能、垃圾监控。
堆和栈什么时候溢出
数组访问越界、指针非法异常、函数层次调用层次太深、动态申请空间使用之后没有释放
Sleep(),Wait区别
sleep是Thread类的静态本地方法,wait是Obiect类本地方法
sleep方法不会释放lock,但是wait会释放,而且会加入到等待队列中
sleep方法不依赖于Synchronized,但是wait需要
sleep不需要被唤醒,但是wait需要
sleep一般用于当前线程休眠,或者轮询暂停操作,wait多用于多线程之间通信
创建线程都有哪些方式
继承Thread类,实现Runnablej接口,实现Callable接口
线程安全怎么实现
加锁 利用Synchronized或者ReenTrantLock来对不安全对象进行加锁,来实现线程执行的串行化,从而保证多线程同时操作对象的安全性,一个是语法层面的互斥锁,一个是API层面的互斥锁.
Java有几种线程池
newCachedThreadPool:可缓存线程池,线程池无限大,当执行当前任务时上一个任务已经完成,会复用执行上一个任务的线程,而不用每次新建线程
如果上一个线程没有结束则会新建线程
newFixedThreadPool:可重用固定个数的线程池,当前线程数大于总数则会进行等待,等待线程池内的线程执行完,相对来说比较少占内存,如果等待线程过多也是相对消耗资源的
ScheduledThreadPool:可重用固定个数的线程池,当前线程数大于总数则会进行等待,并且可以设置线程延迟执行时间
newSingleThreadExecutor:单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。缺点就是单线程执行,当线程多的时候执行速度比较慢
自定义线程池(ThreadPoolExecutor和BlockingQueue连用)BlockingQueue是双缓冲队列。BlockingQueue内部使用两条队列,允许两个线程同时向队列一个存储。,一个取出操作。在保证并发安全的同时,提高了队列的存取效率。
消息队列RabbitMQ的处理流程,消息发送失败怎么处理
在消息队列中,通常有生产者和消费者两个角色。生产者只负责发送数据到消息队列,谁从消息队列中取出数据处理他不管。消费者只负责从消息队列中取出数据处理,他不管这是谁发送的数据。
人工处理(捕获异常处理,手动ACK,回调处理)、自动重发
IO流的特点
1、设备之间的传输
2、Java用于操作数据的对象都在java.io包中
3、java对数据的操作是通过流的方式
Spring bean自动装配有哪些方式
no:默认方式,手动装配方式,需要通过ref设定bean的依赖关系
byName:根据bean的名字进行装配,当一个bean的名称和其他bean的属性一致,则自动装配
byType:根据bean的类型进行装配,当一个bean的属性类型与其他bean的属性的数据类型一致,则自动装配
constructor:根据构造器进行装配,与 byType 类似,如果bean的构造器有与其他bean类型相同的属性,则进行自动装配
autodetect:如果有默认构造器,则以constructor方式进行装配,否则以byType方式进行装配
Spring boot启动类注解有哪些?启动器有哪些?
1、@SpringBootApplication
核心注解: @Configuration 注解,实现配置文件的功能。 @EnableAutoConfiguration 打开自动配置的功能也可关闭某个自动配置选项 @ComponentScan:Spring组件扫描组成
2、@EnableFeignClients(服务之间远程调用)
3、@EnableEurekaClient(服务注册到注册中心)
4、@MapperScan("***.***.test.dao")
Spring boot启动器共44个
核心启动器Spring-boot-starter,包含了自动配置、日志、YAML
监控和管理应用Spring-boot-stsrter-actuator
面向切面编程Spring-boot-starter-aop
支持JDBC数据库Spring-boot-starter-jdbc
测试Spring-boot-starter-test
web开发Spring-boot-starter-web
redis穿透击穿雪崩
缓存穿透:缓存和数据库中都没有的数据,而用户不断发起请求,很可能是攻击者,会造成数据库压力过大
解决方案:创造一个数据空对象,存在缓存中,这样就不会查询数据库
缓存击穿:缓存中没有但数据库中有,由于同一请求多,会瞬间造成数据库压力增大
解决方案:设置热点数据不过期、用Redislock锁
缓存雪崩:缓存中不同数据大批量过期,引起数据库压力过大甚至宕机
解决方案:过期时间设置随机、缓存数据分布式部署,分布在不同数据库中、设置热点数据不过期