分布式緩存:
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主要的操作有插入單個資料、删除單個資料、查找單個資料、查找某個區間的資料,對于前三個操作來說紅黑樹和跳表差不多,但是對于第四個操作,跳表明顯優于紅黑樹。