Redis

持久化

  • RDB容易丟失數(shù)據隅俘,AOF通過合適的fsync策略丟失更少的數(shù)據
  • AOF體積大考赛,但是可以自動重寫
  • RDB適合數(shù)據備份

RDB

  • 把內存里的key-value快照寫到磁盤文件里
  • fork一個子進程來生成RDB文件
  • RDB文件是二進制文件
  • 在一定的時間段內執(zhí)行一定數(shù)量的寫操作颜骤,會觸發(fā)BGRDB

AOF

  • 將執(zhí)行過的寫操作記錄到AOF文件里
  • AOF是一個文本文件
  • 先寫緩存捣卤,然后同步到AOF文件里。同步策略有3種鸠项,比如其中一種是每隔1秒同步一次AOF文件
  • AOF文件太大了之后會觸發(fā)AOF重寫子姜。重寫是根據當時的key-value來重新生成寫操作,所以跟已經存在的AOF文件不相關
  • AOF重寫過程中的寫操作記錄在緩存牧抽,最后會追加到AOF文件里

數(shù)據庫

  • 默認16個數(shù)據庫扬舒,編號從0開始。集群里只能使用0號數(shù)據庫
  • 數(shù)據庫內部是一個dict結構
  • keyspace@{dbid}:{key} 頻道通知key的操作
  • keyevents@{dbid}:{ops} 頻道通知操作的key

過期

  • expires字典(dict)記錄key的過期時間
  • 惰性刪除策略孕惜,操作的時候判斷key是否過期晨炕,過期則刪除
  • 定期刪除策略,啟一個job碧磅,隨機刪除N個過期的key

LRU

  • HashMap + 雙向鏈表,每次訪問之后移到鏈頭
  • 近似淘汰算法:隨機取出若干個key丰榴,按照訪問時間排序,淘汰最不經常使用的

淘汰策略

  • noeviction 不淘汰
  • volatile-lru 設置了過期時間的key參與LRU
  • allkeys-lru 所有的key參與LRU
  • volatile-random 隨機淘汰設置了過期時間的key
  • allkeys-random 隨機淘汰所有的key
  • volatile-ttl 設置了過期時間的key中存活時間最短的

主從復制

  • 角色:主節(jié)點换况,從節(jié)點
  • 從節(jié)點第一次連上主節(jié)點盗蟆,發(fā)送命令PSYNC喳资,主節(jié)點會執(zhí)行全局復制:生成RDB文件,并發(fā)送給從節(jié)點(同時會把生成RDB文件過程中的寫操作也發(fā)送給從節(jié)點)
  • 同步完成之后鲜滩,主節(jié)點會把寫命令傳播給從節(jié)點(命令傳播)
  • 從節(jié)點斷線重連之后节值,發(fā)送命令PSYNC給主節(jié)點,主節(jié)點會執(zhí)行部分復制:根據從節(jié)點的offset搞疗,從replication backlog里讀取未同步的命令,發(fā)送給從節(jié)點
  • replication backlog是一個固定大小的先進先出隊列豌汇,每個位置存儲了一個字節(jié)
  • 從節(jié)點定時發(fā)送心跳檢查給主節(jié)點业簿,主節(jié)點檢查到從節(jié)點的offset小于自己的offset,也會把未同步的命令補償給從節(jié)點柜思,整個過程與部分復制類似

Sentinel

建立

  • 角色:哨兵巷燥,主節(jié)點,從節(jié)點
  • 哨兵和主節(jié)點建立命令和訂閱鏈接
  • 哨兵每10秒向主節(jié)點發(fā)送INFO命令陨享,從返回消息里了解主節(jié)點钝腺,并發(fā)現(xiàn)從節(jié)點
  • 哨兵每10秒向從節(jié)點發(fā)送INFO命令艳狐,更新從節(jié)點和主節(jié)點的信息
  • 哨兵每2秒向主從節(jié)點發(fā)送消息,包括哨兵和主節(jié)點的信息蔬啡,使其他哨兵發(fā)現(xiàn)自己镀虐,然后哨兵之間建立命令鏈接

