在了解Redis之前,首先給自己提幾個(gè)疑問(wèn):我們得知道Redis是用來(lái)做什么的?在什么時(shí)候能使用到?它得優(yōu)勢(shì)在什么地方?使用它又需要注意什么?接下來(lái)我們帶著心中得疑問(wèn)一步一步共同學(xué)習(xí)下。
簡(jiǎn)介
Redis(Remote Dictionary Server ),即遠(yuǎn)程字典服務(wù),是一個(gè)開(kāi)源的使用ANSIC語(yǔ)言編寫(xiě)、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API。從2010年3月15日起,Redis的開(kāi)發(fā)工作由VMware主持。從2013年5月開(kāi)始,Redis的開(kāi)發(fā)由Pivotal贊助。
Redis數(shù)據(jù)類(lèi)型
String(字符串):Redis最基本的數(shù)據(jù)類(lèi)型,一個(gè)鍵對(duì)應(yīng)一個(gè)值,一個(gè)鍵值最大存儲(chǔ)512MB
Hash(哈希):hash是一個(gè)鍵值對(duì)的集合,是一個(gè)String類(lèi)型的field和value的映射表,適合用于存儲(chǔ)對(duì)象
?List(列表):是redis的簡(jiǎn)單的字符串列表,按插入順序排序
?Set(集合):是String字符串類(lèi)型的無(wú)序集合,也不可重復(fù)
?ZSet(sorted? set? 有序集合)是String類(lèi)型的有序集合,也不可重復(fù)。有序集合中的每個(gè)元素都需要指定一個(gè)分?jǐn)?shù),根據(jù)分?jǐn)?shù)對(duì)元素進(jìn)行升序排序。
1.Redis是用來(lái)做什么的
緩存,內(nèi)存作為數(shù)據(jù)存儲(chǔ)介質(zhì),讀寫(xiě)數(shù)據(jù)的效率極高,可設(shè)置持久化
消息通知(發(fā)布-訂閱),是進(jìn)程中的一種消息通信模式,發(fā)送者pub發(fā)送消息,訂閱者sub接收消息,一對(duì)一相當(dāng)于私聊,一對(duì)多相當(dāng)于群聊
高速隊(duì)列
2.什么時(shí)候能用到
2.1 緩存
高并發(fā)的數(shù)據(jù),可以放入Redis緩存
頻繁訪問(wèn)且變動(dòng)較小的數(shù)據(jù)可以放入Redis緩存,減少db的io
分布式中可以用來(lái)緩存會(huì)話
排行版
購(gòu)物車(chē)
...
2.2 發(fā)布-訂閱
應(yīng)用中聊天,消息交流
支付完成后,等待服務(wù)器通知支付結(jié)果
實(shí)時(shí)公告或通知
....? ?
PS:如果數(shù)據(jù)量大,可以去看看Kafka
2.3 隊(duì)列
支付系統(tǒng),大量的下單,可以放入隊(duì)列用于緩沖
注冊(cè)、登錄等待 發(fā)送短信
...
PS:量大可以使用RabbitMQ
3.Redis優(yōu)點(diǎn)
1.基于內(nèi)存,數(shù)據(jù)讀寫(xiě)速度快,性能高
2.支持持久化存儲(chǔ)
3.支持多種數(shù)據(jù)類(lèi)型
4.豐富特性:過(guò)期策略,事務(wù),支持多db
4.數(shù)據(jù)一致性問(wèn)題
這里主要討論下Redis作為緩存時(shí)數(shù)據(jù)一致性問(wèn)題
在數(shù)據(jù)量不大的情況下,一般采用先訪問(wèn)Redis,如果Redis中不存在訪問(wèn)的數(shù)據(jù),則去Db中查詢(xún),把查詢(xún)的結(jié)果緩存到Redis,當(dāng)有新數(shù)據(jù)來(lái)就直接寫(xiě)入Db
如果高并發(fā)的情況下
4.1 先更新Redis,Reids更新成功后,在更新Db
1) Redis寫(xiě)入成功,后續(xù)得Db寫(xiě)入由于某種原因更新失敗,出現(xiàn)數(shù)據(jù)不一致
4.2 更新Db,刪除Redis緩存
1) 當(dāng)高并發(fā)得情況下,很可能在更新Db動(dòng)作沒(méi)完成時(shí)候出現(xiàn)一次新得查詢(xún)請(qǐng)求
解決方案:
讀取數(shù)據(jù)時(shí),如果Redis中數(shù)據(jù)不存在,則去Db查詢(xún),更新緩存,但新得數(shù)據(jù)來(lái)得時(shí)候,我們先更新Db,如果Db數(shù)據(jù)更新成功,此時(shí)則讓Redis緩存失效(或者刪除對(duì)應(yīng)Redis緩存),達(dá)到同步得效果,如果Db更新失敗 則無(wú)需更新Redis。此時(shí)有朋友肯定會(huì)想,如果緩存失效(或者刪除對(duì)應(yīng)Redis緩存)沒(méi)成功怎么辦,這是一個(gè)疑問(wèn),在網(wǎng)上看到有人提出了,重試機(jī)制,誒,這個(gè)很可以,方案中再加入策略