字節跳動面試題總結

一、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、鎖的獲取以及升級
      4.1、線程訪問同步代碼時,判斷當前是否有偏向鎖,如果沒有則獲取偏向鎖,並利用cas 將當前線程ID寫入mark word中;
      4.2、如果偏向鎖以及被其他線程持有,則嘗試獲取偏向鎖,獲取成功則執行同步代碼,獲取失敗嘗試撤銷偏向鎖,並升級爲輕量級鎖;
      4.3、如果線程獲取輕量級鎖失敗,則會嘗試使用cas來獲取鎖,當自旋次數達到一定值後就會升級爲重量級鎖;
    5、重量級鎖依賴對象鎖內部的monitor鎖來實現的,而monitor又依賴操作系統的互斥鎖實現的。


五、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;
    


    
    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章