redis資料删除/記憶體淘汰
如果我們設定一批key隻能存活1小時,那麼1小時之後,redis是怎麼對這批資料進行删除的?
答案:定期删數+惰性删除
(1)定期删除
指的是redis預設是每隔100ms就随機抽取一些設定了過期時間的key,檢查其是否過期,如果過期就删除。注意,這裡可不是每隔100ms就周遊所有的設定過期時間的key,那樣就是一場性能上的災難。實際上redis是每隔100ms随機抽取一些key來檢查和删除的。
(2)惰性删除
定期删除的問題是可能會導緻很多過期key到了時間并沒有被删除掉,那怎麼辦?是以還有惰性删除,也就是在查詢某個key的時候,redis會檢查一下這個key如果設定了過期時間并且是否過期了,如果過期了就會在此時删除。
通過定期删除和惰性删除兩種方式結合,保證過期的key一定會被删除
- 定期删除是為了節省記憶體
- 惰性删除是為了保證過期性
如果定期沒删除,也沒有查詢,這樣會導緻大量過期的key堆積在記憶體裡怎麼辦?
答案:記憶體淘汰機制
allkeys-lru:當記憶體不足以容納新寫入資料時,在鍵空間中,移除最近最少使用的key。
volatile-lru:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,移除最近最少使用的key。
手寫LRU
public
主從複制過程
這個牛客網上問的也不多,先待定二輪複習再補充
Redis哨兵模式
這都是為了提高redis的高可用性
==叢集監控==,負責監控redis master和slave程序是否正常工作
==消息通知==,如果某個redis執行個體有故障,那麼哨兵負責發送消息作為報警通知管理者
==故障轉移==,如果master node挂掉了,會自動轉移到slave node上
==配置中心==,如果故障轉移發生了,通知client用戶端新的master位址
- 指令連接配接:用來擷取主/從伺服器的資訊
- 訂閱連接配接:sentinel1會通過指令連接配接向主從伺服器發送自身狀态資訊,通過訂閱連接配接将此資訊通知到其他的哨兵,是以哨兵不需要知道哨兵之間的位置
- 哨兵之間指令連接配接:與下線檢測的原理相關(因為此時主伺服器已經當機,無法通過訂閱連接配接讓哨兵之間通知)
哨兵模式工作流程
- 每個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 執行個體發送一個 PING 指令。
- 如果一個執行個體(instance)距離最後一次有效回複 PING 指令的時間超過 down-after-milliseconds 選項所指定的值, 則這個執行個體會被目前 Sentinel 标記為主觀下線。
- 如果一個Master被标記為主觀下線,則正在監視這個Master的所有 Sentinel 要以每秒一次的頻率确認Master的确進入了主觀下線狀态。
- 當有足夠數量的 Sentinel(大于等于配置檔案指定的值)在指定的時間範圍内确認Master的确進入了主觀下線狀态, 則Master會被标記為客觀下線 ,進而對Master進行故障轉移
故障轉移流程
- 選取領頭哨兵,采取先到先得的方式,超過半數哨兵的支援的哨兵成為領頭哨兵
- 從已下線主伺服器屬下的所有從伺服器裡面,挑選一個從伺服器,并将其轉換為主伺服器
- 讓一下先主伺服器屬下所有從伺服器改位複制新的主伺服器
- 将已下線主伺服器設定位新的主伺服器的從伺服器
挑選從伺服器的流程
- 從伺服器處于線上狀态
- 從伺服器最近五秒回複過哨兵的INFO指令
- 跟master斷開連接配接的時長較短,這是為了保證從伺服器的資料較新
- 從伺服器優先級,複制偏移量(哪個slave複制了越多的資料,offset越靠後,優先級就越高),運作ID(run id比較小),進行排序
為什麼哨兵至少需要3個
- 因為挑選領頭哨兵的時候需要獲得超過半數的投票,是以一般都是把哨兵的節點設定為奇數位。因為(2的majority=2,3的majority=2,5的majority=3,4的majority=3)偶數容易算錯
- 2個哨兵同樣可以完成功能,是以其實沒有說一定要至少三個,隻是兩個哨兵的時候如果挂了一個就不可用了,而三個哨兵挂了一個還有兩個可用。是以至少3個是為了達到一定的高可用性的常用配置而已。
Redis叢集模式
redis分片
将整個資料集按照一定的規則配置設定到多個節點上,常用的資料分片的方法有:範圍分片,哈希分片,一緻性雜湊演算法,哈希槽等。
槽位的概念在叢集這裡很重要,任何key都要通過槽位分片到不同的節點運作建立叢集的流程
- 配置和開啟cluster模式
- 配置redis執行個體節點握手
- 為每個主節點指派槽位,一般按區間平均配置設定
- 配置設定主從
擴容叢集過程
- 準備新節點
- 加入叢集進行握手
- 遷移槽和資料( 槽位轉移了,對應槽位的資料也會遷移到新的執行個體上 )
縮容過程
- 确定下線的節點是否有負責槽,如果是,需要把槽遷移到其他節點,保證節點下線後整個槽節點映射的完整性。
- 當下線節點不在負責槽或着本身是從節點時,就可以通知叢集内其他節點忘記下線節點,當所有節點忘記該節點後就可以正常關閉。
故障轉移
為什麼redis cluster至少需要3個主節點?
因為故障檢測時沒有哨兵,需要超過半數的主節點都主觀下線,該故障節點才會被視為客觀下線。兩個主節點,如果挂了一個,那麼隻剩一個無法達到超過半數的條件。這與哨兵模式不同,因為兩個哨兵不一定會挂。
故障轉移過程-----《redis設計與實作》------感覺不會考
主從複制,哨兵,叢集的差別
1.主從模式:讀寫分離,備份,一個Master可以有多個Slaves。
2.哨兵sentinel:監控,自動轉移,哨兵發現主伺服器挂了後,就會從slave中重新選舉一個主伺服器。
3.叢集:故障轉移不再需要哨兵,提供資料分片,提高并發量,一般都是使用它了。