干貨柴淘!帶你了解為什么那么多開源項目都是用Redis!

很多開源項目中都使用了redis,這些項目為什么使用redis秘通?使用redis有什么好處为严?怎么使用redis充易?帶著這些疑問梗脾,我們來了解一下redis。

一盹靴、什么是Redis

Redis是一個免費開源用于內(nèi)存存儲的數(shù)據(jù)結(jié)構(gòu)服務(wù)器,可用作數(shù)據(jù)庫稿静,高速緩存和消息隊列代理。它支持字符串改备、哈希表控漠、列表、集合悬钳、有序集合等數(shù)據(jù)類型。它支持多種集群部署默勾,輔助項目達(dá)到更高的性能。

二母剥、Redis的結(jié)構(gòu)

Redis 數(shù)據(jù)類型分為:字符串形导、哈希、列表朵耕、集合、有序集合等五種類型阎曹。

1.String(字符串)

字符串類型是redis中最基本的數(shù)據(jù)類型,一個key對應(yīng)一個value芬膝。字符串類型實際上可以是字符串(簡單的字符串、復(fù)雜的字符串(xml锰霜、json)桐早、數(shù)字(整數(shù)癣缅、浮點數(shù))哄酝、二進(jìn)制(圖片、音頻陶衅、視頻))等,但最大不能超過512M搀军。

2.Hash(哈希)

哈希類型是一個Map,我們知道redis本身就是鍵值對結(jié)構(gòu)罩句,哈希結(jié)構(gòu)就是“值”也充當(dāng)鍵值對結(jié)構(gòu),如 value={{value-a1,value-b1},......value-an,value-bn}}

3.list(鏈表)

列表類型是用來儲存多個有序的字符串门烂,列表中的每個字符串成為元素(element),一個列表最多可以儲存2的32次方-1個元素,在redis中屯远,可以隊列表兩端插入(pubsh)和彈出(pop),還可以獲取指定范圍的元素列表慨丐、獲取指定索引下表的元素等,列表是一種比較靈活的數(shù)據(jù)結(jié)構(gòu)咖气,它可以充當(dāng)棧和隊列的角色,在實際開發(fā)中有很多應(yīng)用場景崩溪。

4.Set(集合)

集合類型也是用來保存多個字符串的元素,但和列表不同的是集合中不允許有重復(fù)的元素伶唯,并且集合中的元素是無序的,不能通過索引下標(biāo)獲取元素乳幸,redis除了支持集合內(nèi)的增刪改查,同時還支持多個集合取交集粹断、并集、差集瓶埋,并合理的使用好集合類型

5.zset (有序集合)

有序集合也是用來保存多個字符串的元素,跟集合的區(qū)別在于养筒,有序集合中的元素是可以排序的,它給每個元素設(shè)置一個分?jǐn)?shù)晕粪,作為排序的依據(jù)。

三巫湘、Redis的三種集群模式

Redis的三種集群模式主要是:主從模式(redis2.8版本之前的模式)、哨兵sentinel模式(redis2.8及之后的模式)和redis cluster集群模式(redis3.0版本之后)剩膘。

1、主從模式(master-slave)

(1)模式來源:

同Mysql主從復(fù)制的原因一樣畏梆,Redis雖然讀取寫入的速度都特別快,但是也會產(chǎn)生讀壓力特別大的情況奠涌。為了分擔(dān)讀壓力,Redis支持主從復(fù)制溜畅,在主從復(fù)制中,數(shù)據(jù)庫分為兩類:主數(shù)據(jù)庫(master)和從數(shù)據(jù)庫(slave)慈格。Redis的主從結(jié)構(gòu)可以采用一主多從或者級聯(lián)結(jié)構(gòu)怠晴,客戶端可對主數(shù)據(jù)庫進(jìn)行讀寫操作浴捆,對從數(shù)據(jù)庫進(jìn)行讀操作,主數(shù)據(jù)庫寫入的數(shù)據(jù)會實時自動同步給從數(shù)據(jù)庫选泻。

(2)工作機(jī)制:

