一:緩存——熱數(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來構(gòu)建redis緩存的自動(dòng)生產(chǎn)和清除邮屁,過程可能如下:
Select 數(shù)據(jù)庫(kù)前查詢r(jià)edis整袁,有的話使用redis數(shù)據(jù),放棄select 數(shù)據(jù)庫(kù)佑吝,沒有的話坐昙,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ā)量很小的情況下基本沒問題嚷量,但是高并發(fā)的情況請(qǐng)注意下面場(chǎng)景:
為了update先刪掉了redis中的該數(shù)據(jù),這時(shí)候另一個(gè)線程執(zhí)行查詢逆趣,發(fā)現(xiàn)redis中沒有蝶溶,瞬間執(zhí)行了查詢SQL,并且插入到redis中一條數(shù)據(jù),回到剛才那個(gè)update語句抖所,這個(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ā)問題傻粘,保證不會(huì)出錯(cuò)每窖,而且100%毫秒級(jí)性能!爽弦悉。
命令:INCRBY
當(dāng)然爽完了窒典,別忘記持久化,畢竟是redis只是存了內(nèi)存稽莉!
三:隊(duì)列
相當(dāng)于消息系統(tǒng)瀑志,ActiveMQ,RocketMQ等工具類似污秆,但是個(gè)人覺得簡(jiǎn)單用一下還行劈猪,如果對(duì)于數(shù)據(jù)一致性要求高的話還是用RocketMQ等專業(yè)系統(tǒng)。
由于redis把數(shù)據(jù)添加到隊(duì)列是返回添加元素在隊(duì)列的第幾位混狠,所以可以做判斷用戶是第幾個(gè)訪問這種業(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è)用戶是否在線,你能怎么做湖饱?千萬別說給每個(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用來表示我們上面例子里面的用戶id(必須是數(shù)字哈),那么很顯然夏醉,這個(gè)幾億長(zhǎng)的大數(shù)組就能通過下標(biāo)和元素值(0和1)來構(gòu)建一個(gè)記憶系統(tǒng)爽锥,上面我說的幾個(gè)場(chǎng)景也就能夠?qū)崿F(xiàn)。用到的命令是:setbit畔柔、getbit氯夷、bitcount
五:分布式鎖與單線程機(jī)制
驗(yàn)證前端的重復(fù)請(qǐng)求(可以自由擴(kuò)展類似情況),可以通過redis進(jìn)行過濾:每次請(qǐng)求將request Ip靶擦、參數(shù)腮考、接口等hash作為key存儲(chǔ)redis(冪等性請(qǐng)求),設(shè)置多長(zhǎng)時(shí)間有效期奢啥,然后下次請(qǐng)求過來的時(shí)候先在redis中檢索有沒有這個(gè)key秸仙,進(jìn)而驗(yàn)證是不是一定時(shí)間內(nè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)去就可以啦柬姚。不過萬一內(nèi)存清掉了咋辦拟杉?也簡(jiǎn)單,查詢不到存儲(chǔ)key的話量承,用mysql查詢并且初始化一個(gè)List到redis中就好了搬设。