掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
Redis 是C語(yǔ)言開發(fā)的一個(gè)開源高性能鍵值對(duì)的內(nèi)存數(shù)據(jù)庫(kù),可以用來(lái)做數(shù)據(jù)庫(kù)、緩存、消息中間件等場(chǎng)景,是一種NoSQL(not-only sql,非關(guān)系型數(shù)據(jù)庫(kù))的數(shù)據(jù)庫(kù)。

在潞城等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營(yíng)銷推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,潞城網(wǎng)站建設(shè)費(fèi)用合理。
下表是我列舉的五種數(shù)據(jù)類型的特性及其使用場(chǎng)景
數(shù)據(jù)緩存是Redis最重要的一個(gè)場(chǎng)景,為緩存而生,在springboot中,一般有兩種使用方式:
在分布式環(huán)境下,緩存和數(shù)據(jù)庫(kù)很容易出現(xiàn)數(shù)據(jù)一致性問題,如果項(xiàng)目對(duì)緩存的要求是強(qiáng)一致性,那就不要使用緩存。
我們只能在項(xiàng)目中使用策略降低緩存與數(shù)據(jù)庫(kù)一致性的概率,是無(wú)法保障兩者的強(qiáng)一致性,一般策略包括緩存更新機(jī)制,更新數(shù)據(jù)庫(kù)后及時(shí)更新緩存、緩存失敗時(shí)增加重試機(jī)制。
在了解雪崩潰之前,我們先了解什么是緩存雪崩現(xiàn)象,假設(shè)A系統(tǒng)每秒需要處理5000個(gè)請(qǐng)求,但數(shù)據(jù)庫(kù)每秒只能處理4000個(gè)請(qǐng)求,某一天,緩存機(jī)器出現(xiàn)了宕機(jī),掛了,這時(shí)候所有的請(qǐng)求一下子全部落在數(shù)據(jù)庫(kù)上,數(shù)據(jù)庫(kù)肯定扛不住,報(bào)警掛掉了,這時(shí)候如果沒有采取緩存設(shè)施,數(shù)據(jù)庫(kù)又急著用,重新重啟數(shù)據(jù)庫(kù),剛重啟完成(有可能沒啟動(dòng)完),請(qǐng)求又來(lái),數(shù)據(jù)庫(kù)立馬掛掉。這就是雪崩事件,是Redis緩存中最致命問題之一(有一個(gè)是穿透)。大家可以看看下圖 :
出現(xiàn)雪崩事件后不要急不要慌,我們可以在事故前中后三個(gè)方面來(lái)思考解決方案
我們來(lái)看看改造后的數(shù)據(jù)流程,假設(shè)用戶A發(fā)送一個(gè)請(qǐng)求,系統(tǒng)先請(qǐng)求本地Ehcache是否有數(shù)據(jù),如果沒有再去Redis請(qǐng)求數(shù)據(jù),如果沒有再去數(shù)據(jù)庫(kù)請(qǐng)求數(shù)據(jù),獲取到數(shù)據(jù)后同步到Ehcache和redis
限流組件的作用:可以設(shè)置每秒請(qǐng)求數(shù)次,有多少通過請(qǐng)求,剩余的未通過的可以走降級(jí)處理,返回一些默認(rèn)的值,或者友情提示等默認(rèn)操作。具體流程可以看看下圖:
這樣做的好處是:
緩存穿透是指緩存和數(shù)據(jù)庫(kù)中都沒有的數(shù)據(jù),用戶(黑客)不斷發(fā)起請(qǐng)求,導(dǎo)致請(qǐng)求直接查詢數(shù)據(jù)庫(kù),這種惡意行為攻擊場(chǎng)景的會(huì)直接導(dǎo)致數(shù)據(jù)庫(kù)掛掉,數(shù)據(jù)流程如下圖所示
處理這種情況相對(duì)比較簡(jiǎn)單點(diǎn),這種情況是繞過redis或本地緩存直接到達(dá)數(shù)據(jù)庫(kù),可以采取以下方案:
上面講的穿透是針對(duì)大面積數(shù)據(jù)請(qǐng)求,那么擊穿是針對(duì)一點(diǎn)(一個(gè)key)來(lái)來(lái)導(dǎo)致redis異常,但某個(gè)key是非常熱點(diǎn),請(qǐng)求非常頻繁,處于集中式訪問現(xiàn)象,當(dāng)這個(gè)key失效(過期)時(shí),大量的請(qǐng)求就會(huì)擊穿了緩存,直接請(qǐng)求數(shù)據(jù)庫(kù),就像在屏障中鑿開了一個(gè)洞。
不同場(chǎng)景下緩存擊穿解決方案
數(shù)據(jù)基本不變:熱點(diǎn)數(shù)據(jù)value基本不更新時(shí),可以設(shè)置成永不過期
數(shù)據(jù)更新不頻繁:緩存刷新流程耗時(shí)較少時(shí),可采用redis、zookeeper等分布式中間件的分布式互斥鎖或者本地互斥鎖保證少量的請(qǐng)求能請(qǐng)求到數(shù)據(jù)庫(kù)并重新更新緩存,其他的流程等鎖釋放后才可以訪問新緩存
數(shù)據(jù)更新頻繁:采用定時(shí)線程,在緩存過期前主動(dòng)重新構(gòu)建緩存或延長(zhǎng)過期時(shí)間,保證所有的請(qǐng)求能一直訪問緩存
Redis官方介紹可以達(dá)到10W+的QPS,這個(gè)數(shù)據(jù)不比MEMCache差,而且Redis 是單進(jìn)程單線程的模型,完全基于內(nèi)存的操作,CPU不是Redis的瓶頸,Redis的瓶頸是內(nèi)存及網(wǎng)絡(luò)帶寬,有以下特點(diǎn):
Redis 持久化策略有兩種:
如果非常關(guān)心你的數(shù)據(jù),但仍然可以承受數(shù)分鐘內(nèi)的數(shù)據(jù)丟失,那么可以額只使用 RDB 持久。
AOF 將 Redis 執(zhí)行的每一條命令追加到磁盤中,處理巨大的寫入會(huì)降低Redis的性能,不知道你是否可以接受。
數(shù)據(jù)庫(kù)備份和災(zāi)難恢復(fù):定時(shí)生成 RDB 快照非常便于進(jìn)行數(shù)據(jù)庫(kù)備份,并且 RDB 恢復(fù)數(shù)據(jù)集的速度也要比 AOF 恢復(fù)的速度快。
當(dāng)然了,Redis 支持同時(shí)開啟 RDB 和 AOF,系統(tǒng)重啟后,Redis 會(huì)優(yōu)先使用 AOF 來(lái)恢復(fù)數(shù)據(jù),這樣丟失的數(shù)據(jù)會(huì)最少。
我們先說(shuō)說(shuō)主從復(fù)制會(huì)存在問題:
哨兵的架構(gòu)模式如下:
該系統(tǒng)可以執(zhí)行以下四個(gè)任務(wù):

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流