1. 程式人生 > 其它 >面試必問之快取

面試必問之快取

1.快取有哪些型別?

  • 本地快取:在程序中的記憶體中快取,沒有遠端互動,但快取較小無法擴充套件,可使用Ehcache實現
  • 分散式快取:分散式系統下的快取系統,需要遠端請求,效能不如本地快取
  • 多級快取:本地快取只儲存訪問頻率最高的熱點資料,其他的放在分散式快取

2.快取淘汰策略有哪些?

  • FIFO先進先出:利用雙向連結串列來儲存資料,新資料新增到鏈尾,Cache滿後刪除連結串列頭部資料
  • LFU最少使用:新資料新增佇列尾部,快取命中引用計數增加,佇列重新排序,Cache滿後刪除佇列尾部資料
  • LRU使用率低:新資料新增連結串列頭部,快取命中將資料移到頭部,Cache滿後刪除連結串列尾部資料

3.常用快取Redis、Memcache

  Redis

  • 單執行緒處理請求,採用了非阻塞非同步處理機制,並且是記憶體操作IO時間不會太長,避免上下文切換產生的代價,支援持久化和多種資料格式,提供主從同步機制,Cluster叢集部署能力,實現高可用,但依然會有快取雪崩、快取穿透、快取擊穿

  Memcache

  • 將資料全部存在記憶體中,資料不能超過記憶體大小且不能持久化,只能存字串,只能存KeyValue,沒有賦值和同步機制

 


 

Redis詳解

  • 八種資料結構:String、Set、List、Hash、Sorted set、Bitmaps(可實現布隆過濾器)、HyperLogLog(可實現去重統計)、Geo(實現儲存地理位置)
  • 持久化:支援RDB記憶體快照和AOF日誌檔案
  • 主從架構:一主多從,主負責寫,並將資料複製到從節點,從負責讀,讀寫分離
  • 主從同步:1.當啟動 Slave Node時,會發送 PSYNC 命令到 Master Node

                2.初次連線會觸發一次全量複製並啟動一個後臺執行緒生成RDB快照,同時將所有寫命令快取在記憶體

        3.RDB生成完後,會發送給Slave,Slave寫入磁碟後從磁碟載入到記憶體中

        4.Master在將記憶體中的命令傳送給Slave,並同步這些資料

        5.如因斷網或機器宕機導致Master和Slave斷開連線,會自動重連並斷點續傳

          注意:在Redis2.8版本之前,同步採用SYNC命令,複製功能分為同步和命令傳播,針對斷點續傳效率很低,

             在2.8版本之後解決了這個問題,PSYNC具有完整同步和部分同步兩種模式,具體詳解請參照官網

  • 哨兵叢集:叢集監控、訊息通知、故障轉移、配置中心  一般都是配置3個哨兵節點
  • 叢集監控:哨兵會不斷檢查 Master 和 Slave是否正常
  • 訊息通知:當被監控的某個節點出現問題,哨兵會通過API傳送通知到管理員
  • 宕機類別:主觀下線為單個哨兵對 Master 做出的下線判斷,客觀下線為多個哨兵對 Mster 做出SDOWN判斷,並通過SENTINEL is-master-down-by-addr命令相互交流後做出的下線判斷
  • 故障轉移:當Master 宕機後哨兵之間會進行選舉,推選一個哨兵成為新的 Master,當客戶端連線失效的 Master 時,叢集會返回新的 Master 地址,Master 的配置檔案也會發生改變,哨兵的監控目標也會                        變為新Master
  • 快取更新:主動更新能夠很大保證資料一致性問題,即更新完資料庫在更新快取;其次是超時剔除,對資料設定過期時間,超過過期時間自動刪除,然後再次進行快取;淘汰策略演算法
  • 快取穿透:在快取和資料庫中均查不到資料,造成大量請求資料庫,導致資料庫宕機
      •   解決方案:1.在資料庫查不到直接在快取中賦值空值並設定過期時間

             2.布隆過濾器,將資料庫資料雜湊對映到過濾器,不存在直接返回,存在再去查快取

  • 快取雪崩:當快取伺服器重啟或大量快取集體失效,造成大量請求資料庫,導致資料庫宕機
      •   解決方案:1.雙機房部署以及主從+哨兵機制,設定Redis節點避免全盤崩潰

             2.設定本地快取、限流降級請求預設資料

                                            3.優化快取過期時間或設定快取不過期

  • 快取擊穿:某個熱點資料失效時,大量針對這個資料的請求會穿透到資料庫
      •   解決方案:1.互斥鎖或JVM鎖,只有第一個執行緒能拿到鎖執行資料庫查詢,其他執行緒阻塞等待,等第一個執行緒將資料寫入快取,其他執行緒直接走快取

                                            2.設定熱點不過期,非同步載入資料更新快取,但會導致短時間內資料不一致,如果快取重新整理不上還會產生髒資料   

                                            3.快取自動續期、二級快取等,但在沒有發生時會造成資源浪費

  • 待補充......