面試題一Redis

面試題一Redis

  1. Redis支持的數據類型?

    String:

    ​ 格式:set key value

    Hash(哈希):

    ​ 格式:hmset name key1 value1 key2 value2

    List(列表):Redis 列表是簡單的字符串列表,按照插入順序排序

    ​ 格式: lpush name value

    ​ 在 key 對應 list 的頭部添加字符串元素

    ​ 格式: rpush name value

    ​ 在 key 對應 list 的尾部添加字符串元素

    ​ 格式: lrem name index

    ​ key 對應 list 中刪除 count 個和 value 相同的元素

    ​ 格式: llen name

    ​ 返回 key 對應 list 的長度

    Set(集合):Redis的Set是string類型的無序集合。集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是O(1)。

    ​ 格式:sadd name value

    zset(sorted set:有序集合):Redis zset 和 set 一樣也是string類型元素的集合,且不允許重複的成員。

    ​ 格式: zadd name score value

  2. 什麼是Redis持久化?Redis有哪幾種持久化方式?優缺點是什麼?

    持久化就是把內存的數據寫到磁盤中,防止服務器宕機了內存數據丟失

    Redis提供了兩種持久化方式:RDB(默認)、AOF

    RDB的優缺點:

    ​ 優點:最大化發揮redis的性能,Redis在保存RDB快照時會fork出子進程進行,機會不影響Redis處理客戶端請求的效率。使用RDB文件進行數據恢復比使用AOF要快很多。

    ​ 缺點:快照是定期生成的,所以在Redis crash時或多或少會丟失一部分數據。如果數據集非常大且CPU不夠強,Redis在fork子進程可能會消耗相對較長的時間,影響Redis對外提供服務的能力

    AOF的優缺點:

    ​ 採用AOF持久方式時,Redis會把每一個寫請求都記錄在一個日誌文件裏。在Redis重啓時,會把AOF文件中記錄的所有寫操作順序執行一遍,確保數據恢復到最新。

    ​ 優點:最安全,任何數據都不會丟失,即使出現了某條日誌只寫入了一半的情況,也可以使用redis-check-aof工具輕鬆修復。AOF文件易讀,可修改,在進行了某些錯誤的數據清除操作後,只要AOF文件沒有rewrite,就可以把AOF文件備份出來,把錯誤的命令刪除,然後恢復數據。

    ​ 缺點:AOF文件通常比RDB文件更大性能消耗比RDB高,數據恢復速度比RDB慢

  3. Redis有哪些架構模式?講講各自的特點

單機版

在這裏插入圖片描述

問題:1、內存容量有限 2、處理能力有限 3、無法高可用。

主從複製

在這裏插入圖片描述

​ Redis 的複製(replication)功能允許用戶根據一個 Redis 服務器來創建任意多個該服務器的複製品,其中被複制的服務器爲主服務器(master),而通過複製創建出來的服務器複製品則爲從服務器(slave)。 只要主從服務器之間的網絡連接正常,主從服務器兩者會具有相同的數據,主服務器就會一直將發生在自己身上的數據更新同步 給從服務器,從而一直保證主從服務器的數據相同。

問題:1、無法保證高可用; 2、沒有解決master寫的壓力

哨兵

在這裏插入圖片描述

​ Redis sentinel 是一個分佈式系統中監控 redis 主從服務器,並在主服務器下線時自動進行故障轉移。其中三個特性:
監控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常。
提醒(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程序發送通知。
自動故障遷移(Automatic failover): 當一個主服務器不能正常工作時, Sentinel 會開始一次自動故障遷移操作。
特點:1、保證高可用;2、監控各個節點;3、自動故障遷移
缺點:主從模式,切換需要時間丟數據
沒有解決 master 寫的壓力

集羣
在這裏插入圖片描述

使用集羣,只需要將每個數據庫節點的cluster-enable配置打開即可。每個集羣中至少需要三個主數據庫才能正常運行。

即使使用哨兵,redis每個實例也是全量存儲,每個redis存儲的內容都是完整的數據,浪費內存且有木桶效應。爲了最大化利用內存,可以採用集羣,就是分佈式存儲。即每臺redis存儲不同的內容。
集羣至少需要3主3從,且每個實例使用不同的配置文件,主從不用配置,集羣會自己選。

  1. Redis的同步機制瞭解嗎?

    主從同步。第一次同步時,主節點做一次bgsave,並同時將後續修改操作記錄到內存buffer,待完成後將rdb文件全量同步到複製節點,複製節點接受完成後將rdb鏡像加載到內存。加載完成後,再通知主節點將期間修改的操作記錄同步到複製節點進行重放就完成了同步過程。

  2. 如何應對緩存穿透、緩存擊穿、緩存雪崩問題?

    緩存穿透:是指查詢一個數據庫一定不存在的數據。如果數據庫查詢對象爲空,則不放進緩存,就會每次都去查詢數據庫,而每次查詢都是空,每次又都不會進行緩存。假如有惡意攻擊,就可以利用這個漏洞,對數據庫造成壓力,甚至壓垮數據庫,導致所有的請求都懟到數據庫上,從而數據庫連接異常。

    解決方案:

    (1)利用互斥鎖,緩存失效的時候,先去獲得鎖,得到鎖了,再去請求數據庫。沒得到鎖,則休眠一段時間重試

    (2)採用異步更新策略,無論 key 是否取到值,都直接返回。value 值中維護一個緩存失效時間,緩存如果過期,異步起一個線程去讀數據庫,更新緩存。需要做緩存預熱(項目啓動前,先加載緩存)操作。

    (3)提供一個能迅速判斷請求是否有效的攔截機制,比如,利用布隆過濾器,內部維護一系列合法有效的 key。迅速判斷出,請求所攜帶的 Key 是否合法有效。如果不合法,則直接返回。

    (4) 如果從數據庫查詢的對象爲空,也放入緩存,只是設定的緩存過期時間較短,比如設置爲 60 秒。

    緩存擊穿:是指一個 key 非常熱點,在不停的扛着大併發,大併發集中對這一個點進行 訪問,當這個 key 在失效的瞬間,持續的大併發就穿破緩存,直接請求數據庫,就像在一個 屏障上鑿開了一個洞。做電商項目的時候,把這貨就稱爲“爆款”。

    緩存雪崩:是指緩存同一時間大面積的失效,這個時候又來了一波請求,結果請求都懟到數據庫上,從而導致數據庫連接異常。

    解決方案:

    做電商項目的時候,一般是採取不同分類商品,緩存不同週期。在同一分類中的商品,加上一個隨機因子。這樣能儘可能分散緩存過期時間,而且,熱門類目的商品緩存時間長一 些,冷門類目的商品緩存時間短一些,也能節省緩存服務的資源。

    (1)給緩存的失效時間,加上一個隨機值,避免集體失效。

    (2)使用互斥鎖,但是該方案吞吐量明顯下降了。

    (3)雙緩存。我們有兩個緩存,緩存 A 和緩存 B。緩存 A 的失效時間爲 20 分鐘,緩存B不設失效時間。自己做緩存預熱操作。然後細分以下幾個小點

    ​ a. 從緩存 A 讀數據庫,有則直接返回

    ​ b. A 沒有數據,直接從 B 讀數據,直接返回,並且異步啓動一個更新線程。

    ​ c. 更新線程同時更新緩存 A 和緩存 B。

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