當(dāng)主數(shù)據(jù)庫slave啟動后,主動向從數(shù)據(jù)庫master發(fā)送同步SYNC命令页眯。master接收到SYNC命令后在后臺保存快照(RDB持久化)和緩存保存快照這段時間的命令,然后將保存的快照文件和緩存的命令發(fā)送給slave窝撵。slave接收到快照文件和命令后加載快照文件和緩存的執(zhí)行命令。

復(fù)制初始化后忿族,master每次接收到的寫命令都會同步發(fā)送給slave,保證主從數(shù)據(jù)一致性道批。

(3)優(yōu)缺點

優(yōu)點:master能自動將數(shù)據(jù)同步到slave,可以進(jìn)行讀寫分離隆豹,分擔(dān)master的讀壓力;

master璃赡、slave之間的同步是以非阻塞的方式進(jìn)行的,同步期間碉考,客戶端仍然可以提交查詢或更新請求

缺點:不具備自動容錯與恢復(fù)功能。主從模式下侯谁,master節(jié)點在主從模式中唯一,若master掛掉墙贱,則redis無法對外提供寫服務(wù),導(dǎo)致客戶端請求失敗惨撇,需要等待機(jī)器重啟或手動切換客戶端IP才能恢復(fù);

master宕機(jī)报腔,如果宕機(jī)前數(shù)據(jù)沒有同步完株搔,則切換IP后會存在數(shù)據(jù)不一致的問題

難以支持動態(tài)擴(kuò)容榄笙,Redis的容量受限于單機(jī)配置邪狞。

?2茅撞、哨兵(Sentinel)

(1)模式來源:

主從模式的弊端就是不具備高可用性巨朦,當(dāng)master掛掉以后,Redis將不能再對外提供寫入操作糊啡,因此sentinel應(yīng)運而生。sentinel中文含義為哨兵棚蓄,顧名思義,它的作用就是監(jiān)控redis集群的運行狀況梭依。那么如何得知某一臺redis服務(wù)器掛了,如何切換役拴,如何保證備份的機(jī)器是原始服務(wù)器的完整備份呢?這時候就需要Sentinel和Replication(復(fù)制)出場了河闰。Sentinel可以管理多個Redis服務(wù)器,它提供了監(jiān)控姜性,提醒以及自動的故障轉(zhuǎn)移的功能;Replication則是負(fù)責(zé)讓一個Redis服務(wù)器可以配備多個備份的服務(wù)器部念。Redis也是利用這兩個功能來保證Redis的高可用的。

在redis3.0以前的版本要實現(xiàn)集群一般是借助哨兵sentinel工具來監(jiān)控master節(jié)點的狀態(tài)印机,如果master節(jié)點異常,則會做主從切換多柑,將某一臺slave作為master,哨兵的配置略微復(fù)雜竣灌,并且性能和高可用性等各方面表現(xiàn)一般聂沙,特別是在主從切換的瞬間存在訪問瞬斷的情況初嘹,而且哨兵模式只有一個主節(jié)點對外提供服務(wù),沒法支持很高的并發(fā)屯烦,且單個主節(jié)點內(nèi)存也不宜設(shè)置得過大,否則會導(dǎo)致持久化文件過大驻龟,影響數(shù)據(jù)恢復(fù)或主從同步的效率。

(2)工作機(jī)制:

每個Sentinel(哨兵)進(jìn)程以每秒鐘一次的頻率向整個redis集群中的master主服務(wù)器翁狐、slave從服務(wù)器以及其他的Sentinel(哨兵)進(jìn)程發(fā)送一個ping命令。

如果一個實例距離最后一次有效回復(fù)ping命令的時間超過down-after-milliseconds選項所指定的值則這個實例會被Sentinel標(biāo)記為主觀下線(SDOWN)露懒。

如是是master主服務(wù)器被標(biāo)記為SDOWN,則正在監(jiān)控這個服務(wù)器的所有Sentinel都要以每秒一次的頻率確認(rèn)服務(wù)器是否真的已經(jīng)進(jìn)入SDOWN(主觀下線狀態(tài))懈词。

當(dāng)有足夠數(shù)量(≥配置文件配置值)的Sentinel在指定的時間內(nèi)確認(rèn)了master進(jìn)入了SDOWN狀態(tài),則master被標(biāo)記為ODOWN(客觀下線狀態(tài))钦睡。

