Redis基本知識(shí)及數(shù)據(jù)一致性問(wèn)題

在了解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è)很可以,方案中再加入策略

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容