1、zookeeper怎么做分布式锁
分布式锁是控制分布式系统之间同步访问共享资源的一种方式
分布式锁又分为排他锁和共享锁两种
排它锁
ZooKeeper如何实现排它锁
1、定义锁
ZooKeeper 上的一个 机器节点 可以表示一个锁
2、获得锁
把ZooKeeper上的一个节点看作是一个锁,获得锁就通过创建临时节点的方式来实现。
ZooKeeper 会保证在所有客户端中,最终只有一个客户端能够创建成功,那么就可以
认为该客户端获得了锁。同时,所有没有获取到锁的客户端就需要到/exclusive_lock
节点上注册一个子节点变更的Watcher监听,以便实时监听到lock节点的变更情况。
3、
释放锁
因为锁是一个临时节点,释放锁有两种方式
当前获得锁的客户端机器发生宕机或重启,那么该临时节点就会被删除,释放锁
正常执行完业务逻辑后,客户端就会主动将自己创建的临时节点删除,释放锁。
4、无论在什么情况下移除了lock节点,ZooKeeper 都会通知所有在 /exclusive_lock 节点上注册了节点变更 Watcher 监听的客户端。这些客户端在接收到通知后,再次重新发起分布式锁获取,即重复『获取锁』过程。
共享锁
(所有节点都有读取资源的权利,但是想要完成操作,必须等获取共享锁的节点都读完才可以完成操作)
Zookeeper 却很容易实现这个功能,实现方式也是需要获得锁的 Server 创建一个 EPHEMERAL_SEQUENTIAL 目录节点,然后调用 getChildren方法获取当前的目录节点列表中最小的目录节点是不是就是自己创建的目录节点,如果正是自己创建的,那么它就获得了这个锁,如果不是那么它就调用 exists(String path, boolean watch) 方法并监控 Zookeeper 上目录节点列表的变化,一直到自己创建的节点是列表中最小编号的目录节点,从而获得锁,释放锁很简单,只要删除前面它自己所创建的目录节点就行了。
2、nginx负载均衡和反向代理
正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;
反向代理,"它代理的是服务端,代服务端接收请求",主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
反向代理的作用:
(1)保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网
(2)负载均衡,通过反向代理服务器来优化网站的负载
正向代理和反向代理很有可能会存在在一个应用场景中,正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向单利服务器,反向代理了多台真实的业务处理服务器。
Nginx负载均衡算法
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。
2、weight(轮询权值)
weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
3、ip_hash
每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。
4、fair
比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块。
5、url_hash
按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。
3、什么是集群?什么是分布式?什么是SOA?
多台服务器跑的都是一套完整的代码,这就叫集群。
多台服务器合起来跑的才是一套完整代码,这就叫分布式。
在分布式这种横向拆分的基础上又做了纵向拆分。就变成SOA架构。
SOA:Service Oriented Architecture面向服务的架构。也就是把工程拆分成服务层、表现层两个工程。服务层中包含业务逻辑,只需要对外提供服务即可。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。
5、消息队列(MQ)(先进先出,主要用于秒杀活动)
消息队列的特点:异步、解耦、广播、流量削峰与流控
6、React native生命周期
实例化阶段:主要函数
componentWillMount:
该函数类似于iOS中的VillWillAppear,在组件即将加载在视图上调用。
render:
该函数组件必有的,通过返回JSX或其他组件来构成DOM,换言之,就是组件的核心渲染过程。
componentDidMount:
在执行完render函数之后,该函数被执行,我们通常可以在该函数当中做一些复杂操作,如网络请求。
存在阶段:
componentWillReceiveProps:
组件将要修改props或者state
shouldComponentUpdate:
常用于优化
componentWillUpdate:
组件更新时调用
componentDidUpdate:
组件更新完毕时调用
销毁阶段:
componentWillUnmount:
flaxbox来布局
state变化重新加载
props父页面传子页面
属性横杠取而代之的是驼峰命名
生成发行APK包
$ cd android
$ ./gradlew assembleRelease
运行
$ react-native run-android
7、Kafka
Kafka是一个快速、可扩展的、高吞吐、可容错的分布式发布订阅消息系统
SPARK是一种计算引擎
Impala是Cloudera公司主导开发的新型查询系统,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase中的PB级大数据。
elasticsearch简写es,es是一个高扩展、开源的全文检索和分析引擎,它可以准实时地快速存储、搜索、分析海量的数据。
Kafka的优势在于:
可靠性:Kafka是一个具有分区机制、副本机制和容错机制的分布式消息系统
可扩展性:Kafka消息系统支持集群规模的热扩展
高性能:Kafka在数据发布和订阅过程中都能保证数据的高吞吐量。即便在TB级数据存储的情况下,仍然能保证稳定的性能。
应用场景
1.日志收集
2.消息系统
3.运营指标
4.流式处理
8、高并发
(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。?
提高系统并发能力的方式,方法论上主要有两种:垂直扩展(Scale Up)与水平扩展(Scale Out)。前者垂直扩展可以通过提升单机硬件性能,或者提升单机架构性能,来提高并发性,但单机性能总是有极限的,互联网分布式架构设计高并发终极解决方案还是后者:水平扩展。?
互联网分层架构中,各层次水平扩展的实践又有所不同:?
(1)反向代理层可以通过“DNS轮询”的方式来进行水平扩展;?
(2)站点层可以通过nginx来进行水平扩展;?
(3)服务层可以通过服务连接池来进行水平扩展;?
(4)数据库可以按照数据范围,或者数据哈希的方式来进行水平扩展;?
各层实施水平扩展后,能够通过增加服务器数量的方式来提升系统的性能,做到理论上的性能无限。
9、什么是dubbo
Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,内部使用了 Netty、Zookeeper,保证了高性能高可用性。
Dubbo 使用的是 RPC 通信,而 Spring Cloud 使用的是 HTTP RESTFul 方式。
dubbo配置方式:
1)Spring 配置方式
2)Java API 配置方式
10、socket
socket是“open—write/read—close”模式的一种实现
11、jpa和mybatis的区别
第一、jpa是对象与对象之间的映射,而mybatis是对象和结果集的映射。
第二、jpa移植性比较好,不用关心用什么数据库,因为mybatis自由写sql语句,所以当项目移植的时候还需要改sql。
第三、当需要修改字段的时候mybatis改起来特别费事,而jpa就相对简单。
11、sql优化建议
1、建表时,先不增加索引,所有数据插入后再创建索引
2、将单条插入改为批量插入,因为每次插入都会去请求数据库,调用数据库资源,这样做可以节省数据库资源
3、对查询进行优化的时候,尽量避免全表扫描,首先考虑在where和order by涉及的列上建立索引
4、尽量避免在where 子句后的字段近行null判断,或者使用!=或者<>操作符,or,in,not in,这样会导致全表扫描。
12、单例模式
1、饿汉式:在程序启动或单件模式类被加载的时候,单件模式实例就已经被创建。
2、懒汉式:当程序第一次访问单件模式实例时才进行创建。
13、MySQL的四种事务隔离级别
事务的基本要素:
1、原子性(Atomicity):事务开始后,要么都做,要么都不做。
2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。
3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。
4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
事务的并发问题
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
MySQL事务隔离级别
读未提交数据
不可重复读
可重复读
串行化
14、java常见的设计模式
单例模式、工厂模式、装饰着模式、建造者模式、适配器模式、代理模式
15、链表
链表最大的特点就是不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。
链表有很多种不同的类型:单向链表,双向链表以及循环链表。
16、tomcat默认的端口是8005、8080、8009
17、怎么查询关闭进程
DOS环境下:netstat -ano,列出所有端口的情况,查找被占用端口
tasklist|findstr "2720"找到是哪个进程占用了端口
在任务管理器中查找进程的PID,并关闭进程
18、java8新特性
1.Lambda表达式
2.Stream函数式操作流元素集合
3.接口新增:默认方法与静态方法
4.方法引用,与Lambda表达式联合使用
5.引入重复注解
6.类型注解
7.最新的Date/Time API (JSR 310)
8.新增base64加解密API
9.数组并行(parallel)操作
10.JVM的PermGen空间被移除:取代它的是Metaspace(JEP 122)元空间
19、原生态js怎么序列化
20、java常见数据结构
数组
栈:提供后进先出的存取方式
队列 :提供先进先出的存取方式
链表
二叉树
红黑树
2-3-4树
哈希表
堆
21、redis的哨兵机制
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
Redis的哨兵(sentinel) 系统用于管理多个 Redis 服务器,该系统执行以下三个任务:
?
监控(Monitoring): 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。
提醒(Notification):当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效
22、Mysql数据库表被锁定处理
1、查进程,查找被锁表的那个进程的ID
show processlist;
command 为waitting的就是锁住的表,info为执行某条语句的信息,id为进程。
2、kill掉锁表的进程ID
kill id;
23、Spring Boot中的特殊注解
@SpringBootApplication
@SpringBootConfiguration
@EnableAutoConfiguration
@ResponseBody
@ComponentScan
@Controller
@Service
23、mysql和oracle的区别
(1) 对事务的提交
MySQL默认是自动提交,而Oracle默认不自动提交,需要用户手动提交,需要在写commit;指令或者点击commit按钮
(2) 分页查询
MySQL是直接在SQL语句中写"select... from ...where...limit x, y",有limit就可以实现分页;而Oracle则是需要用到伪列ROWNUM和嵌套查询
(3) 事务隔离级别
MySQL是read commited的隔离级别,而Oracle是repeatable read的隔离级别,同时二者都支持serializable串行化事务隔离级别,可以实现最高级别的
读一致性。每个session提交后其他session才能看到提交的更改。Oracle通过在undo表空间中构造多版本数据块来实现读一致性,每个session
查询时,如果对应的数据块发生变化,Oracle会在undo表空间中为这个session构造它查询时的旧的数据块
MySQL没有类似Oracle的构造多版本数据块的机制,只支持read commited的隔离级别。一个session读取数据时,其他session不能更改数据,但
可以在表最后插入数据。session更新数据时,要加上排它锁,其他session无法访问数据
(4) 对事务的支持
MySQL在innodb存储引擎的行级锁的情况下才可支持事务,而Oracle则完全支持事务
(5) 保存数据的持久性
MySQL是在数据库更新或者重启,则会丢失数据,Oracle把提交的sql操作线写入了在线联机日志文件中,保持到了磁盘上,可以随时恢复
(6) 并发性
MySQL以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新此表中的数据。
虽然InnoDB引擎的表可以用行级锁,但这个行级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使用索引,那么仍然使用表级锁。
Oracle使用行级锁,对资源锁定的粒度要小很多,只是锁定sql需要的资源,并且加锁是在数据库中的数据行上,不依赖与索引。所以Oracle对并
发性的支持要好很多。
(7) 逻辑备份
MySQL逻辑备份时要锁定数据,才能保证备份的数据是一致的,影响业务正常的dml使用,Oracle逻辑备份时不锁定数据,且备份的数据是一致
(8) 复制
MySQL:复制服务器配置简单,但主库出问题时,丛库有可能丢失一定的数据。且需要手工切换丛库到主库。
Oracle:既有推或拉式的传统数据复制,也有dataguard的双机或多机容灾机制,主库出现问题是,可以自动切换备库到主库,但配置管理较复杂。
(9) 性能诊断
MySQL的诊断调优方法较少,主要有慢查询日志。
Oracle有各种成熟的性能诊断调优工具,能实现很多自动分析、诊断功能。比如awr、addm、sqltrace、tkproof等
(10)权限与安全
MySQL的用户与主机有关,感觉没有什么意义,另外更容易被仿冒主机及ip有可乘之机。
Oracle的权限与安全概念比较传统,中规中矩。
(11)分区表和分区索引
MySQL的分区表还不太成熟稳定。
Oracle的分区表和分区索引功能很成熟,可以提高用户访问db的体验。
(12)管理工具
MySQL管理工具较少,在linux下的管理工具的安装有时要安装额外的包(phpmyadmin, etc),有一定复杂性。
Oracle有多种成熟的命令行、图形界面、web管理工具,还有很多第三方的管理工具,管理极其方便高效。
(13)最重要的区别
MySQL是轻量型数据库,并且免费,没有服务恢复数据。
Oracle是重量型数据库,收费,Oracle公司对Oracle数据库有任何服务。
24、nginx配置
25、maven/git
26、ArrayList属于动态数组结构
27、volatile关键字的作用
1.关键字volatile是Java虚拟机提供的最轻量级的同步机制
2. 保证此变量对所有线程的可见性,“可见性”指当一条线程修改了这个变量的值,新的值对与其他线程来说是立即得知的。
3. 禁止指令重排序优化。
28、悲观锁和乐观锁
悲观锁:总是假设最坏的情况,每次去拿数据的时候都会认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿到这个数据的时候就会阻塞,直到它拿到锁。
乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。
29、spring中Bean的五个作用域
singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例
prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例
request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效
session:对于每次HTTP Session,使用session定义的Bean都将产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效
globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效
30、HashCurrentMap和HashMap的区别
HashMap线程不安全,HashCurrentMap线程安全
ConcurrentHashMap源码中可以看出,它引入了一个“分段锁”的概念,具体可以理解为把一个大的Map拆分成N个小的HashTable,根据key.hashCode()来决定把key放到哪个HashTable中。
31、springboot和spring的区别
32、过滤器和拦截器
拦截器和过滤器都可以用来实现横切关注功能,其区别主要在于:
①拦截器是基于JAVA反射机制的,而过滤器是基于函数回调的
②过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器
③拦截器只能对Action请求起作用(Action中的方法),而过滤器可以对几乎所有的请求起作用(CSS JSP JS)
33、二分法、冒泡排序方式思路及实现
思路:
首先二分法排序必须为有序数组,从中查找某一元素,如果此元素在这个数组中则返回下标,不在则返回-1;
通过数组的长度取其中间值,然后与要查找的元素相比较,如果大于则下次循环应该从左边查找,小于则从右边;
二分法排序快的原因是它并没有循环所有元素,而是折半查询,但是需要有序数组这一必要条件
冒泡排序就是从数组的第一个数开始,一次和后面的数相比,若前者大则交换顺序,直到所有大的数冒到最后,最后按照从小到大排序。
34、什么是ThreadLocal,在什么场景下用
ThreadLocal是一个关于创建线程局部变量的类。
通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改。
经典的使用场景是为每个线程分配一个 JDBC 连接 Connection。这样就可以保证每个线程的都在各自的 Connection 上进行数据库的操作,不会出现 A 线程关了 B线程正在使用的 Connection; 还有 Session 管理 等问题。
35、linux查看网络、内存、日志的命令
查看网络状态命令 ifconfig
查看网络状态是否通畅 telnet ip 端口号
查看内存 free
查看日志 tail -f catalina.out