2020综合面试

  • JAVA基础
  1. 反射 
    什么是反射:  就是正在运行,动态获取这个类的所有信息 (属性,方法,构造方法)
    反 射 机 制: 将.class文件编译成.java,
  • 设计模式
  1. 责任链    将多个执行步骤连接起来形成的一条链,这个对象处理完,就会交给下一个对象去处理。网关设置IP白名单。
  2. 装饰       mybatis使用redis实现二级缓存,先判断二级(redis)是否有数据,在判断一级(jvm)。
  3. 模板+工厂:   定义抽象模板,在联合登录中设置联合登录请求处理获取openId、通过id获取用户、通过userId更新openId。
  4. 策略模式: 主要解决多重if判断问题,前端获取登录方式,通过登录获取从数据库获取对应的处理类class, 如果为空,表示该方式已关闭,否则通过反射的方式获取对应登录渠道的hander进行处理
  5. 单例模式:  饿汉、懒汉式
  6.  代理模式:  
     应用场景:  SpringAOP、事物原理、日志打印、权限控制、远程调用、安全代理 可以隐蔽真实角色

    1. 静态代理 
        自己写代理类
     2. 动态代理
          2.1 JDK动态代理
          2.2 cblib动态代理

  • Spring
  1.  是一个开源的轻量级的Java开发框架, 就是将我们Bean与bean之间的关系,交给Spring管理。 
     Spring的核心是IOC(控制反转)、DI(依赖注入)、AOP(面向切面编程)。
  2. 原理 
    解析xml, 获取bean的class地址,通过反射机制进行实例化对象。
  3. Spring的生命周密
      Singleton     只会创建一个实例对象,所有请求都会共享这个对象。默认单例。
      Prototype     表示每次请求都会实例化一个对象
      Request       每次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
      Session        每次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
  4.  Spring注入方式
      通过构造函数
      通过set方法注入
      通过p名称空间注入  原理也是通过set注入
  5.  AOP 
    通过使用@Aspect实现AOP,  通知方式:  前置通知、后置通知、运行通知、环绕通知
  • Spring事务
  1. 四大特征
    原子性    一个事务中包含的所有操作要么全部执行或全部不执行。
    隔离性    多个事务他们是互不干扰的
    持久性    一个事务一旦提交,那它的数据修改是永久性的 
    一致性    事务从一个状态变换到另一个状态,数据时一致性的。  如: A和B之间相互多次转账,最终的金额是不会变得。
  2. 事务的分类
    编程式事务    手动开启事务,提交事务
    声明式事务     xml事务、 注解事务
  3. 事务的七大传播特性 
    1. Propagation.REQUIRED
        调用方已经存在事务,则加入到同一个事务中运行,否则,自启一个事务
    2. Propagation.REQUIRES_NEW
        无论何时自身都会开启新事务
    3. Propagation.SUPPORTS
        调用方存在事务,则加入到同一个事务中运行,否则以非事务的方式运行
    4. Propagation.NOT_SUPPORTED
        调用方存在事务,则会被挂起,直到被调用方运行完毕后,事务恢复。
    5. Propagation.MANDATORY
         调用方存在事务,则加入到同一个事务中运行,若不存在,则抛出异常
    6. Propagation.NEVER
        调用方存在事务,则抛出异常
    7. Propagation.NESTED
        调用方存在事务,则运行一个嵌套事务,若不存在,则以Propagation.REQUIRED的方式运行,即开启一个新的事务
  4.  事务的隔离级别 
    隔离级别含义
    ISOLATION_DEFAULT使用后端数据库默认的隔离级别。
    ISOLATION_READ_UNCOMMITTED允许读取尚未提交的更改。可能导致脏读、幻影读或不可重复读。
    ISOLATION_READ_COMMITTED允许从已经提交的并发事务读取。可防止脏读,但幻影读和不可重复读仍可能会发生。
    ISOLATION_REPEATABLE_READ对相同字段的多次读取的结果是一致的,除非数据被当前事务本身改变。可防止脏读和不可重复读,但幻影读仍可能发生。
    ISOLATION_SERIALIZABLE完全服从ACID的隔离级别,确保不发生脏读、不可重复读和幻影读。这在所有隔离级别中也是最慢的,因为它通常是通过完全锁定当前事务所涉及的数据表来完成的。
  5. 脏读、幻读、不可重复读 
    脏读    一个事务读取了被另一个事务尚未提交的数据。 
    幻读   事务A根据条件查询数据时,事务B也根据该条件新增1条数据,此时多出数据事务A就很意外,侧重于新增、删除
    不可重复读  事务 A 多次读取同一数据,结果 不一致。侧重于修改。
  • mysql的事务隔离级别
  1. 读未提交 
    这是最宽松的隔离级别。
    在这个级别下,一个事务可以读取到其他事务中未提交的数据(脏读)。
    由于存在脏读的风险,这个级别很少被使用。
     
  2. 读已提交 
    这个级别的特点是事务只能读取到已经提交的数据。
    每个事务开始时看到的是一个快照,在该事务开始之后其他事务提交的更改不会被当前事务看到。
    虽然避免了脏读,但仍然可能出现不可重复读和幻读。
  3. 可重复读 
    这是MySQL默认的隔离级别。
    在这个级别下,事务会创建一个快照,对于该事务来说,在其执行过程中,这个快照不会改变,因此可以多次读取同一数据并获得相同的结果。
    虽然避免了脏读和不可重复读,但仍然可能出现幻读。
     
  4. 可串行化 
    这是最严格的隔离级别。
    在这个级别下,所有事务都被串行执行,确保没有并发问题。
    虽然保证了数据的一致性和准确性,但是可能会导致性能下降,因为需要锁定更多的资源。
     
  • MyBatis 
  1. MyBatis 是一款优秀的持久层框架,
            一级缓存是SqlSession级别的缓存。是存放JVM(HashMap)中,不能共享
            二级缓存是mapper级别的缓存,是存放redis等其他数据库中。二级缓存是跨SqlSession的,可以共享
    1. Mapper 接口在初始SqlSessionFactory 注册的。
    2. Mapper 接口注册在了名为 MapperRegistry 类的 HashMap中, key = Mapper class value = 创建当前Mapper的工厂。
    3. Mapper 注册之后,可以从SqlSession中get
    4. SqlSession.getMapper 运用了 JDK动态代理,产生了目标Mapper接口的代理对象。
    5. 动态代理的 代理类是 MapperProxy ,这里边最终完成了增删改查方法的调用
  • SpringBoot
  1.  介绍
     设计目的是用来简化Spring的搭建和配置过程,整合出来的快速开发框架。
  2.   启动流程
     
  • servlet生命周期
  1. 加载  
    当web容器启动时就会加载、创建Servlet实例,
  2. 初始化
    在处理客户端请求前完成一些初始化的工作,如建立数据库连接,读取资源文件信息等
  3. 服务
    调用doGet()或者doPost()方法进行业务逻辑处理
  4. 销毁
    当web容器关闭或者检测到一个Servlet要从容器中被删除时,会自动调用destroy()方法,让该实例释放掉所占用的资源。
  5. 卸载
    当一个Servlet调用完destroy()方法后,次实例将等待被垃圾收集器所回收
  6. tomcat 启动servlet
    tomcat服务器启动时,首先加载web.xml中配置的servlet。
  •   中间件
     
  1.  产生的背景 
     异步、非组赛
  2.  什么是JMS 
     JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输
  3.  JMS支持的2种消息模型
     点 对 点:    一个消息只能有一个消费者可以消费,不能重复消费。
     发布订阅:  生产者将消息发布到topic中,所有订阅该主题的消费者都可以消费该消息。
  4. 如何解决消息的顺序问题 
     采用单消费、单线程处理
     发送消息指定key,相同的key发送一个主题(队列)中
     
  5. 如何保证消息的幂等性
    设置手动签收
    通过消息ID判断
    通过mq推送的日志记录
  6. 如何解决消息堆积 
      a. RabbitMQ可以使用死信队列 
      b. 设置消息的有效期,mq会将过期未消息的消息删除,客户端通过代码监听删除的消息保存到日志,后期补偿。 
      c.  提高消费者的能力和服务器数量
     
  • RabbitMQ基础
  1.  RabbitMQ的四个核心概念
     virtual hosts(虚拟机)
              不同虚拟机可以区分不同的业务,比如订单、用户等,就像mysql有多个数据库的概念一样。每个VirtualHost是独立                 的,它们之间的exchange(交换机)、queue(队列)、message(消息)都是隔离的不能互通。
    交换机 (exchange) 
              生产者通常不会直接将消息发送到队列,而是先将消息先发送到交换机,然后交换机根据绑定的策略转发到队列中。
    队列 (queue)
              接收来自交换机、生产者发送消息的容器,遵循先进先出原则。
    路由键(RoutingKey)和绑定键 (BindingKey) 
                交换机与队列在绑定时,会指定一个binding key,生产者将消息发送给交换机时都会指定一个routing key;交换机              根据binding key与routing key一致、或符合匹配规则来判断,将消息就转发到对应的队列中。
  2.   RabbitMQ的5种队列形式
     1. 
    点对点(简单)的队列 
         一个生产者对应一个消费者
     
     2. 工作(公平性)队列模式 
          一个生产者对应多个消费者,但是只能有一个消费者获得消息,当消费者处理完消息后,才会接收下一个消息。可以实现能者多劳,负载均衡。
     
     3. 发布订阅模式  
         一个消费者将消息首先发送到交换机,交换机(x)绑定到多个队列,然后被监听该队列的消费者所接收并消费 
     
     
     4. 路由模式Routing  
         在绑定队列和交换器的时候指定路由key,生产者发送的消息会通过路由key,将消息发送到相应key相同的队列,接着         监听该队列的消费者消费消息。
     
     
     5. 主题模式  
         路由模式需要key完全相同才可以, 主题模式是在该模式下可以进行模糊匹配规则。
     
  3. RabbitMQ支持事务消息
  4. 如何确保生产者发送消息成功
     生产者也可以采用确认机制
  5.  死信队列产生原因:
            设置的消息过期
            队列容器满了,生产者拒绝接收消息
            消费者多次消费失败,就会转移存放到死信队列中 
  6. 解决分布式事务 
     采用补偿队列
     确保消息一定发送成功,采用确认机制
     确保消费者消费消息一定成功, 手动ack应答形式
     
  • kafka
     
  1.   介绍
      Kafka是apache开源的分布式消息项目,Kafka并没有遵循JMS规范,它只提供了发布和订阅通讯方式。 
     优点: 高吞吐量、低延迟、可扩展性、高并发 
     当生产者将消息发送到topic1主题,消息会均摊存放在3台服务器对应topic1主题下的分区上。
  2.   使用场景
     日志收集
  3. kafka为什么吞吐量高 
     实现数据的压缩 、分区(操作单元小)、数据的批量发送。
     
  • RocketMQ
     
  1. 介绍
            RocketMQ 是一款分布式、队列模型的消息中间件,具有以下特点: 能够保证严格的消息顺序 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆积能力
     
  2.   事务消息 也称半消息 
     生产者发送一条事务消息,该消息不可以被消息。
     待生产者发送commit或rollback指令后,rocketMQ会将消息删除、或投递消费者
     
     
  3.   RocketMQ解决分布式事务思路

     1.  发送事务消息,该消息不可消费
     2.  返回事务消息是否发送成功 
     3.  执行本地事务,将订单消息保存到数据库
     4. 将本地事务结果返回给Rocket
     5.  如果本地事务没有将结果返回给Rocket,则Rocket定时检查
     6. 如果本地事务提交commit,则Rocket则将该消息设置为可以消费
    思路:  保证订单要先保存到数据库且成功,消费者才可以拿到消
     
     
  • 源码
  1. Arraylist、linkedList、 Vector
    ArrarList: 底层使用数组动态扩容(移动数组下标)实现,查询效率高,插入和删除效率低,ArrayList不是线程安全的、                          ArrayList查询直接通过索引定位,效率高。
                      是在add()方法时初始化数组长度, 长度为0
                      每次扩容为原来的1.5倍(0 10 15 22)
    Vector是线程安全的集合。
    LinkedList采用的是双向链表, 采用折半查找,效率低
  2. JDK1.7的HashMap是基于数组+单向链表 
    使用table 数组 来存储对象
    使用单向链表解决了Hash冲突问题
  3.  jdk1.8的HashMap是基于数组+链表+红黑树
     HashMap线程是否安全
    不安全
     HashMap默认初始容量
     默认初始容量16 , 
    HashMap每次扩容的容量为多少
    2倍,  HashMap每次扩容的数组容量为原来的2倍
    HashMap什么时候扩容?阈值多少
     HashMap的size>=阈值时,就扩容数组为原来的2倍,重新计算阈值。
     阈值=当前数组容量*0.75 
    HashMap如何存放key为null 
     如果key==null,存放的对应数组下标为table[0]
    HashMap中hash冲突和index冲突的区别
     hash冲突:key的hash值相同
     index冲突:是在计算数组下标时产生相同问题   index = hash & (length - 1)
    HashMap如何解决hash冲突、减少index冲突问题
    解决hash、index冲突:  使用单向链表
    减少index冲突:   使用 hash & (length - 1) ,(length-1)=15奇数时,在做 '&' 运算时,减少index相同的冲突问题。
    HashMap扩容存在哪些问题
    多线程情况下可能会存在死循环问题
    HashMap的负载因子为什么时0.75 
    加载因子越大,内存利用率越高,index下标冲突概率也就越大;
    加载因子越小,内存利用率越低,index下标冲突概率也就越小; 
    HashMap如果链表过长
     如果hash、index冲突越高,链表就越长,查询效率越低,时间复杂度为On
    HashMap的查询效率问题
    如果没有发生冲突问题,直接通过数组下标定位,效率高 
    如果发生了冲突问题,使用链表查询,效率低
  4. JDK1.8为什么要使用红黑树
    Java1.7:当hashCode冲突的时候会使用链表存放,如果链表的长度过长会导致查询效率非常慢,时间复杂度为o(N)
    Java1.8:   在链表中长度大于8的时候,将链表中所有的数据以红黑树实现存放,从而加快检索速度;时间复杂度 o(log n)
     
  5.  HashMap、HashTable、ConcurrentHashMap  
    HashMap不是线程安全的,但是性能高,但是可以通过
    HashMap允许有一个空键和多个空值,HashTable不允许有空值和空键。
    ConcurrentHashMap  默认分成16个HashTable,采用的分段锁,保证线程安全
     

  6. 二叉搜索树:  会将第一次插入的值作为根节点,如果某种情况下第一次插入的值是最小值,后面的都比它大,如上就会形                         成 一个链表  ,查询的时间复杂度O(n)  
    平衡二叉树:就是为了解决二叉搜索树上所产生的问题。  平衡二叉树是在操作中不断的去寻找新的平衡节点,避免形成链                        表。查询的时间复杂度为O(logn),  
                         平衡二叉树在每次插入和删除时都要进行平衡操作,插入、删除频繁时,性能就会降低,于是就有了红黑树
    红黑树(Red Black Tree) 是一种自平衡二叉查找树,通过指定规则来实现局部平衡,
  • 网络安全 
  1. 接口安全策略     
    防盗链       使用nginx、https实现判断请求来源 
    DDOS        黑客通过不断访问你的服务器资源,导致正常用户无法、或访问慢,使用nginx限制用户的访问频率
    XSS攻击    即跨站脚本攻击。XSS攻击使用Javascript脚本注入进行攻击,如使用过滤器判断提交数据是否有javascript脚                       本,并将其转换html源文件
    SQL注入攻击 
    使用token服务间数据的传输
    使用MD5实现API接口验证签名,防止抓包篡改数据
    使用对称、非对称加密、用户https加密传输
    基于网关实现IP黑名单与名单拦截
    使用第三方服务的安全加密或基于oauth2.0搭建第三方服务平台。 
     
  2. 对称加密、非对称加密 
    对称加密:  在加密、解密过程中使用同一个密钥进行的。如: AES、DES
    非对称加密: 使用一对密钥公钥和私钥:(公钥)一个用于加密信息,(私钥)另一个则用于解密信息。如: RSA
      
  • 限流算法
  1.  令牌桶算法原理  
     以恒定速率向令牌桶中存入Token,用户须获取到令牌桶的Token才可以处理请求,如果没有获取到令牌则丢失该请求。
      
     
  2.  漏桶实现原理 
     将请求先流入到漏桶里,漏桶以一定的速度流出请求,当流入的请求大于流出的会直接溢出,漏桶算法能强行限制数据的传输速率。 但不能使网络请求资源实时达到传输效率。对突发性的大量请求来处理效率低。
  • 网络模型
  1. 什么是网络编程 
    网络编程的本质是两个设备之间的数据交换
    使用IP地址,或域名,和端口连接到另一台计算机上对应的程序,按照规定的协议(数据格式)来交换数据。
  2. Linux五种IO模型
    阻塞I/O     如果没有获取到结果,就会一直等待。等待的过程中会导致整个应用程序一直处在阻塞的过程,
    非阻塞I/O   不管是否有获取到数据,都会返回,如果没有结果数据,则不断的发起重试请求,直到返回数据。 
    信号驱动I/O   发出一个请求实现观察监听,当有数据的时候直接走我们异步回调
    异步I/O    异步io也就是发出请求数据之后,剩下的事情完全实现异步完成
    I/O复用     将客户端所有的socket操作都注册到Selector选择器中,选择器中轮询判断socket是否有数据到达。当数据到达                     时,则激活当前的socket,客户端开始读取数据。
                     客户端可以注册多个socket,然后不断轮询判断是否又数据,即一个线程内同时处理多个IO请求的目的。  
                      nginx、Redis的底层采用Nio中的多路IO复用的机制,能够非常好的支持这样的并发,从而保证线程安全问题;
  3. 七层网络模型介绍  应用层  表示层  会话层  传输层  网络层  链路层  物理层
  4. BIO  即IO,阻塞式IO ,单纯得输入数据,没有缓冲区。当A没有输入时,B则阻塞等待。
    NIO  即NewIO ,非阻塞式IO,是基于通道和缓冲区进行操作,数据是基于缓冲区的读取。  采用IO多路复用机制
  5. Netty  
    介绍:  是一个基于NIO的客户端、服务器端的异步通信框架。
    特点:异步非阻塞、基于事件驱动、高性能、高可靠性和高可定制性。 
                解决了NIO代码的复杂问题,容错机制问题 。
    应用场景: 分布式开源框架中dubbo、Zookeeper,RocketMQ底层rpc通讯使用就是netty
  6. 粘包与拆包
    粘包:  将多个数据包封装成一个数据包。比如客户端发送了2条消息: a、b,服务端直接当成了一条消息读取:  ab   
    拆包:  将一个数据包拆成了多个数据包。比如客户端发送了1条消息: hello,服务端当成了多条消息: h、e、l、l、0。
    如何解决: 固定消息长度,使用特殊字符表示每个消息的结束符号
  7. Socket分为2种协议
    TCP  面向连接   
            通过三次握手、四次挥手完成连接,是可靠协议     
             在连接中进行大数据量传输,以字节流方式  安全,效率低,对方必须进行3次握手才可以通讯 
    UDP  面向无连接   
             不需要建立建立连接   将数据及源的封装成数据包中, 
             每个数据报的大小在限制64k内     不安全,效率高 
  8. 什么是http 
    就是客户端和服务端进行的传输格式,简称超文本传输协议。
    是基于socket的tcp传输协议
  9. http与https 
    http协议传输的数据都是未加密的,也就是明文的, 安全性低,效率高
    https则是具有安全性的ssl加密传输协议, 安全性高,效率低
  10. HTTP1.0与HTTP1.1
    http1.0属于短链接
    http1.1属于长链接 
    (本质还是TCP的长连接和短链接)
  • ELK

    正排索引:  以文档的Id形式保存每个字的位置信息。
    倒排索引 :  以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档 
    logstash支持N种log渠道:   kafka、log、reids等中的log数据进行监控读取与输出

     ELK分布式日志收集原理 
     1 .使用SpringAop进行日志收集,
    2. 通过kafka(发布/订阅)将日志发送给logstash,
    3. logstash再将日志写入elasticsearch,
    4. 使用kibana将存放在elasticsearch中的日志数据显示出来 

  • XXL-JOB分布式任务调度

    搭建xxl-job管理平台客户端配置管理平台地址,通过@JobHandler("userJobHandler")与管理平台对应,
    当任务宕机时,可以手动触发、或重启服务器触发
    路由策略:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等; 
    采用分片广播实现任务的平均分配
  • 微服务
  1. 服务保护概念

    服务学崩效应  服务雪崩效应产生与服务堆积在同一个线程池中,因为所有的请求都是同一个线程池进行处理,这时候如果                          在高并发情况下,所有的请求全部访问同一个接口,这时候可能会导致其他服务没有线程进行接受请求,这                          就是服务雪崩效应效应。
                            使用服务隔离机制(线程池方式和信号量),使用线程池方式实現隔离的原理:  相当于每个接口(服务)都有自                            己独立的线程池,因为每个线程池互不影响

    服务降级  在高并发情况下,防止用户一直等待,使用服务降级方式(直接返回一个友好的提示给客户端,调用fallBack方法)

    服务熔断  熔断机制目的为了保护服务,在高并发的情况下,如果请求达到一定极限(可以自己设置阔值)如果流量超出了设   置阈值,让后直接拒绝访问,保护当前服务。使用服务降级方式返回一个友好提示,服务熔断和服务降级一起使用

    服务隔离  因为默认情况下,只有一个线程池会维护所有的服务接口,如果大量的请求访问同一个接口,达到tomcat 线程池默认极限,可能会导致其他服务无法访问。

    服务限流   服务限流就是对接口访问进行限制,常用服务限流算法令牌桶、漏桶。计数器也可以进行粗暴限流实现。

  2. 注册中心 
     eureka: 
          高可用:  采用eureka集群,相互注册。实现高可用
     nacos:   

  3. 配置中心 
     基于mysql实现持久化,和集群

  4. swagger
     类:    使用@Api(value="aaaa",description="订单相关信息接口") 注解
     方法:   使用@ApiOperation(value="获取所有订单",notes="获取所有订单,无需参数") 注解
     方法参数:   使用 @ApiParam(value = "订单名称", required = true)注解

  5.  OpenFeign    
          是一个Web声明式的Http客户端调用工具,提供接口和注解形式调用,底层采用httpClient技术 。默认集成了 Ribbon    实现负载均衡的效果。  @FeignClient("pitch-member")
        SpringCloud第一代采用feign   第二代采用openFeign

  6.  Ribbon  
    是一个客户端的负载均衡器,提供客户端对服务端的访问控制。轮询策略: 随机、 轮询、哈希、权重
    是将从注册中心获取到的服务缓存到本地,然后在本地实现负载均衡策略。属于本地负载均衡

  7.   sentinel
     启动sentinel的jar包,客户端配置sentinel地址,在相应的方法上加入:       @SentinelResource(value="mySentinelName",   blockHandler = "mySentinelException" )注解 且定义回调方法,
            可配置接口每秒访问次数
            可配置接口最多同事只能有5个线程处理请求
            可配置响应时间超过阈值  响应异常数、异常比例超过阈值
            支持nacos持久化

  8. 网关 
    Zuul: 属于netfix公司开源的第一代微服务网关,是基于Servlet实现的,阻塞式的Api, 不支持长连接。 
    Gateway: 属于SpringCloud研发的第二代微服务网关,基于Spring5构建,响应式非阻塞式的Api,支持长连接。  
     网关应用场景: 黑明白、日志(分析、性能指标)、身份认证
     网关与过滤器
           网关是拦截所有服务器请求进行控制
           过滤器拦截某单个服务器请求进行控制

  9.  zipkin  
     作用: 在多个服务之间调用,显示服务的调用关系,处理时间

    项目整合: 下载zipkind的jar包, 客户端集成的zipkin配置地址,登录zipkin通过图形化界面显示服务的调用

  • Redis 
  1. 基本数据类型
    字符串类型(String)
    列表类型(List)
    无序集合(Set)
    有序集合(sorted set)
    哈希(Hash)
  2. 主从复制  设置主节点具有读写功能、从节点只有读功能。 当主写入数据时,会同步更新到从库
  3. 哨兵机制  当哨兵检测到Master不能正常工作时,哨兵会自动故障迁移操作,它会将其中一个Slave升级为新的Master
  4. 支持事务  Redis 事务可以一次执行多个命令,统一提交
  5.  持久化
            RDB: 以数据文件的形式进行保存备份。  redis默认使用RDB, 通过指定时间操作的次数来保存数据,会造成数据丢失。
            AOF: 以日志文件的形式进行保存备份。 每次有数据更新是都写入aop文件,虽然AOF会造成磁盘 IO 的负荷加重,但                     是相对可靠安全,所以一般都是使用aof
  6. 淘汰策略  移除长时间未使用、随机移除等
  7. 缓存穿透   比如订单查询功能。用一个不存在的订单Id,在redis和数据库中都不存在,这样缓存就是去了意义。                                      接口限流 、使用布隆过滤器 (提前保存好订单号),通过bit的hash来判断,容易产生误判,将数组长度扩长
  8. 缓存雪崩  如果我们缓存在redis数据过期时间是相同的。这就就会导致在这段时间内,这些缓存同时过期失效,                                    全部请求到数据库中。增加数据库压力。 
  9. 缓存击穿  某个 key对应的数据访问非常频繁,属于高并发式访问,当这个 key 在失效的瞬间,大量的请求就击穿了缓                           存,直接请求数据库,造成数据库访问压力大。使用分布式锁,只有一个线程来执行sql操作
  10.  Cluster集群
        Redis哨兵机制在同步中,要求每个redis节点服务器都要保存master节点的全量数据,冗余的数据比较多;
        采用hash槽的原理,预先设定16384个卡槽,并将卡槽分配各个master服务器;通过计算卡槽位置,然后将数据存放在卡槽对应的服务器上。
        一个卡槽可以存放多个值,从而将读或者写转发到该卡槽的服务的节点。
  • MyCat
  1. 什么是mycat
            MyCAT是一款由阿里Cobar演变而来的用于支持数据库,读写分离、分表分库的分布式中间件。MyCAT支持Oracle、MSSQL、MYSQL、PG、DB2关系型数据库,同时也支持MongoDB等非关系型数据库。 
     
  2.  mycat原理
       MyCAT原理MyCAT主要是通过对SQL的拦截,然后经过一定规则的分片解析、路由分析、读写分离分析、缓存分析等,然后将SQL发给后端真实的数据块,并将返回的结果做适当处理返回给客户端。
     
  3.   mycat搭建 
       搭建a(主)、b(从)数据库的主从复制
       搭建mycat服务器,在配置文件中配置a、b数据库信息
       创建mycat虚拟数据库,链接账号、密码、库名
       客户端直接连接mycat虚拟数据库
     
  4.  MyCat分片策略
    1)求模算法    如: 将数据的id取模你的数据库数量。
    2)分片枚举
    3)范围约定
    4)日期指定
    5)固定分片hash算法
    6)通配取模
    7)ASCII码求模通配
    8)编程指定
    9)字符串拆分hash解析
     
  5.  Sharding-JdbcMyCat区别
    MyCat是基于第三方中间件数据库代理框架,客户端所有的jdbc请求都必须要先交给MyCat转发到具体的真实服务器中。
    Sharding-Jdbc是一个Jar形式,在本地应用层重写Jdbc原生的方法,实现数据库分片形式。具体实现逻辑在本地代码中。
  • Docker+Jenkins实现自动化部署

  •    tomcat

  1. tomcat原理 
     tomcat在启动的时候通过8080端口监听http请求

  2.   tomcat配置线程数
    1.如果并发量比较大的情况下 最小活跃线程建议设置比较大,可以避免重复处理线程 可以增加吞吐量;如果最小活跃的线程如果比较大的情况下,非常占用cpu资源;
    2. 如果是项目的并发量比较小的情况下,最小活跃线程可以设置小一点,可以节约cpu内存 
    实际案例:
    通过监控工具监控线程,如果一个项目20/s请求, tomcat线程池 最大线程树为100 最小活跃线程树30

  3. 自带监控 
    配置tomcat远程访问的ip、账号、密码。 
    通过远程服务器登录tomcat监控页面,查看内存、线程使用情况。

  • zookeeper
  1.  什么是zookeeper 
     Zookeeper是一个分布式开源框架,提供了协调分布式应用的基本服务。
     
  2.   Zookeeper数据结构 
     
     层次化的目录结构
  3.  Zookeeper节点的类型
     PERSISTENT  持久化节点
     PERSISTENT_SEQUENTIAL  持久化顺序节点
     EPHEMERAL  临时节点
     EPHEMERAL_SEQUENTIAL  临时顺序节点
     
  4. zookeeper实现分布式锁
     在zk上创建临时节点(设置有效期),使临时节点作为锁且节点不可以重复,
     如果创建失败,则继续等待。
     如果能创建界节点成功,则生成订单号。zk临时会话结束,释放锁。其他节点继续生成订单号
  • 分布式事务
  1.  CAP定律 
     这个定理的内容是指的是在一个分布式系统中、Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。
    一致性(C) 在分布式系统中的所有备份数据,在同一时刻是否同样的值。(比如: A数据库更新的信息,其他数据库可以                         同时获取到) 
    可用性(A)在集群中一部分节点故障后,集群整体是否还能响应客户端的请求。(对数据更新具备高可用性) 
    分区容错性(P)指系统能够容忍节点之间的网络通信的故障。  
    在分布式场景中是无法保证网络问题,所以在分布式系统中是可以容忍网络之间出现的通讯故障;即发生分区容错情况。  
           如果发生分区容错情况,必须就当前操作在C和A之间做出选择;
           CAP 原则指是指,这三个要素最多只能同时实现两点,不可能三者兼顾。要么是CP或者AP
           CP:当你网络出现故障之后,不能保证数据可用性,但是不能保证一致性; 如: zk
          AP:当你网络出现故障之后,不能保证数据一致性,但是能够保证可用性; 如: eureka
  2. BASE理论
        BASE是Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent(最终一致性)三个短语的缩写。分布式事务一般采用最终一致性解决
  3. 二段提交协议
  4. 三段提交协议
  5. lcn与seata
    Lcn:  参与方在执行方法时,不会提交本地事务,同时等待协调者的结果,容易造成数据的死锁。
    Seata:   参与方在执行方法时,不会等待协调者的结果,直接提交本地事务,通过undo_logd的逆向sql实现回滚,避免死锁现象但是容易出现脏读


    
    
       

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值