使用場(chǎng)景一:高頻率使用但不頻繁更新的業(yè)務(wù)數(shù)據(jù)。由于不頻繁更新,所以可以在系統(tǒng)啟動(dòng)時(shí),從數(shù)據(jù)庫(kù)中加載,放入redis。如果更新,需重啟服務(wù),當(dāng)然這比較笨。更好的做法下面會(huì)列出。
使用場(chǎng)景二:高頻率使用更新還算頻繁的業(yè)務(wù)數(shù)據(jù)。由于有一定頻率的更新,所以可以在用戶訪問(wèn)時(shí),查詢緩存,如果沒(méi)有值,則從數(shù)據(jù)庫(kù)中加載入redis,并設(shè)置過(guò)期時(shí)間。這樣,過(guò)期時(shí)間內(nèi)的訪問(wèn)就都走緩存了。這種策略也有問(wèn)題,就是大并發(fā)訪問(wèn)時(shí),容易造成數(shù)據(jù)庫(kù)瞬間高并發(fā)讀,如果程序再寫(xiě)的爛點(diǎn),查詢語(yǔ)句再?gòu)?fù)雜點(diǎn),那可能造成數(shù)據(jù)庫(kù)死鎖。更好的辦法,下面列出。
使用場(chǎng)景三:高頻率使用高頻率更新的業(yè)務(wù)數(shù)據(jù)。這種數(shù)據(jù)就需要在寫(xiě)入數(shù)據(jù)庫(kù)的同時(shí)放入緩存,不設(shè)置過(guò)期時(shí)間,這樣用戶每次訪問(wèn)都走緩存。為了保證數(shù)據(jù)的一致,還有數(shù)據(jù)對(duì)內(nèi)存的占用,還需要有一些額外的策略。
對(duì)于場(chǎng)景一:更好的做法是在系統(tǒng)啟動(dòng)的同時(shí),利用redis的pub/sub功能,啟動(dòng)一個(gè)監(jiān)聽(tīng)通道。當(dāng)數(shù)據(jù)發(fā)生更新時(shí),往通道publish一個(gè)消息,系統(tǒng)接收到消息后,重新從數(shù)據(jù)庫(kù)中加載數(shù)據(jù),放入緩存。這樣系統(tǒng)實(shí)現(xiàn)了無(wú)中斷的更新緩存。
對(duì)于場(chǎng)景二:更好的做法是單獨(dú)啟動(dòng)一個(gè)定時(shí)任務(wù),把定時(shí)任務(wù)看做是一個(gè)用戶,他每隔一段時(shí)間從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù),然后放入緩存。而前臺(tái)用戶訪問(wèn)的始終是緩存數(shù)據(jù),不會(huì)觸發(fā)數(shù)據(jù)庫(kù)的相關(guān)操作。這個(gè)策略也可以用在場(chǎng)景一中。
當(dāng)然,使用memcached也可以實(shí)現(xiàn)類似的功能,但是我更喜歡用redis,基于他強(qiáng)大的性能和數(shù)據(jù)結(jié)構(gòu),可以實(shí)現(xiàn)多種復(fù)雜的業(yè)務(wù)需求。