redis常見的面試題

redis和memched有什麼區別,爲什麼單線程的redis比多線程的memched效率高

  string:ky類型

  hash:字典redis的哈希結構可以使你像在數據庫中更新一個屬性一樣只修改某一項屬性值

  list:實現消息隊列

  set:利用唯一性

  zset:可以進行排序,可以實現數據的持久化

  

  數據持久化:

    redis通過RDB(Redis DataBase)與AOF(Append Only File)持久化,可以將內存中的數據保存到硬盤中,然後重啓之後在讀取數據

    RDB:

      是在達到指定的時間或者 操作次數之後,自動將內存中的數據寫入到磁盤中(數據恢復時一致性和完整性較差,因爲也許最後一次備份前就宕機了,適合數據量較大的時候數據恢復使用)

    AOF:

      是日誌形式,當數據寫入內存中的時候,在日誌文件下記錄了所有寫操作,(數據量較大時候,數據的恢復緩慢)

    注意:如果不需要持久化的功能,可以關閉,如果想達到持久化的效果,建議兩者都使用(RDB、AOF)

  

  memched不支持數據的持久性的存儲

  

redis中的主從複製是如何實現的,redis的集羣模式是如何實現的,redis的key是如何尋址的

  主從複製:

    a:從服務器連接主服務器,發送SYN命令(寫緩存命令)

    b:主服務器接收到SYNC命令之後,開始執行BGSAVE命令生成RDB文件並使用緩衝區記錄此後執行的所有命令;BGSAVE命令用於在後臺異步保存當前數據庫的數據到磁盤

    c:主服務器BGSAVE執行完成之後,向所有從服務器發送快照文件,並在發送期間繼續記錄被執行的寫命令

    d:從服務器接收到快照文件後丟棄所有的舊數據,加載進入到所有的快照

    e:主服務器快照發送完畢之後開始向從服務器發送緩衝區中的命令

    f:從服務器完成對快照的載入,開始接受命令請求,並執行來自主服務器緩衝區的寫命令

 

  集羣模式:

    redis集羣中內置了16384個哈希槽,當需要在redis集羣中放置一個kv鍵值對的時候,redis先對key使用crc16算法算出一個結果,然後把這個結果對16384求餘數,這樣每個key都會對應一個編號在0-16384之間的哈希槽,redis會根據節點數量大致均等的將哈希槽映射到不同的節點

 

  尋址:

    redis採取鏈表的方式來存儲多個哈希碰撞的鍵。也就是說,當根據key的哈希值找到該列表後,如果列表的長度大於1,那麼我們需要遍歷這個鏈表來找到我們所查找的key,當然,一般情況下鏈表的長度都是1,所以時間複雜度可以看作是1。我們知道如果哈希表數量達到了一個很大的量級的時候,那麼衝突的鏈的元素數量就會很大,這個時候查詢的效率就會變的很慢,因爲取值的時候redis會遍歷鏈表。而隨着數據量的縮減,也會產生一定的內存浪費。redis在設計的時候充分考慮了字段的增加和縮減,爲了優化數據量增加時候的查詢效率和縮減時候的內存利用率。redis進行了一系列的操作,而這個操作過程也就被稱爲了rehash

 

 

redis中的分佈式鎖

  什麼是分佈式鎖:

    分佈式鎖是控制分佈式系統和不同系統之間共同訪問共享資源的一種鎖的實現,如果不同的系統或者同一個系統不同主機之間共享了某個資源的時候,往往需要互斥來防止干擾來保持一致性

  實現思想:

    1、獲取鎖的時候,使用setnx加鎖,並使用expire命令鎖添加一個超時時間,超過這個時間就自動釋放鎖,鎖的value值是一個隨機生成的UUID,通過此在釋放鎖的時候進行判讀

    2、獲取鎖的時候還設置一個獲取的超時時間,若超過這個時間就放棄獲取鎖

    3、釋放鎖的時候,通過UUID判斷是不是該鎖,如果只這個鎖,就執行delete進行鎖的釋放

 

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