在了解Redis之前,首先給自己提幾個(gè)疑問:我們得知道Redis是用來(lái)做什么的拄查?在什么時(shí)候能使用到菇怀?它得優(yōu)勢(shì)在什么地方?使用它又需要注意什么咽筋?接下來(lái)我們帶著心中得疑問一步一步共同學(xué)習(xí)下溶推。
簡(jiǎn)介
Redis(Remote Dictionary Server ),即遠(yuǎn)程字典服務(wù)奸攻,是一個(gè)開源的使用ANSIC語(yǔ)言編寫蒜危、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型睹耐、Key-Value數(shù)據(jù)庫(kù)辐赞,并提供多種語(yǔ)言的API。從2010年3月15日起硝训,Redis的開發(fā)工作由VMware主持响委。從2013年5月開始,Redis的開發(fā)由Pivotal贊助窖梁。
Redis數(shù)據(jù)類型
String(字符串):Redis最基本的數(shù)據(jù)類型赘风,一個(gè)鍵對(duì)應(yīng)一個(gè)值,一個(gè)鍵值最大存儲(chǔ)512MB
Hash(哈希):hash是一個(gè)鍵值對(duì)的集合窄绒,是一個(gè)String類型的field和value的映射表贝次,適合用于存儲(chǔ)對(duì)象
?List(列表):是redis的簡(jiǎn)單的字符串列表,按插入順序排序
?Set(集合):是String字符串類型的無(wú)序集合彰导,也不可重復(fù)
?ZSet(sorted? set? 有序集合)是String類型的有序集合蛔翅,也不可重復(fù)。有序集合中的每個(gè)元素都需要指定一個(gè)分?jǐn)?shù)位谋,根據(jù)分?jǐn)?shù)對(duì)元素進(jìn)行升序排序山析。
1.Redis是用來(lái)做什么的
緩存,內(nèi)存作為數(shù)據(jù)存儲(chǔ)介質(zhì)掏父,讀寫數(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緩存
頻繁訪問且變動(dòng)較小的數(shù)據(jù)可以放入Redis緩存洁灵,減少db的io
分布式中可以用來(lái)緩存會(huì)話
排行版
購(gòu)物車
...
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ù)讀寫速度快闲礼,性能高
2.支持持久化存儲(chǔ)
3.支持多種數(shù)據(jù)類型
4.豐富特性:過(guò)期策略牍汹,事務(wù),支持多db
4.數(shù)據(jù)一致性問題
這里主要討論下Redis作為緩存時(shí)數(shù)據(jù)一致性問題
在數(shù)據(jù)量不大的情況下位仁,一般采用先訪問Redis柑贞,如果Redis中不存在訪問的數(shù)據(jù),則去Db中查詢聂抢,把查詢的結(jié)果緩存到Redis,當(dāng)有新數(shù)據(jù)來(lái)就直接寫入Db
如果高并發(fā)的情況下
4.1 先更新Redis棠众,Reids更新成功后琳疏,在更新Db
1) Redis寫入成功,后續(xù)得Db寫入由于某種原因更新失敗闸拿,出現(xiàn)數(shù)據(jù)不一致
4.2 更新Db空盼,刪除Redis緩存
1) 當(dāng)高并發(fā)得情況下,很可能在更新Db動(dòng)作沒完成時(shí)候出現(xiàn)一次新得查詢請(qǐng)求
解決方案:
讀取數(shù)據(jù)時(shí)新荤,如果Redis中數(shù)據(jù)不存在揽趾,則去Db查詢,更新緩存苛骨,但新得數(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緩存)沒成功怎么辦,這是一個(gè)疑問,在網(wǎng)上看到有人提出了粱挡,重試機(jī)制赠幕,誒,這個(gè)很可以询筏,方案中再加入策略