現(xiàn)在在負(fù)責(zé)學(xué)校的一個(gè)圖書(shū)館個(gè)人寫(xiě)作平臺(tái),基本的商業(yè)模式已經(jīng)完成了,但是專案在高並發(fā)環(huán)境下還沒(méi)有做任何的最佳化。
每個(gè)學(xué)生在閱讀完一本書(shū)後都可以寫(xiě)書(shū)評(píng)或做筆記,書(shū)評(píng)是公開(kāi)的,筆記是私有的。依照現(xiàn)在的做法每個(gè)學(xué)生操作都存取資料庫(kù)去查詢,這樣以後一定會(huì)有效能瓶頸。
我大概看了一下ehcache的相關(guān)教學(xué)但沒(méi)有一個(gè)好的解決方案,主要是無(wú)法判斷快取是否失效。例如將高頻學(xué)生的一定數(shù)量筆記都放入到快取中間去的話,如果設(shè)定一個(gè)特定的超時(shí)時(shí)間5min,但是如果剛好在這5min之內(nèi)又新添加或者修改了一篇筆記的話該怎麼辦麼?
例如在mybatis中對(duì)應(yīng)一條sql語(yǔ)句select * from comments condition
,我可以透過(guò)ehcache建立一個(gè)記憶體緩存,但是如果comments
新加入或更新了一則記錄,怎麼能優(yōu)雅的更新上次在ehcache中加入的快取。
各位網(wǎng)友是否能夠建議一下相關(guān)的解決方案? thanks :-)
既然是緩存,那就一定對(duì)數(shù)據(jù)實(shí)效性有容忍度,否則要嚴(yán)格即時(shí)的數(shù)據(jù),就只能存取資料庫(kù)查詢了。
根據(jù)題主描述的業(yè)務(wù)場(chǎng)景來(lái)看,普遍的解決方案是透過(guò)外置索引來(lái)維護(hù)圖書(shū)和書(shū)評(píng)的關(guān)係(當(dāng)然索引也不是完全實(shí)時(shí)的),再透過(guò)kv快取(redis,ehcache,map等等)來(lái)快取書(shū)評(píng)的具體內(nèi)容。
在資料更新(update)時(shí),通常情況先更新資料庫(kù),然後更新緩存,索引不需要更新。
在資料更新(insert)時(shí),需要在update基礎(chǔ)上,再增加對(duì)應(yīng)的關(guān)係到索引中。
簡(jiǎn)單的外置索引,可以在資料庫(kù)中,增加一張(圖書(shū)-書(shū)評(píng))關(guān)係表,建好索引,在查詢書(shū)評(píng)時(shí)先查詢(分頁(yè)查詢)關(guān)係表,再透過(guò)書(shū)評(píng)主鍵,查詢具體書(shū)評(píng)資訊(快取加在單一書(shū)評(píng)資訊上),建議分兩次查詢並在記憶體中組裝數(shù)據(jù),不要使用連表查詢(影響資料庫(kù)效能)。關(guān)係表資料不需要建立緩存,只需要增加書(shū)評(píng)資訊的快取即可。