基本數(shù)據(jù)類型
- string
- hash
- list
- set
- zset
數(shù)據(jù)遷移方法
- move(基本廢除)
- dump+restore(非原子性)
- migrate (原子性)
鍵的遍歷
- keys(全量)
- scan(漸進(jìn)式贪婉,解決keys可能帶來(lái)的阻塞問(wèn)題)
redis高性能的三個(gè)因素
- 純內(nèi)存存儲(chǔ),IO多路復(fù)用吼蚁,單線程
慢查詢
slowlog-log-slower-than 和slowlog-max-len
慢查詢不包含命令網(wǎng)絡(luò)和排隊(duì)時(shí)間
日志列表是一個(gè)先進(jìn)先出的隊(duì)列,日志比較多的情況下记焊,可能會(huì)丟失部分慢查詢命令袱讹,一般需要做日志持久化存儲(chǔ)面睛。
pipeline
- 可以有效減少RTT次數(shù),但是每次Pipeline的命令數(shù)量不能無(wú)節(jié)制
redis-lua腳本
- 可以創(chuàng)建出原子冲甘,高效绩卤,自定義命令組合
- redis執(zhí)行l(wèi)ua腳本兩種方法: eval和evalsha
節(jié)省內(nèi)存
bitmaps (位數(shù)組)可以用來(lái)做獨(dú)立用戶統(tǒng)計(jì)途样,有效節(jié)省內(nèi)存;如果存在大的偏移量濒憋,由于申請(qǐng)大內(nèi)存會(huì)導(dǎo)致阻塞
hyperLogLog (伯努利實(shí)驗(yàn)娘纷,統(tǒng)計(jì)總數(shù),存在誤差)
發(fā)布訂閱
- publish,subscribe(用于聊天室跋炕,系統(tǒng)解耦赖晶,公告消息)
- 相比專業(yè)消息隊(duì)列系統(tǒng)功能較弱,不過(guò)足夠簡(jiǎn)單辐烂。
GEO
- 底層實(shí)現(xiàn)用zset
redis客戶端總結(jié)
客戶端api
-
客戶端類型(11種遏插,常用下面三種)
- normal 普通客戶端(flag=N)
- slave 用于復(fù)制(flag=S)
- pubsub 發(fā)布訂閱(flag=O)
client list 列出與redis服務(wù)器相連接的所有客戶端信息
-
info clients 列出輸入和輸入緩沖區(qū)的對(duì)象數(shù)
qbuf,qbuf-free 客戶端緩沖區(qū),作用將客戶端發(fā)送的命令臨時(shí)保存纠修,同時(shí)redis從輸入的緩沖區(qū)拉取命令并執(zhí)行
qbuf緩沖的總?cè)萘扛斐埃琿buf-free緩沖剩余容量
輸入緩沖區(qū)過(guò)大的原因
- 是因?yàn)閞edis的處理速度跟不上輸入緩沖區(qū)的速度
- redis發(fā)生了阻塞,短期里不能處理命令扣草,造成客戶端輸入的命令積壓在緩沖區(qū)
- 合理防范了牛,通過(guò)定期執(zhí)行client list命令,收集qbuf和qbuf-free找到異常連接記錄進(jìn)行分析辰妙,通過(guò)info clients找到輸入緩沖區(qū)的預(yù)警參數(shù)進(jìn)行預(yù)警提示
- 在開(kāi)發(fā)中要減少bigkey,減少redis阻塞鹰祸,合理的監(jiān)控報(bào)警
輸出緩沖區(qū)(固定緩沖區(qū)->字節(jié)數(shù)組,動(dòng)態(tài)緩沖區(qū)->列表)
obl固定緩沖區(qū)的長(zhǎng)度
oll動(dòng)態(tài)緩沖區(qū)的長(zhǎng)度
omem代表使用的字節(jié)數(shù)
預(yù)防輸出緩沖區(qū)出現(xiàn)異常
- 進(jìn)行監(jiān)控密浑,設(shè)置閾值蛙婴,超過(guò)閾值及時(shí)處理
- 限制普通客戶端輸出到緩沖區(qū),把錯(cuò)誤扼殺在搖籃
- 適當(dāng)增大slave的輸出緩沖區(qū)尔破,如果master節(jié)點(diǎn)寫入較大街图,slave客戶端的輸出緩沖區(qū)可能會(huì)比較大,一旦slave客戶端連接因?yàn)檩敵鼍彌_區(qū)溢出被kill懒构,會(huì)造成復(fù)制重連餐济。
- 限制容易造成輸出緩沖區(qū)增大的命令
- 及時(shí)監(jiān)控內(nèi)存,一旦發(fā)生抖動(dòng)頻繁胆剧,可能就是輸出緩沖區(qū)過(guò)大絮姆。
-
客戶端限制
- maxclients 限制最大客戶端連接數(shù)(通過(guò)config set maxclients對(duì)客戶端連接數(shù)動(dòng)態(tài)設(shè)置)
- timeout 限制連接的最大空閑時(shí)間,一旦客戶端連接的idle(空閑時(shí)間)超過(guò)了timeout, 連接將會(huì)被關(guān)閉
-
客戶端常見(jiàn)異常
- 無(wú)法從連接池獲取連接(1>高并發(fā)下連接池供不應(yīng)求, 2>連接池沒(méi)有正確釋放赞赖,3>客戶端存在慢查詢滚朵,4>服務(wù)端執(zhí)行命令阻塞)
- 讀寫超時(shí)
- 客戶端連接超時(shí)
- 客戶端緩存區(qū)異常
- lua腳本正在執(zhí)行
- redis加載持久化文件
- 使用內(nèi)存超過(guò)maxmemory設(shè)置
- 客戶端連接數(shù)過(guò)大
-
數(shù)據(jù)持久化
-
RDB
命令bgsave
執(zhí)行流程
-
優(yōu)點(diǎn)
RDB是一個(gè)緊湊的二進(jìn)制壓縮文件,代表Redis在某個(gè)時(shí)間點(diǎn)上的數(shù)據(jù)快照前域,非常適合備份,全量復(fù)制韵吨。比如每隔6小時(shí)執(zhí)行bgsave
-
缺點(diǎn)
RDB無(wú)法實(shí)時(shí)持久化(秒級(jí)別)匿垄,因?yàn)閎gsave運(yùn)行時(shí)會(huì)執(zhí)行fork創(chuàng)建子進(jìn)程,屬于重量級(jí)操作,頻繁執(zhí)行成本過(guò)高
RDB使用特定二進(jìn)制保存椿疗,redis版本演進(jìn)過(guò)程中漏峰,存在老版本無(wú)法兼容新版本
-
AOF
實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)持久化,以獨(dú)立日志的方式記錄每次寫命令届榄,在重啟時(shí)重新執(zhí)行AOF文件達(dá)到數(shù)據(jù)恢復(fù)的作用
-
執(zhí)行流程
1)所有的寫入命令會(huì)追加到AOF_buf(緩沖區(qū))
2)AOF緩沖區(qū)根據(jù)一定策略項(xiàng)硬盤做同步操作
3)隨著AOF文件越來(lái)越大浅乔,需要定期對(duì)AOF重寫,達(dá)到壓縮的目的
4)當(dāng)redis服務(wù)重啟時(shí)铝条,可以加載AOF文件進(jìn)行數(shù)據(jù)恢復(fù)
-
持久化方式
1)執(zhí)行AOF重寫請(qǐng)求
2)父進(jìn)程執(zhí)行fork創(chuàng)建子進(jìn)程靖苇,開(kāi)銷等同于bgsave
3)主進(jìn)程完成fork后,繼續(xù)執(zhí)行其他命令班缰。所有修改命令依然寫入AOF緩沖區(qū)并根據(jù)appendfsync策略同步硬盤贤壁,保證AOF機(jī)制正確;由于fork操作運(yùn)用復(fù)寫技術(shù)埠忘,子進(jìn)程只能共享fork操作時(shí)的內(nèi)存數(shù)據(jù)脾拆。由于父進(jìn)程依然響應(yīng)命令,redis使用“AOF重寫緩沖區(qū)”保存這部分新數(shù)據(jù)莹妒,防止AOF文件生成期間丟失這部分?jǐn)?shù)據(jù)名船。
4)子進(jìn)程根據(jù)內(nèi)存快照,按照命令合并規(guī)則寫入到新的AOF文件旨怠。
-
啟動(dòng)加載
1)AOF持久化開(kāi)啟包帚,優(yōu)先加載AOF文件
2)AOF文件不存在加在RDB文件
3)加載AOF/RDB文件成功后,Redis啟動(dòng)成功
4)AOF/RDB文件存在錯(cuò)誤時(shí)运吓,Redis啟動(dòng)失敗渴邦,打印錯(cuò)誤日志
-
改善fork操作耗時(shí)
1)優(yōu)先使用物理機(jī)或者高效支持fork操作的虛擬技術(shù),避免使用Xen.
2)控制redis實(shí)例最大使用內(nèi)存拘哨,fork耗時(shí)跟內(nèi)存量成正比谋梭,線上建議10GB內(nèi)
3)合理配置linux內(nèi)存分配策略
4)降低fork操作頻率,適度放寬AOF觸發(fā)時(shí)機(jī)倦青,避免全量復(fù)制
-
-
-
復(fù)制
參與復(fù)制的redis節(jié)點(diǎn)分為主節(jié)點(diǎn)和從節(jié)點(diǎn)瓮床,默認(rèn)redis實(shí)例都是主節(jié)點(diǎn),每個(gè)從節(jié)點(diǎn)只能有一個(gè)主節(jié)點(diǎn)产镐。復(fù)制的流程是單向的隘庄,只能從主節(jié)點(diǎn)復(fù)制到從節(jié)點(diǎn)。
啟動(dòng)1>癣亚,配置文件添加slaveof {masterHost} {masterPort} 隨redis啟動(dòng)生效丑掺;2> 客戶端redis-server --slaveof {masterHost} {masterPort} 生效;3> 直接使用slaveof {masterHost} {masterPort} 生效
slave 是異步命令述雾,執(zhí)行后節(jié)點(diǎn)只保留主節(jié)點(diǎn)信息后返回街州,后續(xù)復(fù)制流程在節(jié)點(diǎn)內(nèi)部異步執(zhí)行兼丰。可使用info replication 命令查看復(fù)制信息
斷開(kāi)連接 slave of one
-
切主操作 slave {newMasterIP} {newMasterPort}
- 斷開(kāi)當(dāng)前主節(jié)點(diǎn)連接復(fù)制關(guān)系
- 建立與新主節(jié)點(diǎn)復(fù)制關(guān)系
- 清除從節(jié)點(diǎn)當(dāng)前所有數(shù)據(jù)
- 對(duì)新節(jié)點(diǎn)進(jìn)行復(fù)制操作
-
復(fù)制拓?fù)?/p>
- 一主一從(注意主節(jié)點(diǎn)重啟時(shí)的數(shù)據(jù)持久化)
- 一主多從唆缴,網(wǎng)狀(實(shí)現(xiàn)讀寫分離鳍征,可以用其中一臺(tái)從節(jié)點(diǎn)集中實(shí)現(xiàn)慢查詢,主節(jié)點(diǎn)負(fù)責(zé)寫入面徽,從節(jié)點(diǎn)負(fù)責(zé)讀妊薮浴)
- 樹(shù)狀拓?fù)洌ǚ乐怪鞴?jié)點(diǎn)到從節(jié)點(diǎn)數(shù)據(jù)傳輸造成主節(jié)點(diǎn)壓力過(guò)大)
-
復(fù)制過(guò)程(原理)
從節(jié)點(diǎn)執(zhí)行salveof 命令后,就開(kāi)始執(zhí)行復(fù)制
- 保存主節(jié)點(diǎn)信息
- 從節(jié)點(diǎn)salveof通過(guò)內(nèi)部定時(shí)任務(wù)維護(hù)復(fù)制邏輯趟紊,從節(jié)點(diǎn)發(fā)起scoket套接字到主節(jié)點(diǎn)建立網(wǎng)絡(luò)連接
- 發(fā)送ping命令驗(yàn)證網(wǎng)絡(luò)套接字是否可用
- 權(quán)限校驗(yàn)氮双,如果主節(jié)點(diǎn)設(shè)置了requriepass認(rèn)證,從節(jié)點(diǎn)在配置文件中設(shè)置masterauth進(jìn)行校驗(yàn)
- 同步數(shù)據(jù)集织阳,首次建立連接需要全量同步數(shù)據(jù)集比較耗時(shí)眶蕉,在首次同步后,可進(jìn)行數(shù)據(jù)部分復(fù)制唧躲。
- 命令持續(xù)復(fù)制造挽。
全量復(fù)制
部分復(fù)制
-
主從心跳檢查
主節(jié)點(diǎn)默認(rèn)每隔十秒向從節(jié)點(diǎn)發(fā)送ping
-
從節(jié)點(diǎn)主線程每隔一秒通過(guò) replconf ack offset 給主節(jié)點(diǎn)上報(bào)自身偏移量
replconf 作用, 檢查網(wǎng)絡(luò)狀態(tài)弄痹, 檢查偏移量從緩沖區(qū)復(fù)制增量數(shù)據(jù)
-
異步復(fù)制
異步復(fù)制指在寫命令完成后并不等主節(jié)點(diǎn)同步復(fù)制到從節(jié)點(diǎn)完成饭入,直接返回客戶端寫入結(jié)果
-
阻塞
-
阻塞的常見(jiàn)原因
-
API或數(shù)據(jù)結(jié)構(gòu)使用不合理
減少慢查詢,減少大對(duì)象
CPU飽和問(wèn)題
持久化相關(guān)阻塞
-
-
阻塞外在原因
- CPU競(jìng)爭(zhēng)
- 內(nèi)存交換
- 網(wǎng)絡(luò)問(wèn)題
-
-
內(nèi)存管理
- 內(nèi)存信息查看(info memory)
- 對(duì)象內(nèi)存
- 緩沖內(nèi)存
- 內(nèi)存碎片
-
內(nèi)存調(diào)整
內(nèi)存上線
動(dòng)態(tài)調(diào)整內(nèi)存上線
-
內(nèi)存回收
- 刪除過(guò)期鍵對(duì)象
- 惰性刪除
- 定時(shí)任務(wù)刪除
-
內(nèi)存溢出控制策略(config set maxmemory-policy{policy}動(dòng)態(tài)配置)
- noeviction: 默認(rèn)策略肛真,不刪除任何數(shù)據(jù)谐丢,拒絕所有寫入
- volatile-lru: 根據(jù)LRU算法設(shè)置過(guò)期鍵,直到騰出足夠空間蚓让。如果沒(méi)有課刪除的鍵對(duì)象乾忱,回退到noeviction策略
- allkeys-lru: 根據(jù)LRU算法刪除鍵,不管數(shù)據(jù)有沒(méi)有設(shè)置超時(shí)屬性历极,直到騰出足夠空間為止
- allkeys-random: 隨機(jī)刪除所有鍵窄瘟,直到騰出足夠空間
- volatile-random:隨機(jī)刪除過(guò)期鍵,直到騰出足夠空間
- volatile-ttl:根據(jù)鍵值對(duì)象ttl屬性趟卸,刪除最近將要過(guò)期的數(shù)據(jù)蹄葱,如果沒(méi)有,回到noeviction策略
-
內(nèi)存優(yōu)化
-
redisObject對(duì)象
redis存儲(chǔ)的所有值在內(nèi)部定義為redisObject結(jié)構(gòu)體锄列,內(nèi)部結(jié)構(gòu)包括:
type:對(duì)象類型图云;encoding:內(nèi)部編碼類型:lru:REDIS_LRU_BITS LRU計(jì)時(shí)時(shí)鐘
init refcount: 引用計(jì)算器
void *ptr 數(shù)據(jù)指針(與存儲(chǔ)的數(shù)據(jù)內(nèi)有有關(guān),如果是整數(shù)邻邮,直接存儲(chǔ)數(shù)據(jù)竣况;否則表示指向數(shù)據(jù)的指針,redis3.0之后字符串長(zhǎng)度<=39字節(jié)饶囚,內(nèi)部編碼embstr類型)
-
縮減鍵值長(zhǎng)度減少key和value的長(zhǎng)度
使用工具壓縮json和xml內(nèi)容后存入redis 例如使用 Snappy
-
共享對(duì)象池
redis在啟動(dòng)的時(shí)候內(nèi)部維護(hù)了[0-9999]的整數(shù)對(duì)象池
-
編碼優(yōu)化
ziplist編碼主要是為了節(jié)約內(nèi)存帕翻,因此所有數(shù)據(jù)都是采用線性連續(xù)的內(nèi)存結(jié)構(gòu)鸠补。ziplist編碼是應(yīng)用廣泛的一種萝风,可以作為hash,list,zset類型的底層數(shù)據(jù)結(jié)構(gòu)嘀掸。
ziplist (壓縮列表編碼)
intset編碼
-
控制鍵的數(shù)量
當(dāng)redis存儲(chǔ)大量數(shù)據(jù)時(shí),通常會(huì)存儲(chǔ)大量的鍵名规惰,過(guò)多的鍵會(huì)消耗較多的內(nèi)存睬塌,使用相同的數(shù)據(jù)結(jié)構(gòu)可以減少外層鍵名,減少內(nèi)存占用
-
hash結(jié)構(gòu)降低鍵數(shù)量分析
根據(jù)鍵的規(guī)模在客戶端通過(guò)分組映射到一組hash對(duì)象中歇万,如存在100萬(wàn)個(gè)鍵揩晴,可以映射到1000個(gè)hash中,每個(gè)hash保存1000個(gè)元素
hash的field可用于記錄原始key字符串贪磺,方便哈希查找
hash的value保存原始值對(duì)象硫兰,確保不要超過(guò)hash-max-ziplist-value限制
-
ziplist編碼的hash和string比較
同樣數(shù)據(jù)ziplist編碼比string節(jié)約內(nèi)存;
隨著value空間的減少寒锚,節(jié)約內(nèi)存越來(lái)越明顯
hash-ziplist比string寫入耗時(shí)劫映,但隨著value空間的減少,耗時(shí)逐漸減少
-
hash類型內(nèi)存節(jié)省原理
- hash使用ziplist編碼節(jié)約內(nèi)存刹前,如果使用hashtable反而會(huì)增加內(nèi)存
2)ziplist長(zhǎng)度需要控制在1000以內(nèi)泳赋,否則由于存取時(shí)間復(fù)雜度在O(N)到O(N2)之間,長(zhǎng)列表會(huì)導(dǎo)致CPU消耗嚴(yán)重喇喉,得不償失祖今。
3)ziplist適合存儲(chǔ)小對(duì)象,對(duì)于大對(duì)象不但內(nèi)存優(yōu)化效果不明顯還會(huì)增加命令耗時(shí)拣技。
4)需要預(yù)估鍵的規(guī)模千诬,從而確定每個(gè)hash結(jié)構(gòu)需要存儲(chǔ)的數(shù)量。
5)根據(jù)hash長(zhǎng)度和元素大小膏斤,調(diào)整hash-max-ziplist-entries和hash-max-ziplist-value參數(shù)徐绑,確保hash類型使用ziplist編碼
-
hash鍵和field鍵的設(shè)計(jì)
1)當(dāng)鍵離散度較高時(shí),可以按字符串位截取掸绞,把后三位作為哈希的field,之前那部分作為哈希的鍵泵三。如:key=194888 哈希key=group : hash:194 , 哈希field=888
2)當(dāng)鍵離散度較低時(shí),可以使用哈希算法打散鍵衔掸,如使用crc32(key)&10000函數(shù)把鍵映射到“0-9999”整數(shù)范圍烫幕,哈希field存儲(chǔ)的原始值。
3)盡量減少hash鍵和field的長(zhǎng)度敞映。
-
hash結(jié)構(gòu)控制鍵存在的問(wèn)題
雖然hash存儲(chǔ)可以降低內(nèi)存较曼,但是同樣會(huì)帶來(lái)問(wèn)題:
1)客戶端需要預(yù)估鍵的規(guī)模設(shè)計(jì)分組規(guī)則,加重客戶端開(kāi)發(fā)成本
2)hash重構(gòu)后所有鍵無(wú)法使用超時(shí)和LRU淘汰機(jī)制振愿,需要手動(dòng)維護(hù)
ziplist+hash優(yōu)化keys后捷犹,如果想使用超時(shí)刪除功能弛饭,開(kāi)發(fā)人員可以存儲(chǔ)每個(gè)對(duì)象的寫入時(shí)間,然后通過(guò)定時(shí)任務(wù)使用hscan命令掃描數(shù)據(jù)萍歉,找出hash內(nèi)超時(shí)的數(shù)據(jù)刪除
-
-
哨兵
-
實(shí)現(xiàn)原理
-
三個(gè)定時(shí)任務(wù)完成對(duì)各節(jié)點(diǎn)的發(fā)現(xiàn)和監(jiān)控
1)每隔10秒侣颂,每個(gè)sentinel節(jié)點(diǎn)會(huì)向主節(jié)點(diǎn)和從節(jié)點(diǎn)發(fā)送info命令獲取最新的拓?fù)浣Y(jié)構(gòu),通過(guò)向主節(jié)點(diǎn)執(zhí)行info命令枪孩,獲取從節(jié)點(diǎn)的信息憔晒,這也是為什么sentinel節(jié)點(diǎn)不需要顯示配置監(jiān)控從節(jié)點(diǎn);感知新節(jié)點(diǎn)的加入蔑舞;節(jié)點(diǎn)不可達(dá)或者故障轉(zhuǎn)移后拒担,通過(guò)info更新拓?fù)湫畔ⅰ?/p>
2)每隔2秒,每個(gè)sentinel節(jié)點(diǎn)會(huì)向redis數(shù)據(jù)節(jié)點(diǎn)的_ sentinel _ :hello頻道上發(fā)送Sentinel節(jié)點(diǎn)對(duì)于主節(jié)點(diǎn)的判斷以及當(dāng)前sentinel節(jié)點(diǎn)的信息攻询,同時(shí)每個(gè)sentinel節(jié)點(diǎn)也會(huì)訂閱該頻道从撼,來(lái)了解其他Sentinel節(jié)點(diǎn)以及它們對(duì)節(jié)點(diǎn)判斷。
3)每隔一秒钧栖,每個(gè)Sentinel節(jié)點(diǎn)會(huì)向主節(jié)點(diǎn)低零,從節(jié)點(diǎn),其余Sentinel節(jié)點(diǎn)發(fā)送一條ping命令做一次心跳檢查桐经。來(lái)確認(rèn)這些節(jié)點(diǎn)是否可達(dá)毁兆。
因此通過(guò)三個(gè)定時(shí)任務(wù)實(shí)現(xiàn)個(gè)sentinel節(jié)點(diǎn),主節(jié)點(diǎn)阴挣,從節(jié)點(diǎn)之間的連接和監(jiān)控
-
主觀下線
每個(gè)Sentinel節(jié)點(diǎn)會(huì)每隔1秒對(duì)主節(jié)點(diǎn)气堕,從節(jié)點(diǎn),其他sentinel發(fā)送ping命令做心跳檢測(cè)畔咧,當(dāng)這些節(jié)點(diǎn)超過(guò)down-after-millseconds沒(méi)有進(jìn)行有效回復(fù)茎芭,sentinel節(jié)點(diǎn)就會(huì)對(duì)該節(jié)點(diǎn)做失敗判定,這個(gè)行為為主觀下線誓沸。
-
客觀下線
當(dāng)sentinel主觀下線的節(jié)點(diǎn)是主節(jié)點(diǎn)時(shí)梅桩,該Sentinel節(jié)點(diǎn)會(huì)通過(guò)sentinel is-master-down-by-addr 命令向其他節(jié)點(diǎn)詢問(wèn)對(duì)主節(jié)點(diǎn)的判斷,當(dāng)超過(guò)< quorum >個(gè)數(shù)拜隧,Sentinel節(jié)點(diǎn)會(huì)認(rèn)為主節(jié)點(diǎn)確實(shí)有問(wèn)題宿百,這時(shí)該Sentinel節(jié)點(diǎn)會(huì)做出客觀下線決定。
-
領(lǐng)導(dǎo)者選舉
raft算法實(shí)現(xiàn)leader選舉
1)每個(gè)在線的sentinel節(jié)點(diǎn)都有資格成為領(lǐng)導(dǎo)者洪添,當(dāng)它確認(rèn)主節(jié)點(diǎn)主觀下線時(shí)候垦页,會(huì)向其他Sentinel節(jié)點(diǎn)發(fā)送 sentinel is-master-down-by-addr命令,要求自己成為領(lǐng)導(dǎo)者
-
-
集群
-
數(shù)據(jù)分區(qū)
- 節(jié)點(diǎn)取余分區(qū)
2)一致性哈希分區(qū)()
3)虛擬槽分區(qū)
-
集群功能限制
- key 批量操作支持有限干奢。如mset痊焊,mget,目前只支持slot值的key執(zhí)行批量操作,對(duì)于slot值的key用于執(zhí)行mget,mset等操作存在于多個(gè)節(jié)點(diǎn)上不支持
2)key事務(wù)操作支持有限薄啥,同樣只支持同一節(jié)點(diǎn)上的事務(wù)操作
3)key作為數(shù)據(jù)分區(qū)的最小粒度辕羽,因此不能將一個(gè)大的鍵值對(duì)象hash,list映射到不同節(jié)點(diǎn)。
- 不支持多數(shù)據(jù)庫(kù)空間垄惧。單機(jī)下redis支持16個(gè)庫(kù)刁愿,集群只支持db0數(shù)據(jù)庫(kù)空間。
5)復(fù)制結(jié)構(gòu)只支持一層赘艳,從節(jié)點(diǎn)只能復(fù)制主節(jié)點(diǎn)酌毡,不支持嵌套樹(shù)狀復(fù)制結(jié)構(gòu)克握。
-
搭建集群
- 準(zhǔn)備節(jié)點(diǎn)
2)節(jié)點(diǎn)握手(Gossip流言算法)
3)分配槽(16384個(gè)槽全部分配完成蕾管,集群才可以上線)
-
節(jié)點(diǎn)通信
1)集群中的每個(gè)節(jié)點(diǎn)都會(huì)單獨(dú)開(kāi)辟一個(gè)TCP通道,用于節(jié)點(diǎn)之間彼此通信菩暗,通信端口號(hào)在基礎(chǔ)上加10000.
2)每個(gè)節(jié)點(diǎn)在固定周期內(nèi)通過(guò)特定規(guī)則選擇幾個(gè)節(jié)點(diǎn)發(fā)送ping消息掰曾。
3)接收到ping消息的節(jié)點(diǎn)用pong消息作為響應(yīng)。
-
消息種類
(消息格式:消息頭和消息體)
消息頭包含發(fā)送節(jié)點(diǎn)自身狀態(tài)數(shù)據(jù)接收節(jié)點(diǎn)消息頭就可以獲取到發(fā)送的相關(guān)數(shù)據(jù)停团。(節(jié)點(diǎn)id旷坦,槽映射,節(jié)點(diǎn)標(biāo)識(shí))
消息體:定義發(fā)送消息的數(shù)據(jù)佑稠,使用cluster MsgDataGossip數(shù)組作為消息體數(shù)據(jù)秒梅。
meet 用于通知新節(jié)點(diǎn)加入
ping 用于檢測(cè)和交換信息,包含了自身節(jié)點(diǎn)和部分其他節(jié)點(diǎn)狀態(tài)數(shù)據(jù)
pong 用于接收到meet和ping后返回自身狀態(tài)舌胶,也可以在集群里廣播自身狀態(tài)
fail當(dāng)判斷某個(gè)節(jié)點(diǎn)下線后捆蜀,在集群里進(jìn)行廣播該節(jié)點(diǎn)狀態(tài)
-
集群伸縮
擴(kuò)容集群
1)準(zhǔn)備新節(jié)點(diǎn)
2)加入集群
3)遷移槽和數(shù)據(jù)
加入的新節(jié)點(diǎn)剛開(kāi)始都是主節(jié)點(diǎn)狀態(tài),但是由于沒(méi)有負(fù)責(zé)的槽幔嫂,所以不能接受任何讀寫操作辆它。
遷移槽和數(shù)據(jù)
槽遷移需要保證每個(gè)負(fù)責(zé)相似數(shù)量的槽,從而保證各節(jié)點(diǎn)的數(shù)量均勻
數(shù)據(jù)遷移過(guò)程是逐個(gè)槽進(jìn)行的履恩,每個(gè)槽數(shù)據(jù)遷移流程
1)對(duì)目標(biāo)節(jié)點(diǎn)發(fā)送cluster setslot {slot} importing {sourceNodeId}命令锰茉,讓目標(biāo)節(jié)點(diǎn)準(zhǔn)備導(dǎo)入槽的數(shù)據(jù)
-
-