字节跳动面试题总结

https://www.cnblogs.com/yfzhou/p/10306443.html

 

一、redis 的数据类型,以及使用场景      
    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。      
    String的作用:key-value 存储;
    hash类似Java的map,可以存储对象信息等;
    list可以作为消息队列,也可以作为栈;
    set是可以用于去重,提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能;
    zset可以用于排行榜应用,取TOP N操作;
    
二、redis 的主从复制(数据同步)怎么实现?   
  https://blog.csdn.net/qq_31965925/article/details/105055878?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1 
  1、slave发送sync指令给maser;       
  2、master收到指令后启动一个后台进程,将数据被分到文件中;      
  3、备份期间将新来的指令缓存      
  4、完成文件备份后将文件发送给slave      
  5、使用新的aof文件替换旧的aof文件     
  6、将着期间缓存的指令发送给slave
  
三、谈谈对volatile 关键字的看法      
    volatile是一个java虚拟机提供的轻量级的同步机制,保证可见性和禁止指令重排(有序性),但不保证原子性       
    可见性:使用该关键字修饰的变量告诉jvm该字段不稳定,每次操作时都需要从主内存中获取最新值,刷新到当前线程工作内存中,操作完立即刷新到主内存中,由此保证可见性。        
    防止指令重排:volatile实现指令重排的底层是使用了一个cpu指令叫内存屏障,通过内存屏障的前后指令会不进行指令重排,同时会强制刷新cpu缓存。
    
四、谈谈对Synchronized关键字的看法
    1、它是java的关键字,时同步锁,在多线程的情况下能保证线程安全,synchronized能作用于普通方法方法、静态方法、同步代码;    
2、当一个线程访问同步代码时,它首先要获取锁,在hotspot虚拟机中,锁存放在对象头的mark word中;    
3、synchronized中有偏向锁、轻量锁、重量级锁等,在jdk1.6以后引入了偏向锁、轻量锁用于改进期性能;    
4、锁的获取以及升级
    //偏向锁的获取
    1、首先获取目标对象的Mark Word,根据锁的标识为和epoch去判断当前是否处于可偏向的状态
    2、如果为可偏向状态,则通过CAS操作将自己的线程ID写入到MarkWord,
       如果CAS操作成功,则表示当前线程成功获取到偏向锁,继续执行同步代码块
    3、如果是已偏向状态,先检测MarkWord中存储的threadID和当前访问的线程的threadID是否相等,
       如果相等,表示当前线程已经获得了偏向锁,则不需要再获得锁直接执行同步代码;
       如果不相等,则证明当前锁偏向于其他线程,需要撤销偏向锁。
    //偏向锁的撤销 
    4、首先,暂停拥有偏向锁的线程,然后检查偏向锁的线程是否为存活状态
    5、如果线程已经死了,直接把对象头设置为无锁状态
    6、如果还活着,当达到全局安全点时获得偏向锁的线程会被挂起,接着偏向锁升级为轻量级锁
     
    //轻量级锁加锁
    7、JVM会先在当前线程的栈帧中创建用于存储锁记录的空间(LockRecord)
    8、将对象头中的Mark Word复制到锁记录中,称为Displaced Mark Word.
    9、线程尝试使用CAS将对象头中的Mark Word替换为指向锁记录的指针
    10、如果替换成功,表示当前线程获得轻量级锁,
        如果失败,表示存在其他线程竞争锁,那么当前线程会尝试使用CAS来获取锁,
        当自旋超过指定次数(可以自定义)时仍然无法获得锁,此时锁会膨胀升级为重量级锁
    11、重量级锁依赖对象内部的monitor锁来实现,而monitor又依赖操作系统的MutexLock(互斥锁)


五、Kafka的看法,Kafka数据同步的实现
    1、在Kafka中有副本同步队列(isr)的概念,同步必须满足两个条件:
        1.1副本本必须与zk保持会话(心跳检测)
        1.2副本能够复制leader的所有写操作,并且不能台落后
    2、同步流程
      2.1 producer向leader发送消息
      2.2 leader接收到消息后写到本地log,同时返回ack给客户端
      2.3 follower从leader pull消息,将消息写入本地log,并给leader返回ack。
     
六、ZK选举算法

https://www.cnblogs.com/gaogaoyanjiu/p/9991492.html

leader不存在时,follower服务器会变成looking状态:
    1、每个服务器发出一个投票(为自己投票),每次投票会包含锁推举服务器的myid,zxid(事务id)
    2、接收来自各个服务器的投票,并验证是否是本轮投票,以及是否时来之looking状态的服务器
    3、处理投票,优先级如下:
       3.1 优先比较zxid,zxid较大的优先作为leader
       3.2 如果zxid相同,则选取myid较大的作为leader
    4、统计投票,每次投票后服务器都会判断是否已经有半数机器接收到相同投票,如果超过则leader已经确定,否则继续投票;
    5、改变服务器状态,一旦leader选举出来后,每台服务器都会更新自己的状态,如果时leader则更新looking为leader,如果时follower则更新looking为follower;
    


    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值