mysql - 請教一個Java做數據庫緩存的問題
問題描述
現在在負責學校的一個圖書館個人寫作平臺,基本的業務模型已經完成了,但是項目在高并發環境下還沒有做任何的優化。
每個學生在閱讀完一本書后都可以寫書評或者做筆記,書評是公開的,筆記是私有的。按照現在的做法每個學生操作都訪問數據庫去查詢,這樣以后肯定會有性能瓶頸。
我大概看了一下ehcache的相關教程但沒有一個好的解決方案,主要是無法判斷緩存是否失效。比如將高頻學生的一定數量筆記都放入到緩存中間去的話,如果設置一個特定的超時時間5min,但是如果剛好在這5min之內又新添加或者修改了一篇筆記的話應該怎么辦么?
比如在mybatis中對應一條sql語句select * from comments condition,我可以通過ehcache建立一個內存緩存,但是如果comments新添加或者更新了一條記錄,怎么能優雅的更新上次在ehcache中添加的緩存。
各位網友是否能夠建議一下相關的解決方案?thanks :-)
問題解答
回答1:既然是緩存,那就一定對數據實效性有容忍度,否則要嚴格實時的數據,就只能訪問數據庫查詢了。
根據題主描述的業務場景來看,普遍的解決方案是通過外置索引來維護圖書和書評的關系(當然索引也不是完全實時的),再通過kv緩存(redis,ehcache,map等等)來緩存書評的具體內容。在數據更新(update)時,通常情況先更新數據庫,然后更新緩存,索引不需要更新。在數據更新(insert)時,需要在update基礎上,再增加相應的關系到索引中。
簡單的外置索引,可以在數據庫中,增加一張(圖書-書評)關系表,建好索引,在查詢書評時先查詢(分頁查詢)關系表,再通過書評主鍵,查詢具體書評信息(緩存加在單條書評信息上),建議分兩次查詢并在內存中組裝數據,不要使用連表查詢(影響數據庫性能)。關系表數據不需要建立緩存,只需要增加書評信息的緩存即可。
相關文章:
1. 微信開放平臺 - Android調用微信分享不顯示2. javascript - ie11以下單擊打開不了file,雙擊可以。求解?3. javascript - js 有什么優雅的辦法實現在同時打開的兩個標簽頁間相互通信?4. javascript - 關于定時器 與 防止連續點擊 問題5. objective-c - ios百度地圖定位問題6. javascript - 求助這種功能有什么好點的插件?7. javascript - node.js服務端渲染解疑8. html5 - rudy編譯sass的時候有中文報錯9. 為何 localStorage、sessionStorage 屬于html5的范疇,但是為何 IE8卻支持?10. javascript - 求助關于js正則問題
