redis常見問題總結

一、面試經常問到的Redis的過期策略

過期策略通常有以下三種

  • 定時過期:每個設置過期時間的key都需要創建一個定時器,到過期時間就會立即清除。該策略可以立即清除過期的數據,對內存很友好;但是會佔用大量的CPU資源去處理過期的數據,從而影響緩存的響應時間和吞吐量。
  • 惰性過期:只有當訪問一個key時,纔會判斷該key是否已過期,過期則清除。該策略可以最大化地節省CPU資源,卻對內存非常不友好。極端情況可能出現大量的過期key沒有再次被訪問,從而不會被清除,佔用大量內存。
  • 定期過期:每隔一定的時間,會掃描一定數量的數據庫的expires字典中一定數量的key,並清除其中已過期的key。該策略是前兩者的一個折中方案。通過調整定時掃描的時間間隔和每次掃描的限定耗時,可以在不同情況下使得CPU和內存資源達到最優的平衡效果。
    (expires字典會保存所有設置了過期時間的key的過期時間數據,其中,key是指向鍵空間中的某個鍵的指針,value是該鍵的毫秒精度的UNIX時間戳表示的過期時間。鍵空間是指該Redis集羣中保存的所有鍵。)

二、分佈式系統中如何保證各個系統之間的數據統一?

數據統一分爲同源和不同源,同源爲搜索同一數據庫,不同源。
同源:
加鎖,使用互斥鎖,排它鎖
不同源:
不同源的分佈式系統操作不同的數據爲解決方法和實現

三、redis的數據擊穿和雪崩及處理辦法

  • redis擊穿:
    請求數據順序,首先會從redis緩存中拿數據,若未拿到則查數據庫,再寫到redis。如果是請求一條根本不存在的數據時,則會去直接訪問數據庫,但是數據庫也沒有,所以它也沒把數據寫入redis緩存。所以每次這種請求都會直接訪問數據庫。如果請求的數量太大的話,這種繞過redis直接訪問數據庫情況則成爲擊穿。

  • 解決辦法:
    1、在查詢數據庫的時候若未查詢到數據,依然在redis中保存一條記錄,並把value設置爲null或者其他便於區別的值,可以再給該條數據設置一個過期時間,那麼以後再有請求過來訪問時就不會繞過redis直接去查庫。

    2、在從redis中獲取數據前增加查詢校驗,對所有可能存在的查詢參數緩存到hash集合中,若某個請求在該集合中存在,則可以訪問rides,若不存在則直接丟棄該請求。

  • redis雪崩:
    每個key(即數據)如果設置了失效時間的話,如果大量key同時過期的時候,或者說因爲某種原因redis中的數據突然大批量丟失,這些key又大量地去請求這些key時,因爲redis裏面沒有這些數據,就會大量的請求就會大量涌向數據庫,就會導致數據庫處理不過來,導致“雪崩”。

  • 解決辦法:
    1、設置均勻的過期時間,避免某段時間出現大批量數據失效

    2、在緩存失效後,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。比如對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。

    3、做二級緩存,一級緩存未查詢到數據,則從二級緩存查詢

註冊時如何防止用戶重複提交?
思路一:如果是註冊行爲可以註冊時候設置key爲用戶手機號,第一次提交將用戶信息放置在redis中,每一次進來對比一下,key相同呢麼表示數據已經提交過,返回不用重複提交。同時還要設置過期時間,這樣可以保證數據中不會遺留垃圾數據。
思路二:

四、分佈式鎖的問題

先寫這裏有時間繼續補充,歡迎一起討論

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