故障轉移

  • 哨兵每秒向所有節(jié)點發(fā)送PING命令,返回PONG
  • 在一個時間范圍內空猜,連續(xù)返回無效回復恨旱,則標識為主觀下線
  • 哨兵檢測到主節(jié)點主觀下線后,發(fā)送命令SENTINEL is-master-down-by-addr漓摩,回復是否主觀下線
  • 哨兵收集到一定數(shù)量的主觀下線管毙,則把節(jié)點標識為客觀下線
  • 選舉領頭哨兵
  • 從節(jié)點中挑選一個節(jié)點,轉換為主節(jié)點
  • 其他從節(jié)點改為復制新的主節(jié)點
  • 已下線的主節(jié)點設置為從節(jié)點

集群

建立集群

  • 客戶端發(fā)送CLUSTER MEET 命令把節(jié)點B加入節(jié)點A的集群
  • 節(jié)點A發(fā)送MEET命令給B夭咬,B發(fā)送PONG命令給A,A再發(fā)送PING給B南用,握手完成

槽指派

  • 集群的整個數(shù)據庫被分成16384個槽slot, 每個節(jié)點指派一部分槽
  • 客戶端發(fā)送 CLUSTER AddSlots 命令把槽指派給節(jié)點
  • 節(jié)點發(fā)送消息給其他節(jié)點裹虫,告知自己負責哪些槽

執(zhí)行命令

  • 節(jié)點計算key使用哪個槽(CRC16)融击,如果是自己則執(zhí)行命令,如果不是則返回MOVED錯誤匣屡,指引客戶端轉向正確的節(jié)點

重新分片

  • 向目標節(jié)點發(fā)送 CLUSTER SETSLOT slot IMPORTING source 命令拇涤,讓目標節(jié)點準備好從源節(jié)點導入槽
  • 向源節(jié)點發(fā)送 CLUSTER SETSLOT slot MIGRATING target 命令,讓源節(jié)點準備好遷移槽
  • 向源節(jié)點發(fā)送 CLUSTER GetKeysInSlot slot count 命令券躁,返回key name列表
  • 對每個key如绸,向源節(jié)點發(fā)送 Migrate target key 命令怔接,遷移
  • 向任意節(jié)點發(fā)送 CLUSTER SetSlot slot NODE target 命令扼脐,告知槽已經重新指派

在重新分片過程中奋刽,如果源節(jié)點不存在key,則返回ASK錯誤
客戶端發(fā)送 ASKING 命令給目標節(jié)點佣谐,再發(fā)送原來的命令;如果不發(fā)送ASKING命令罚攀,則目標節(jié)點會返回Moved錯誤

故障轉移

  • 通過發(fā)送PING消息來檢測對方是否在線,如果在規(guī)定的時間里沒有返回PONG斋泄,則標識為 疑似下線PFail
  • 如果半數(shù)以上的節(jié)點都標記為 疑似下線炫掐,則標記為 已下線Fail
  • 選擇一個從節(jié)點成為新的主節(jié)點

數(shù)據結構

  • string:int, embstr, raw,
  • list:雙向鏈表, ziplist, linked list
  • hash: 映射表。數(shù)據較少時通過ziplist實現(xiàn)旗唁,數(shù)據較多時通過dict實現(xiàn)
  • set: 集合摔认,數(shù)據少時intset, 通過hash實現(xiàn)
  • zset: 有序集合,ziplist, skiplist

Sorted Set

  • 數(shù)據較少時电谣,通過ziplist實現(xiàn)抹蚀。壓縮鏈表,元素壓縮編碼
  • 數(shù)據較多時晒来,通過zset實現(xiàn)郑现,包含一個dict和一個skiplist。dict用來查詢數(shù)據到score的映射關系攒读,skiplist用來根據score查詢數(shù)據(支持范圍查詢)辛友。
  • dict: 字典,鏈表解決碰撞
  • skiplist: 跳表邓梅,實現(xiàn)簡單邑滨,范圍查詢,內存占用少