在一般情況下,每個Sentinel會每10秒向redis 主服務(wù)器和從服務(wù)器發(fā)送Info命令荞怒。但是當(dāng)master被標(biāo)記為客觀下線時,頻率改為1秒一次衰抑。

若沒有足夠數(shù)量的Sentinel同意master服務(wù)器下線,則master的SDOWN狀態(tài)被移除呛踊,若master重新向Sentinel發(fā)送ping命令返回了有效回復(fù),則master的SDOWN狀態(tài)被移除谭网。

(3)優(yōu)缺點

優(yōu)點:哨兵集群,基于主從復(fù)制模式愉择,所有的主從配置優(yōu)點,它都有主從可以切換锥涕,故障可以轉(zhuǎn)移衷戈,高可用性的系統(tǒng)哨兵模式就是主從模式的升級层坠,手動到自動,更加健壯破花;

缺點:Redis不好在線擴(kuò)容的,集群容量一旦到達(dá)上限座每,在線擴(kuò)容就十分麻煩,哨兵模式的配置繁瑣尺栖;

?3烦租、集群(Cluster )

(1)模式來源:

sentinel模式基本可以滿足一般生產(chǎn)的需求,具備高可用性叉橱。但是當(dāng)數(shù)據(jù)量過大到一臺服務(wù)器存放不下的情況時,主從模式或sentinel模式就不能滿足需求了窃祝,這個時候需要對存儲的數(shù)據(jù)進(jìn)行分片,將數(shù)據(jù)存儲到多個Redis實例中粪小。單臺服務(wù)器資源的總是有上限的,CPU資源和IO資源我們可以通過主從復(fù)制探膊,進(jìn)行讀寫分離,把一部分CPU和IO的壓力轉(zhuǎn)移到從服務(wù)器上逞壁。但是內(nèi)存資源怎么辦,主從模式做到的只是相同數(shù)據(jù)的備份腌闯,并不能橫向擴(kuò)充內(nèi)存;單臺機(jī)器的內(nèi)存也只能進(jìn)行加大處理姿骏,但是總有上限的。所以我們就需要一種解決方案,可以讓我們橫向擴(kuò)展畅卓。cluster模式的出現(xiàn)就是為了解決單機(jī)Redis容量有限的問題蟋恬,將Redis的數(shù)據(jù)根據(jù)一定的規(guī)則分配到多臺機(jī)器翁潘。

cluster可以說是sentinel和主從模式的結(jié)合體歼争,通過cluster可以實現(xiàn)主從和master重選功能,所以如果配置兩個副本三個分片的話沐绒,就需要六個Redis實例。因為Redis的數(shù)據(jù)是根據(jù)一定規(guī)則分配到cluster的不同機(jī)器的乔遮,當(dāng)數(shù)據(jù)量過大時,可以新增機(jī)器進(jìn)行擴(kuò)容蹋肮。

使用集群,只需要將redis配置文件中的cluster-enable配置打開即可坯辩。每個集群中至少需要三個主數(shù)據(jù)庫才能正常運行,新增節(jié)點非常方便漆魔。還有就是客戶端與redis節(jié)點直連,不需要中間代理層.客戶端不需要連接集群所有節(jié)點,連接集群中任何一個可用節(jié)點即可。

(2)工作機(jī)制:

在redis的每一個節(jié)點上改抡,有兩樣?xùn)|西我們比較關(guān)注,一個是插槽(slot)雀摘,它的取值范圍是:0~16383。還有一個就是cluster阵赠,它類似是一個集群管理的插件。當(dāng)我們的存取的key到達(dá)的時候清蚀,redis會根據(jù)特定的算法得出一個結(jié)果,然后把結(jié)果對16384求余數(shù)枷邪,這樣每個 key都會對應(yīng)一個編號在 0-16383 之間的哈希槽,通過這個值,去找到對應(yīng)的插槽所對應(yīng)的節(jié)點腹泌,然后直接自動跳轉(zhuǎn)到這個對應(yīng)的節(jié)點上進(jìn)行存取操作尔觉。

