mysql - 請教一個Java做數據庫緩存的問題
問題描述
現在在負責學校的一個圖書館個人寫作平臺,基本的業務模型已經完成了,但是項目在高并發環境下還沒有做任何的優化。
每個學生在閱讀完一本書后都可以寫書評或者做筆記,書評是公開的,筆記是私有的。按照現在的做法每個學生操作都訪問數據庫去查詢,這樣以后肯定會有性能瓶頸。
我大概看了一下ehcache的相關教程但沒有一個好的解決方案,主要是無法判斷緩存是否失效。比如將高頻學生的一定數量筆記都放入到緩存中間去的話,如果設置一個特定的超時時間5min,但是如果剛好在這5min之內又新添加或者修改了一篇筆記的話應該怎么辦么?
比如在mybatis中對應一條sql語句select * from comments condition,我可以通過ehcache建立一個內存緩存,但是如果comments新添加或者更新了一條記錄,怎么能優雅的更新上次在ehcache中添加的緩存。
各位網友是否能夠建議一下相關的解決方案?thanks :-)
問題解答
回答1:既然是緩存,那就一定對數據實效性有容忍度,否則要嚴格實時的數據,就只能訪問數據庫查詢了。
根據題主描述的業務場景來看,普遍的解決方案是通過外置索引來維護圖書和書評的關系(當然索引也不是完全實時的),再通過kv緩存(redis,ehcache,map等等)來緩存書評的具體內容。在數據更新(update)時,通常情況先更新數據庫,然后更新緩存,索引不需要更新。在數據更新(insert)時,需要在update基礎上,再增加相應的關系到索引中。
簡單的外置索引,可以在數據庫中,增加一張(圖書-書評)關系表,建好索引,在查詢書評時先查詢(分頁查詢)關系表,再通過書評主鍵,查詢具體書評信息(緩存加在單條書評信息上),建議分兩次查詢并在內存中組裝數據,不要使用連表查詢(影響數據庫性能)。關系表數據不需要建立緩存,只需要增加書評信息的緩存即可。
相關文章:
1. macos - mac下docker如何設置代理2. dockerfile - 為什么docker容器啟動不了?3. 請教各位大佬,瀏覽器點 提交實例為什么沒有反應4. javascript - 移動端,當出現遮罩層的時候,遮罩層里有div是超出高度scroll的,怎么避免滑動div的時候,body跟隨滑動?5. javascript - 用rem寫的頁面,安卓手機顯示文字是正常的,蘋果顯示的文字是特別小的是為什么呢6. javascript - webapp業務流程基本一致,多套主題(樣式基本不一樣,交互稍有偏差)管理,并且有不斷有新增主題,該如何設計組件化架構?7. javascript - 從mysql獲取json數據,前端怎么處理轉換解析json類型8. apache - 本地搭建wordpress權限問題9. javascript - JS設置Video視頻對象的currentTime時出現了問題,IE,Edge,火狐,都可以設置,反而chrom卻...10. 新手 - Python 爬蟲 問題 求助
