文章目录
1.集合与分布式的区别?
分布式:一个业务分拆多个子业务,部署在不同的服务器上
集群:同一个业务,部署在多个服务器上
例子:小饭店原来只有一个厨师,切菜洗菜备料炒菜全干。后来客人多了,厨房一个厨师忙不过来,又请了个厨师,两个厨师都能炒一样的菜,这两个厨师的关系是集群。为了让厨师专心炒菜,把菜做到极致,又请了个配菜师负责切菜,备菜,备料,厨师和配菜师的关系是分布式,一个配菜师也忙不过来了,又请了个配菜师,两个配菜师关系是集群。
2.集群如何实现数据同步?
-
负载均衡mysql集群实现数据同步
mysql有四种常见的日志类型分别为:errot log 错误日志;general query log 查询日志;slow query log 慢查询日志;binary log 二进制日志。其中第四种binary log,主要记录了mysql数据更改记录。我们只要做到在多台服务器中监听这个日志变化,主动读取binary log,将binary log内容转成本身的relay log,然后自身通过relay log实现数据的同步改动即可实现数据同步。 -
redis实现数据同步
在Redis2.8以前,从节点向主节点发送sync命令请求同步数据,此时的同步方式是全量复制;在Redis2.8及以后,从节点可以发送psync命令请求同步数据,此时根据主从节点当前状态的不同,同步方式可能是全量复制或增量复制。全量复制
Redis通过psync命令进行全量复制的过程如下:
从节点判断无法进行增量复制,向主节点发送全量复制的请求;或从节点发送增量复制的请求,但主节点判断无法进行全量复制。主节点收到全量复制的命令后,执行bgsave,在后台生成RDB文件,并使用一个缓冲区(称为复制缓冲区)记录从现在开始执行的所有写命令。主节点的bgsave执行完成后,将RDB文件发送给从节点;从节点首先清除自己的旧数据,然后载入接收的RDB文件,将数据库状态更新至主节点执行bgsave时的数据库状态。主节点将前述复制缓冲区中的所有写命令发送给从节点,从节点执行这些写命令,将数据库状态更新至主节点的最新状态。如果从节点开启了AOF,则会触发bgrewriteaof的执行,从而保证AOF文件更新至主节点的最新状态。增量复制
从机连接主机后,会主动发起 PSYNC 命令,从机会提供 master 的 runid(机器标识,随机生成的一个串) 和 offset(数据偏移量,如果offset主从不一致则说明数据不同步),主机验证 runid 和 offset 是否有效,runid 相当于主机身份验证码,用来验证从机上一次连接的主机,如果 runid 验证未通过则,则进行全同步,如果验证通过则说明曾经同步过,根据 offset 同步部分数据。
3.有一个变量int a=0;两个线程同时进行+1操作,每个线程加100次,不加锁,最后a的值是()?
A.200
B.<=200
C.>=200
D.都有可能
答案:B
多核cpu,最小值2,最大值200
单核cpu,最小值100,最大值200
两个线程分别记为线程1和线程2,i++相当于取出i的值,加1,再放回去
第一种极端情况:每次线程一取出i的值后CPU时间切换到线程二,线程二也取出i的值,取到的值和线程一相等,线程二给i加一后放回去,线程一也将i加一后放回去,放回去的值也相等,相当于两个线程都执行一次i++操作,i的值只增加1,这样操作100次i的值为100
第二种极端情况:线程一和线程二间隔操作,即线程一对i++操作完成,把已经加一的数据放回去之后线程二再操作,轮流进行,最后每个线程都对i加了100次,i的值为200。
4.SpringBoot如何实现自动配置的?
@SpringBootApplication@SpringBootConfiguration@EnableAutoConfiguration是SpringBoot的三大核心注解。其中,@EnableAutoConfiguration注解的作用就是开启自动配置。进入这个注解可以看到通过@Import注解导入了@Import注解注入了EnableAutoConfigurationImportSelector类,这个选择器会扫描springboot的autoconfiguration包下的META-INF/spring.factories文件。这个文件可以看到很多的自动配置类,每一个xxxAutoConfiguration类都是容器中的一个组件,并且都会加入到容器中,在这些自动配置类加入到容器之后自动配置才开始生效。
5.事务的7种传播特性?
- PROPAGATION_REQUIRED
加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务。 - PROPAGATION_SUPPORTS
如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形式运行。 - PROPAGATION_MANDATORY
必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常。 - PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起。 - PROPAGATION_NOT_SUPPORTED
当前不支持事务。 - PROPAGATION_NEVER
不能在事务中运行。 - PROPAGATION_NESTED
理解Nested的关键是savepoint。他与PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,
而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。
而Nested事务的好处是他有一个savepoint。
6.HTTP和HTTPS的区别?
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
HTTPS和HTTP的区别主要如下:
- https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
7.线程中的同步和异步的区别?
同步(Sync)
所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作。根据这个定义,Java中所有方法都是同步调用,应为必须要等到结果后才会继续执行。我们在说同步、异步的时候,一般而言是特指那些需要其他端协作或者需要一定时间完成的任务。 简单来说,同步就是必须一件一件事做,等前一件做完了才能做下一件事。
异步(Async)
异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。
举个例子简单说明下两者的区别:
同步:火车站多个窗口卖火车票,假设A窗口当卖第288张时,在这个短暂的过程中,其他窗口都不能卖这张票,也不能继续往下卖,必须这张票处理完其他窗口才能继续卖票。直白点说就是当你看见程序里出现synchronized这个关键字,将任务锁起来,当某个线程进来时,不能让其他线程继续进来,那就代表是同步了。
异步:当我们用手机下载某个视频时,我们大多数人都不会一直等着这个视频下载完,而是在下载的过程看其他视频。这种的就是异步,你执行你的,我执行我的,互不干扰。