Redis Cluster 一般由多個節(jié)點組成幢妄,節(jié)點數(shù)量至少為 6 個才能保證組成完整高可用的集群,其中三個為主節(jié)點浆竭,三個為從節(jié)點拦止。三個主節(jié)點會分配槽报嵌,處理客戶端的命令請求贡未,而從節(jié)點可用在主節(jié)點故障后,頂替主節(jié)點俊卤。

(3)優(yōu)缺點

優(yōu)點:無中心架構(gòu),數(shù)據(jù)按照slot分布在多個節(jié)點瘾蛋;

集群中的每個節(jié)點都是平等的關(guān)系矫限,每個節(jié)點都保存各自的數(shù)據(jù)和整個集群的狀態(tài)。每個節(jié)點都和其他所有節(jié)點連接叼风,而且這些連接保持活躍,這樣就保證了我們只需要連接集群中的任意一個節(jié)點无宿,就可以獲取到其他節(jié)點的數(shù)據(jù);

可線性擴(kuò)展到1000多個節(jié)點孽鸡,節(jié)點可動態(tài)添加或刪除;

能夠?qū)崿F(xiàn)自動故障轉(zhuǎn)移彬碱,節(jié)點之間通過gossip協(xié)議交換狀態(tài)信息,用投票機(jī)制完成slave到master的角色轉(zhuǎn)換巷疼;

缺點:客戶端實現(xiàn)復(fù)雜,驅(qū)動要求實現(xiàn)Smart Client,緩存slots mapping信息并及時更新瓷患,提高了開發(fā)難度;slave充當(dāng)“冷備”擅编,不能緩解讀壓力;批量操作限制沙咏,目前只支持具有相同slot值的key執(zhí)行批量操作班套,對其他的如sunion肢藐、mset和mget等支持不是很好吱韭;

不支持多數(shù)據(jù)庫空間,單機(jī)redis可以支持16個db理盆,從db0到db15,而集群模式下只能使用一個猿规。

綜上所訴,主從模式和哨兵模式都不利于擴(kuò)展姨俩,系統(tǒng)的高可用性都依賴于master的內(nèi)存大小,哨兵模式在redis2.6開始支持环葵,2.8穩(wěn)定,cluster模式是redis可擴(kuò)展的模式张遭。

四、Redis的運用

Redis可用作數(shù)據(jù)庫菊卷,高速緩存和消息隊列代理,那么當(dāng)你打算使用它們這些功能的時候洁闰,可以考慮一下與其他產(chǎn)品的對比,選出一個更好用的铃芦。

1雅镊、redis與Mysql/Oracle數(shù)據(jù)庫比較

Mysql/Oracle等數(shù)據(jù)庫可以將數(shù)據(jù)保存數(shù)據(jù)庫當(dāng)中刃滓,應(yīng)用啟動以后建立數(shù)據(jù)庫連接就可以通過代碼邏輯對數(shù)據(jù)庫進(jìn)行中增刪改查。而Redis也是可以做為數(shù)據(jù)庫來使用的咧虎,它可以看做一個key/value型數(shù)據(jù)庫,Redis會根據(jù)配置定時將內(nèi)存中的數(shù)據(jù)寫入到硬盤中砰诵,但我們在項目中一般不會將Redis直接當(dāng)作數(shù)據(jù)庫來使用,主要原因在于:

(1)Redis只能存儲key/value類型茁彭,雖然value的類型可以有多種,但是對于關(guān)聯(lián)性的記錄查詢理肺,沒有Oracle/Mysql方便。

(2)Redis內(nèi)存數(shù)據(jù)寫入硬盤有一定的時間間隔妹萨,在這個間隔內(nèi)數(shù)據(jù)可能會丟失,安全性不高乎完。

2、redis高速緩存

redis做為高速緩存霍弹,這也是redis應(yīng)用最廣的地方。 對于那些經(jīng)常被查詢,不經(jīng)常被修改和刪除的數(shù)據(jù),利用Redis緩存可以提升網(wǎng)站的訪問速度,大大降低數(shù)據(jù)庫的壓力岛宦。redis作為高速緩存,帶來這么大的優(yōu)勢的同時也存在一定的弊端砾肺,因為Redis是存放在內(nèi)存中的,就會導(dǎo)致內(nèi)存占用過高,另外持久化的代價也過高。

