Redis 面試常見問答

2021-09-11 15:10:15 字數 1150 閱讀 9286

通常,我們會使用快取用於緩衝對 db 的衝擊,如果快取宕機,所有請求將直接打在 db,造成 db 宕機——從而導致整個系統宕機。

如何解決呢?

2 種策略(同時使用):

對快取做高可用,防止快取宕機

使用斷路器,如果快取宕機,為了防止系統全部宕機,限制部分流量進入 db,保證部分可用,其餘的請求返回斷路器的預設值。

解釋 1:快取查詢乙個沒有的 key,同時資料庫也沒有,如果黑客大量的使用這種方式,那麼就會導致 db 宕機。

解決方案:我們可以使用乙個預設值來防止,例如,當訪問乙個不存在的 key,然後再去訪問資料庫,還是沒有,那麼就在快取裡放乙個佔位符,下次來的時候,檢查這個佔位符,如果發生時佔位符,就不去資料庫查詢了,防止 db 宕機。

解釋 2: 大量請求查詢乙個剛剛失效的 key,導致 db 壓力倍增,可能導致宕機,但實際上,查詢的都是相同的資料。

解決方案:可以在這些請求**加上雙重檢查鎖。但是那個階段的請求會變慢。不過總比 db 宕機好。

解釋:多個客戶端寫乙個 key,如果順序錯了,資料就不對了。但是順序我們無法控制。

解決方案:使用分布式鎖,例如 zk,同時加入資料的時間戳。同一時刻,只有搶到鎖的客戶端才能寫入,同時,寫入時,比較當前資料的時間戳和快取中資料的時間戳。

解釋:連續寫資料庫和快取,但是操作期間,出現併發了,資料不一致了。 通常,更新快取和資料庫有以下幾種順序:

先更新資料庫,再更新快取。

先刪快取,再更新資料庫。

先更新資料庫,再刪除快取。

三種方式的優劣來看一下:

先更新資料庫,再更新快取。 這麼做的問題是:當有 2 個請求同時更新資料,那麼如果不使用分布式鎖,將無法控制最後快取的值到底是多少。也就是併發寫的時候有問題。

先刪快取,再更新資料庫。 這麼做的問題:如果在刪除快取後,有客戶端讀資料,將可能讀到舊資料,並有可能設定到快取中,導致快取中的資料一直是老資料。 有 2 種解決方案:1. 使用「雙刪」,即刪更刪,最後一步的刪除作為非同步操作,就是防止有客戶端讀取的時候設定了舊值。2. 使用佇列,當這個 key 不存在時,將其放入佇列,序列執行,必須等到更新資料庫完畢才能讀取資料。

總的來講,比較麻煩。

還有一種可能,如果執行更新資料庫,準備執行刪除快取時,服務掛了,執行刪除失敗怎麼辦??? 這就坑了!!! 不過可以通過訂閱資料庫的 binlog 來刪除。

10期 Redis 面試常見問答

什麼是快取雪崩?怎麼解決?快取雪崩是指快取中資料大批量到過期時間,而查詢資料量巨大,引起資料庫壓力過大甚至down機。和快取擊穿不同的是,快取擊穿指併發查同一條資料。如何解決呢?什麼是快取穿透?怎麼解決?快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為 1 的資料或id為...

C 常見問答面試題詳解

1.請說出static和const關鍵字盡可能多的作用 static關鍵字至少有下列n個作用 1 函式體內static變數的作用範圍為該函式體,不同於auto變數,該變數的記憶體只被分配一次,因此其值在下次呼叫時仍維持上次的值 2 在模組內的static全域性變數可以被模組內所用函式訪問,但不能被模...

案例常見問答

1.1專案章程的輸入和內容 輸入 專案工作範圍說明書,組織過程資產,事業環境因素 內容 專案目的,可測量的專案目標,專案的總體要求,概括性的專案描述,總體的里程碑進度計畫 總體預算,專案的主要風險 委派的專案經理和職權等。1.2專案管理計畫的內容 選擇的各個專案管理過程 選定過程的實施水平 對實施過...