mysql - 請教一個Java做數據庫緩存的問題
問題描述
現在在負責學校的一個圖書館個人寫作平臺,基本的業務模型已經完成了,但是項目在高并發環境下還沒有做任何的優化。
每個學生在閱讀完一本書后都可以寫書評或者做筆記,書評是公開的,筆記是私有的。按照現在的做法每個學生操作都訪問數據庫去查詢,這樣以后肯定會有性能瓶頸。
我大概看了一下ehcache的相關教程但沒有一個好的解決方案,主要是無法判斷緩存是否失效。比如將高頻學生的一定數量筆記都放入到緩存中間去的話,如果設置一個特定的超時時間5min,但是如果剛好在這5min之內又新添加或者修改了一篇筆記的話應該怎么辦么?
比如在mybatis中對應一條sql語句select * from comments condition,我可以通過ehcache建立一個內存緩存,但是如果comments新添加或者更新了一條記錄,怎么能優雅的更新上次在ehcache中添加的緩存。
各位網友是否能夠建議一下相關的解決方案?thanks :-)
問題解答
回答1:既然是緩存,那就一定對數據實效性有容忍度,否則要嚴格實時的數據,就只能訪問數據庫查詢了。
根據題主描述的業務場景來看,普遍的解決方案是通過外置索引來維護圖書和書評的關系(當然索引也不是完全實時的),再通過kv緩存(redis,ehcache,map等等)來緩存書評的具體內容。在數據更新(update)時,通常情況先更新數據庫,然后更新緩存,索引不需要更新。在數據更新(insert)時,需要在update基礎上,再增加相應的關系到索引中。
簡單的外置索引,可以在數據庫中,增加一張(圖書-書評)關系表,建好索引,在查詢書評時先查詢(分頁查詢)關系表,再通過書評主鍵,查詢具體書評信息(緩存加在單條書評信息上),建議分兩次查詢并在內存中組裝數據,不要使用連表查詢(影響數據庫性能)。關系表數據不需要建立緩存,只需要增加書評信息的緩存即可。
相關文章:
1. 編輯成功不顯示彈窗2. 哭遼 求大佬解答 控制器的join方法怎么轉模型方法3. Navicat for mysql 中以json格式儲存的數據存在大量反斜杠,如何去除?4. mysql - 數據庫表中,兩個表互為外鍵參考如何解決5. mysql儲存json錯誤6. mysql - 怎么生成這個sql表?7. mysql - 表名稱前綴到底有啥用?8. sql語句 - 如何在mysql中批量添加用戶?9. 在mybatis使用mysql的ON DUPLICATE KEY UPDATE語法實現存在即更新應該使用哪個標簽?10. 怎么php怎么通過數組顯示sql查詢結果呢,查詢結果有多條,如圖。