發(fā)布訂閱

  • 角色:Channel掖看,Publisher,Subscriber

命令:

  • PUBLISH
  • SUBSCRIBE
  • UNSUBSCRIBE
  • PSUBSCRIBE
  • UNPSUBSCRIBE

訂閱Channel

  • redisServer.pubsub_channels 字典
  • 把client添加到channel墨礁,一個channel對應多個client
  • 把channel添加到client

訂閱模式

  • redisServer.pubsub_patterns 鏈表
  • 把{client,pattern}添加到鏈表里

發(fā)布消息

  • 在字典里找出channel,遍歷上面的client列表焕毫,發(fā)送信息給client
  • 遍歷模式列表驶乾,如果模式能夠匹配channel,發(fā)送信息給client

謝謝閱讀疙咸!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末风科,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子题山,更是在濱河造成了極大的恐慌故痊,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慨菱,死亡現(xiàn)場離奇詭異戴甩,居然都是意外死亡,警方通過查閱死者的電腦和手機洲劣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來郊尝,“玉大人,你說我怎么就攤上這事流昏⊥袒瘢” “怎么了各拷?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵烤黍,是天一觀的道長傻盟。 經常有香客問我,道長娘赴,這世上最難降的妖魔是什么诽表? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任关顷,我火速辦了婚禮,結果婚禮上议双,老公的妹妹穿的比我還像新娘。我一直安慰自己汞舱,他們只是感情好宗雇,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布赔蒲。 她就那樣靜靜地躺著,像睡著了一般舞虱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上损趋,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天浑槽,我揣著相機與錄音,去河邊找鬼桐玻。 笑死,一個胖子當著我的面吹牛嫉髓,可吹牛的內容都是我干的邑闲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼苫耸,長吁一口氣:“原來是場噩夢啊……” “哼褪子!你這毒婦竟也來了?” 一聲冷哼從身側響起嫌褪,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤笼痛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后摘刑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刻坊,經...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡谭胚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年灾而,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绰疤。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡轻庆,死狀恐怖,靈堂內的尸體忽然破棺而出纷宇,到底是詐尸還是另有隱情蛾方,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布拓春,位于F島的核電站亚隅,受9級特大地震影響,放射性物質發(fā)生泄漏懂鸵。R本人自食惡果不足惜匆光,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一酿联、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧采幌,春花似錦、人聲如沸休傍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至江咳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爹土,已是汗流浹背胀茵。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工琼娘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瞒瘸。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓熄浓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谎柄。 傳聞我的和親對象是個殘疾皇子惯雳,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容

  • 一劈猿、Redis高可用概述 在介紹Redis高可用之前潮孽,先說明一下在Redis的語境中高可用的含義。 我們知道往史,在w...
    空語閱讀 1,597評論 0 2
  • 企業(yè)級redis集群架構的特點 海量數(shù)據 高并發(fā) 高可用 要達到高可用仗颈,持久化是不可減少的,持久化主要是做災難恢復...
    lucode閱讀 2,206評論 0 7
  • 什么是Redis Remote DIctionary Server(Redis) 是一個由Salvatore Sa...
    碼道功臣閱讀 651評論 0 5
  • 標簽: redis 緩存 主從 哨兵 集群 本文簡單的介紹redis三種模式在linux的安裝部署和數(shù)據存儲的總結...
    luhanlin閱讀 4,329評論 0 5
  • 一椎例、Redis持久化概述 持久化的功能:Redis是內存數(shù)據庫挨决,數(shù)據都是存儲在內存中,為了避免進程退出導致數(shù)據的永...
    心似南風閱讀 928評論 0 1