mysql - 請(qǐng)教一個(gè)Java做數(shù)據(jù)庫(kù)緩存的問題
問題描述
現(xiàn)在在負(fù)責(zé)學(xué)校的一個(gè)圖書館個(gè)人寫作平臺(tái),基本的業(yè)務(wù)模型已經(jīng)完成了,但是項(xiàng)目在高并發(fā)環(huán)境下還沒有做任何的優(yōu)化。
每個(gè)學(xué)生在閱讀完一本書后都可以寫書評(píng)或者做筆記,書評(píng)是公開的,筆記是私有的。按照現(xiàn)在的做法每個(gè)學(xué)生操作都訪問數(shù)據(jù)庫(kù)去查詢,這樣以后肯定會(huì)有性能瓶頸。
我大概看了一下ehcache的相關(guān)教程但沒有一個(gè)好的解決方案,主要是無法判斷緩存是否失效。比如將高頻學(xué)生的一定數(shù)量筆記都放入到緩存中間去的話,如果設(shè)置一個(gè)特定的超時(shí)時(shí)間5min,但是如果剛好在這5min之內(nèi)又新添加或者修改了一篇筆記的話應(yīng)該怎么辦么?
比如在mybatis中對(duì)應(yīng)一條sql語(yǔ)句select * from comments condition,我可以通過ehcache建立一個(gè)內(nèi)存緩存,但是如果comments新添加或者更新了一條記錄,怎么能優(yōu)雅的更新上次在ehcache中添加的緩存。
各位網(wǎng)友是否能夠建議一下相關(guān)的解決方案?thanks :-)
問題解答
回答1:既然是緩存,那就一定對(duì)數(shù)據(jù)實(shí)效性有容忍度,否則要嚴(yán)格實(shí)時(shí)的數(shù)據(jù),就只能訪問數(shù)據(jù)庫(kù)查詢了。
根據(jù)題主描述的業(yè)務(wù)場(chǎng)景來看,普遍的解決方案是通過外置索引來維護(hù)圖書和書評(píng)的關(guān)系(當(dāng)然索引也不是完全實(shí)時(shí)的),再通過kv緩存(redis,ehcache,map等等)來緩存書評(píng)的具體內(nèi)容。在數(shù)據(jù)更新(update)時(shí),通常情況先更新數(shù)據(jù)庫(kù),然后更新緩存,索引不需要更新。在數(shù)據(jù)更新(insert)時(shí),需要在update基礎(chǔ)上,再增加相應(yīng)的關(guān)系到索引中。
簡(jiǎn)單的外置索引,可以在數(shù)據(jù)庫(kù)中,增加一張(圖書-書評(píng))關(guān)系表,建好索引,在查詢書評(píng)時(shí)先查詢(分頁(yè)查詢)關(guān)系表,再通過書評(píng)主鍵,查詢具體書評(píng)信息(緩存加在單條書評(píng)信息上),建議分兩次查詢并在內(nèi)存中組裝數(shù)據(jù),不要使用連表查詢(影響數(shù)據(jù)庫(kù)性能)。關(guān)系表數(shù)據(jù)不需要建立緩存,只需要增加書評(píng)信息的緩存即可。
相關(guān)文章:
1. 點(diǎn)擊頁(yè)面就自動(dòng)輸入到mysql.求解2. java - IDEA從SVN檢出項(xiàng)目 并在tomcat上運(yùn)行 求詳細(xì)流程3. javascript - windos下第一次用Django無法正確創(chuàng)建工程目錄4. java - 多叉樹求值,程序高手,算法高手看過來5. node.js - 帶有node_modules目錄的項(xiàng)目,用phpstorm打開速度極慢,怎么解決?6. node.js - nodejs使用formidable上傳文件問題7. 誰(shuí)能告訴我php7+tp5.1時(shí)遇到使用session::set()問題8. 有么有大神解釋下這是什么意思?通過這可以知道網(wǎng)站的每天的訪問量?9. 為什么我的switch自動(dòng)輸出了第一個(gè)case?10. 單擊登錄按鈕無反應(yīng)
