redis使用場(chǎng)景有哪些

redis使用場(chǎng)景有哪些

一:緩存——熱數(shù)據(jù)

熱點(diǎn)數(shù)據(jù)(經(jīng)常會(huì)被查詢,但是不經(jīng)常被修改或者刪除的數(shù)據(jù)),首選是使用redis緩存,畢竟強(qiáng)大到冒泡的QPS和極強(qiáng)的穩(wěn)定性不是所有類似工具都有的,而且相比于memcached還提供了豐富的數(shù)據(jù)類型可以使用,另外,內(nèi)存中的數(shù)據(jù)也提供了AOF和RDB等持久化機(jī)制可以選擇,要冷、熱的還是忽冷忽熱的都可選。

結(jié)合具體應(yīng)用需要注意一下:很多人用spring的AOP來(lái)構(gòu)建redis緩存的自動(dòng)生產(chǎn)和清除,過(guò)程可能如下:

select?數(shù)據(jù)庫(kù)前查詢r(jià)edis,有的話使用redis數(shù)據(jù),放棄select 數(shù)據(jù)庫(kù),沒(méi)有的話,select 數(shù)據(jù)庫(kù),然后將數(shù)據(jù)插入redis

update或者delete數(shù)據(jù)庫(kù)錢,查詢r(jià)edis是否存在該數(shù)據(jù),存在的話先刪除redis中數(shù)據(jù),然后再update或者delete數(shù)據(jù)庫(kù)中的數(shù)據(jù)

上面這種操作,如果并發(fā)量很小的情況下基本沒(méi)問(wèn)題,但是高并發(fā)的情況請(qǐng)注意下面場(chǎng)景:

為了update先刪掉了redis中的該數(shù)據(jù),這時(shí)候另一個(gè)線程執(zhí)行查詢,發(fā)現(xiàn)redis中沒(méi)有,瞬間執(zhí)行了查詢sql,并且插入到redis中一條數(shù)據(jù),回到剛才那個(gè)update語(yǔ)句,這個(gè)悲催的線程壓根不知道剛才那個(gè)該死的select線程犯了一個(gè)彌天大錯(cuò)!于是這個(gè)redis中的錯(cuò)誤數(shù)據(jù)就永遠(yuǎn)的存在了下去,直到下一個(gè)update或者delete。

二:計(jì)數(shù)器

諸如統(tǒng)計(jì)點(diǎn)擊數(shù)等應(yīng)用。由于單線程,可以避免并發(fā)問(wèn)題,保證不會(huì)出錯(cuò),而且100%毫秒級(jí)性能!爽。

命令:INCRBY

當(dāng)然爽完了,別忘記持久化,畢竟是redis只是存了內(nèi)存!

三:隊(duì)列

相當(dāng)于消息系統(tǒng),activemqrocketmq等工具類似,但是個(gè)人覺(jué)得簡(jiǎn)單用一下還行,如果對(duì)于數(shù)據(jù)一致性要求高的話還是用RocketMQ等專業(yè)系統(tǒng)。

由于redis把數(shù)據(jù)添加到隊(duì)列是返回添加元素在隊(duì)列的第幾位,所以可以做判斷用戶是第幾個(gè)訪問(wèn)這種業(yè)務(wù)

隊(duì)列不僅可以把并發(fā)請(qǐng)求變成串行,并且還可以做隊(duì)列或者使用

四:位操作(大數(shù)據(jù)處理)

用于數(shù)據(jù)量上億的場(chǎng)景下,例如幾億用戶系統(tǒng)的簽到,去重登錄次數(shù)統(tǒng)計(jì),某用戶是否在線狀態(tài)等等。

想想一下騰訊10億用戶,要幾個(gè)毫秒內(nèi)查詢到某個(gè)用戶是否在線,你能怎么做?千萬(wàn)別說(shuō)給每個(gè)用戶建立一個(gè)key,然后挨個(gè)記(你可以算一下需要的內(nèi)存會(huì)很恐怖,而且這種類似的需求很多,騰訊光這個(gè)得多花多少錢。。)好吧。這里要用到位操作——使用setbit、getbit、bitcount命令。

原理是:

redis內(nèi)構(gòu)建一個(gè)足夠長(zhǎng)的數(shù)組,每個(gè)數(shù)組元素只能是0和1兩個(gè)值,然后這個(gè)數(shù)組的下標(biāo)index用來(lái)表示我們上面例子里面的用戶id(必須是數(shù)字哈),那么很顯然,這個(gè)幾億長(zhǎng)的大數(shù)組就能通過(guò)下標(biāo)和元素值(0和1)來(lái)構(gòu)建一個(gè)記憶系統(tǒng),上面我說(shuō)的幾個(gè)場(chǎng)景也就能夠?qū)崿F(xiàn)。用到的命令是:setbit、getbit、bitcount

五:分布式鎖與單線程機(jī)制

驗(yàn)證前端的重復(fù)請(qǐng)求(可以自由擴(kuò)展類似情況),可以通過(guò)redis進(jìn)行過(guò)濾:每次請(qǐng)求將request Ip、參數(shù)、接口等hash作為key存儲(chǔ)redis(冪等性請(qǐng)求),設(shè)置多長(zhǎng)時(shí)間有效期,然后下次請(qǐng)求過(guò)來(lái)的時(shí)候先在redis中檢索有沒(méi)有這個(gè)key,進(jìn)而驗(yàn)證是不是一定時(shí)間內(nèi)過(guò)來(lái)的重復(fù)提交

秒殺系統(tǒng),基于redis是單線程特征,防止出現(xiàn)數(shù)據(jù)庫(kù)“爆破”

全局增量ID生成,類似“秒殺”

六:最新列表

例如新聞列表頁(yè)面最新的新聞列表,如果總數(shù)量很大的情況下,盡量不要使用select a from A limit 10這種low貨,嘗試redis的 LPUSH命令構(gòu)建List,一個(gè)個(gè)順序都塞進(jìn)去就可以啦。不過(guò)萬(wàn)一內(nèi)存清掉了咋辦?也簡(jiǎn)單,查詢不到存儲(chǔ)key的話,用mysql查詢并且初始化一個(gè)List到redis中就好了。

以上就是redis使用場(chǎng)景介紹的全部?jī)?nèi)容。

相關(guān)參考:Redis教程

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊5 分享