天天看點

分布式緩存和Redis面試總結

分布式緩存:

LRU(最近最少使用)算法實作:可以使用一個有序的單連結清單來實作。當有一個新的資料被通路時,如果存在于單連結清單之中,則直接讀取該資料,然後把該節點插傳入連結表頭部。如果不存在單連結清單之中,先判斷是否還有緩存,如果有則将該節點插入單連結清單的頭部,如果沒有先删除單連結清單尾部的節點,然後再将節點插入到單連結清單頭部。

引入緩存常見的問題:緩存穿透、雪崩、擊穿、資料一緻性。

緩存穿透解決方案:緩存空對象;布隆過濾器。

緩存雪崩解決方案:緩存高可用;本地緩存;請求DB限流;服務降級。

緩存擊穿解決方案(針對一個key,真實存在):使用互斥鎖;手動過期。

資料一緻性相關:

産生的原因:并發場景下讀取老DB更新到緩存;緩存和DB的操作不在一個事務,一個成功一個失敗。

解決方案:todo

Redis:

優點:速度快;支援持久化存儲;支援豐富的資料類型;豐富的特性。

支援的資料類型:String、List、Set、Sorted Set、Hash

效率高的原因:完全記憶體的操作;非阻塞的IO多路複用;單線程操作避免了上下文切換;Hash

持久化的方式:RDB(全量)和AOF(增量)

過期政策:主動删除;被動删除;maxmemory

淘汰政策:volatile-lru;volatile-ttl;volatile-random;allkeys-lru;allkeys-random;no-enviction;

實作分布式鎖:set指令;redlock

實作消息隊列:用list結構實作,rpush 生産消息,lpop 消費消息。

為什麼用跳表不用紅黑樹:redis主要的操作有插入單個資料、删除單個資料、查找單個資料、查找某個區間的資料,對于前三個操作來說紅黑樹和跳表差不多,但是對于第四個操作,跳表明顯優于紅黑樹。

繼續閱讀