整理面试酷炫拽名词解释

本文主要介绍平常应用及沟通中出现的名词,由简到繁

脏幻不可

脏读

又称无效数据读出(读出了脏数据)。一个事务读取另外一个事务还没有提交的数据叫脏读。
例如:事务T1修改了某个表中的一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因回滚(Rollback)了,那么事务T2读取的数据就是脏的(无效的)。
解决办法:把数据库的事务隔离级别调整到READ_COMMITTED(读提交/不可重复读)

不可重复读

不可重复读是指在同一个事务内,两次相同的查询返回了不同的结果。
例如:事务T1会读取两次数据,在第一次读取某一条数据后,事务T2修改了该数据并提交了事务,T1此时再次读取该数据,两次读取便得到了不同的结果。
解决办法:把数据库的事务隔离级别调整到REPEATABLE_READ(可重复读)

幻读

幻读也是指当事务不独立执行时,插入或者删除另一个事务当前影响的数据而发生的一种类似幻觉的现象。
例如:系统事务A将数据库中所有数据都删除的时候,但是事务B就在这个时候新插入了一条记录,当事务A删除结束后发现还有一条数据,就好像发生了幻觉一样。这就叫幻读。
解决办法:把数据库的事务隔离级别调整到SERIALIZABLE_READ(序列化执行),或者数据库使用者自己进行加锁来保证。


三范式

第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以此类推。一般说来,数据库只需满足第三范式(3NF)就行了。所以这里就只记录三范式相关的知识。

1NF

字段不可分,每个字段是原子级别的,上节中看到第一个字段为ID,它就是ID不能在分成两个字段了,不能说我要把这个人的ID、名称、班级号都塞在一个字段里面,这个是不合适的,对以后的应用造成很大影响;

2NF

有主键,非主键字段依赖主键,ID字段就是主键,它能表示这一条数据是唯一的,“unique”表示唯一的、不允许重复的,确实它经常会修饰某个字段,保证该字段唯一性,然后再设置该字段为主键;

3NF

非主键字段不能相互依赖

RabbitMQ死信队列

  • 定义:没有被及时消费的消息存放的队列,消息没有被及时消费有以下几点原因
  •  消息被拒绝(basic.reject/ basic.nack)并且不再重新投递requeue=false
  • TTL(time-to-live) 消息超时未消费
  • 达到最大队列长度

消息变成死信后,会被重新投递(publish)到另一个交换机上(Exchange),这个交换机往往被称为DLX(dead-letter-exchange)“死信交换机”,然后交换机根据绑定规则转发到对应的队列上,监听该队列就可以被重新消费。

Zookeeper脑裂

  • 人本来就有一个大脑,但是突然某一天拥有两个或多个大脑,导致身体紊乱,称为脑裂;应用到我们正常的研发过程中的中间件,比如ElasticSearch、Zookeeper集群,而这些集群环境有一个统一的特点,就是它们有一个大脑,比如ElasticSearch集群中有Master节点,Zookeeper集群中有Leader节点。

Zookeeper脑裂场景

部署高可用集群,两个Zookeeper集群,集群A有三台,集群B有三台,互相通信,不考虑“过半机制”正常情况A集群选举Leader节点,网络环境都正常所以集群没有任何问题,当网络出现问题,集群A与集群B出现问题网络问题,那么通过ZK内部的选举节点集群A和集群B都会选举出Leader节点,这样在整个大的集群中就出现两个Leader节点,此场景造成了ZK的脑裂

过半机制

  •  ZK领导者选举的过程中,如果某台zkServer获得了超过半数的选票,则此zkServer就可以成为Leader了,为什么需要用该算法机制呢?其实是因为这样利用该方法就不需要等待所有zkServer都投了同一个zkServer就可以选举出来一个Leader了,这样比较快也称“快速领导者选举”算法
    源码如下
  •  public class QuorumMaj implements QuorumVerifier {
    private static final Logger LOG = LoggerFactory.getLogger(QuorumMaj.class);
    int half;
    // n表示集群中zkServer的个数(准确的说是参与者的个数,参与者不包括观察者节点)
    public QuorumMaj(int n){
    this.half = n/2;
    }
    // 验证是否符合过半机制
    public boolean containsQuorum(Set set){
    // half是在构造方法里赋值的
    // set.size()表示某台zkServer获得的票数
    return (set.size() > half);
    }
    }
  •  应用部署
    基本两个部署集群,A集群+B集群的数据目按照 2n+1和2n即可,因为这样部署通过过半机制即使网络断了要么没有leader要么只有一个leader这样保证ZK不会脑裂

同步与异步

  • 同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。
  • 异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。

阻塞与非阻塞

  • 阻塞与非阻塞主要是从 CPU 的消耗上来说的,阻塞就是 CPU 停下来等待一个慢的操作完成CPU才接着完成其它的事。
  • 非阻塞就是在这个慢的操作在执行时CPU去干其它别的事,等这个慢的操作完成时,CPU再接着完成后续的操作。虽然表面上看非阻塞的方式可以明显的提高CPU的利用率,但是也带了另外一种后果就是系统的线程切换增加
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值