一.緩存
熱點(diǎn)數(shù)據(jù)(經(jīng)常會(huì)被查詢,但是不經(jīng)常被修改或者刪除的數(shù)據(jù)),首選是使用redis緩存.
熱點(diǎn)數(shù)據(jù)如果沒次都需要查詢一次數(shù)據(jù)庫, 當(dāng)訪問量比較大會(huì)對(duì)數(shù)據(jù)庫造成具大壓力,故經(jīng)常被訪問的數(shù)據(jù)可以查詢一次存放入緩存, 每次查詢時(shí)先查詢緩存,如果緩存中存在直接返回.減輕數(shù)據(jù)庫壓力
注意事項(xiàng): 結(jié)合具體應(yīng)用需要注意一下:
Select 數(shù)據(jù)庫前查詢r(jià)edis,有的話使用redis數(shù)據(jù),放棄select 數(shù)據(jù)庫,沒有的話,select 數(shù)據(jù)庫,然后將數(shù)據(jù)插入redis
update或者delete數(shù)據(jù)庫錢,查詢r(jià)edis是否存在該數(shù)據(jù),存在的話先刪除redis中數(shù)據(jù),然后再update或者delete數(shù)據(jù)庫中的數(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。
建議: 對(duì)Redis的數(shù)據(jù)進(jìn)行在進(jìn)行更新時(shí), 更新前與更新后都執(zhí)行一次刪除操作
二. 計(jì)數(shù)器
利用Redis是原子性操作, 可實(shí)現(xiàn)多服務(wù)共享某一個(gè)數(shù)據(jù).
例如: 分布式ID生成、點(diǎn)贊、閱讀量統(tǒng)計(jì)等場(chǎng)景
三.分布式鎖
在分布式架構(gòu)中, 一個(gè)業(yè)務(wù)ID請(qǐng)求進(jìn)入服務(wù),我們只需要其中一個(gè)服務(wù)為期服務(wù)時(shí), 或者秒殺系統(tǒng),只需要一個(gè)ID能夠獲取的商品時(shí). 這個(gè)時(shí)候可以采用Redis做到僅切只有一個(gè)人獲得服務(wù)權(quán).
String 類型setnx方法,只有不存在時(shí)才能添加成功,返回true(搶到鎖)
四.限流
當(dāng)一個(gè)用戶大量訪問頁面時(shí)候,需要控制訪問次數(shù)時(shí).
以訪問者的ip和其他信息作為key,訪問一次增加一次計(jì)數(shù),超過次數(shù)則返回false
五.分布式跨域session共享
集群模式下,在應(yīng)用不多的情況下一般使用容器自帶的session復(fù)制功能就能滿足,當(dāng)應(yīng)用增多相對(duì)復(fù)雜的系統(tǒng)中,一般都會(huì)搭建以Redis等內(nèi)存數(shù)據(jù)庫為中心的session服務(wù),session不再由容器管理,而是由session服務(wù)及內(nèi)存數(shù)據(jù)庫管理。
六.最新列表
Redis列表結(jié)構(gòu),LPUSH可以在列表頭部插入一個(gè)內(nèi)容ID作為關(guān)鍵字,LTRIM可用來限制列表的數(shù)量,這樣列表永遠(yuǎn)為N個(gè)ID,無需查詢最新的列表,直接根據(jù)ID去到對(duì)應(yīng)的內(nèi)容頁即可。
以上是個(gè)人理解常用的場(chǎng)景, 當(dāng)然Redis還可以做的事情特別多, 在這里就不一一列舉了.