mysql - 請教一個Java做數據庫緩存的問題
問題描述
現在在負責學校的一個圖書館個人寫作平臺,基本的業務模型已經完成了,但是項目在高并發環境下還沒有做任何的優化。
每個學生在閱讀完一本書后都可以寫書評或者做筆記,書評是公開的,筆記是私有的。按照現在的做法每個學生操作都訪問數據庫去查詢,這樣以后肯定會有性能瓶頸。
我大概看了一下ehcache的相關教程但沒有一個好的解決方案,主要是無法判斷緩存是否失效。比如將高頻學生的一定數量筆記都放入到緩存中間去的話,如果設置一個特定的超時時間5min,但是如果剛好在這5min之內又新添加或者修改了一篇筆記的話應該怎么辦么?
比如在mybatis中對應一條sql語句select * from comments condition,我可以通過ehcache建立一個內存緩存,但是如果comments新添加或者更新了一條記錄,怎么能優雅的更新上次在ehcache中添加的緩存。
各位網友是否能夠建議一下相關的解決方案?thanks :-)
問題解答
回答1:既然是緩存,那就一定對數據實效性有容忍度,否則要嚴格實時的數據,就只能訪問數據庫查詢了。
根據題主描述的業務場景來看,普遍的解決方案是通過外置索引來維護圖書和書評的關系(當然索引也不是完全實時的),再通過kv緩存(redis,ehcache,map等等)來緩存書評的具體內容。在數據更新(update)時,通常情況先更新數據庫,然后更新緩存,索引不需要更新。在數據更新(insert)時,需要在update基礎上,再增加相應的關系到索引中。
簡單的外置索引,可以在數據庫中,增加一張(圖書-書評)關系表,建好索引,在查詢書評時先查詢(分頁查詢)關系表,再通過書評主鍵,查詢具體書評信息(緩存加在單條書評信息上),建議分兩次查詢并在內存中組裝數據,不要使用連表查詢(影響數據庫性能)。關系表數據不需要建立緩存,只需要增加書評信息的緩存即可。
相關文章:
1. 我在centos容器里安裝docker,也就是在容器里安裝容器,報錯了?2. 網絡傳輸協議 - 以下三種下載方式有什么不同?如何用python模擬下載器下載?3. 我的html頁面一提交,網頁便顯示出了我的php代碼,求問是什么原因?4. angular.js - Angular路由和express路由的組合使用問題5. 如何修改phpstudy的phpmyadmin放到其他地方6. java 排序的問題7. tp6表單令牌8. 數據庫 - 使用讀寫分離后, MySQL主從復制延遲會導致讀不到數據嗎?9. django - 后臺返回的json數據經過Base64加密,獲取時用python如何解密~!10. node.js - gulp文件監聽的問題