相比于其他的緩存工具变汪,比如Ehcache和Memcached,開源項目使用redis的比例還是要略高一點裙盾,redis同這些緩存工具相比他嫡,有以下特征或者優(yōu)勢:

(1)結(jié)構(gòu)簡單庐完,key/value型數(shù)據(jù)庫钢属,賦值取值方式簡單门躯。但同時它的數(shù)據(jù)結(jié)構(gòu)又非常豐富,它支持字符串讶凉、哈希表、列表懂讯、集合、位圖等數(shù)據(jù)類型域醇。

(2)支持多語言集成,redis發(fā)展到今天譬挚,Redis客戶端支持多種語言,包括:C盐须、C++、C#漆腌、php、java塑径、python、go等語言统舀,根據(jù)自己的開發(fā)語言,選擇合適的redis client版本類型即可誉简。并且每一種語言下還包括多種類型可供選擇,比如Java語言闷串,redis client提供了諸如Jedis筋量、Redisson烹吵、JRedis、JDBC-Redis年叮、RJC、redis-protocol一姿、aredis、lettuce等類型可供選擇叮叹,目前比較推薦使用的是Jedis、Redisson蛉顽。

(3)支持直連模式先较,哨兵模式(Sentinal)携冤,集群模式等闲勺,用于負(fù)載均衡和容災(zāi),具有高可用性菜循。

3、redis 持久化

redis的數(shù)據(jù)是存儲在內(nèi)存中的癌幕,如果搭載redis的服務(wù)器哪天突然心情不好,宕機(jī)不干活了勺远,就會導(dǎo)致所有的緩存都丟失了。雖然可以把Redis服務(wù)器重新上線厅瞎,但是由于內(nèi)存的數(shù)據(jù)丟失,造成了緩存雪崩,應(yīng)用服務(wù)器和數(shù)據(jù)庫的壓力一下子就上來了囊拜,對于一些并發(fā)很高的應(yīng)用,說不動此時就導(dǎo)致應(yīng)用崩潰無法訪問冠跷。這個時候Redis的持久化功能就派上用場了身诺,可以緩解一下緩存雪崩帶來的影響抄囚。redis的持久化指的是redis會把內(nèi)存的中的數(shù)據(jù)寫入到硬盤中霉赡,在redis重新啟動的時候加載這些數(shù)據(jù)幔托,從而最大限度的降低緩存丟失帶來的影響。

4重挑、做為消息隊列

Redis也是可以做為消息隊列的,對于一些要求不高的運用場景可以使用redis谬哀,redis具備發(fā)布訂閱功能。而如果專門來做消息隊列處理或者要求比較谦屑,那還是選擇更專業(yè)一點的Kafka、rabbitMQ等氢橙。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末很洋,一起剝皮案震驚了整個濱河市充蓝,隨后出現(xiàn)的幾起案子喉磁,更是在濱河造成了極大的恐慌,老刑警劉巖协怒,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異仑撞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)隧哮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門座舍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人曲秉,你說我怎么就攤上這事疲牵。” “怎么了纲爸?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵妆够,是天一觀的道長。 經(jīng)常有香客問我责静,道長,這世上最難降的妖魔是什么灾螃? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮腰鬼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘熄赡。我一直安慰自己姜挺,他們只是感情好彼硫,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拧篮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪串绩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天高氮,我揣著相機(jī)與錄音,去河邊找鬼剪芍。 笑死,一個胖子當(dāng)著我的面吹牛罪裹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坊谁,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼滑臊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了雇卷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤关划,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贮折,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡踊赠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年每庆,在試婚紗的時候發(fā)現(xiàn)自己被綠了筐带。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缤灵。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖腮出,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情利诺,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布立倍,位于F島的核電站,受9級特大地震影響口注,放射性物質(zhì)發(fā)生泄漏君珠。R本人自食惡果不足惜寝志,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望材部。 院中可真熱鬧,春花似錦乐导、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛾狗。三九已至,卻和暖如春沉桌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒲牧。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工赌莺, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留冰抢,地道東北人艘狭。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像巢音,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子官撼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容