首頁  >  問答  >  主體

mysql - 請教一個Java做資料庫快取的問題

現在在負責學校的一個圖書館個人寫作平台,基本的商業模式已經完成了,但是專案在高並發環境下還沒有做任何的最佳化。

每個學生在閱讀完一本書後都可以寫書評或做筆記,書評是公開的,筆記是私有的。依照現在的做法每個學生操作都存取資料庫去查詢,這樣以後一定會有效能瓶頸。

我大概看了一下ehcache的相關教學但沒有一個好的解決方案,主要是無法判斷快取是否失效。例如將高頻學生的一定數量筆記都放入到快取中間去的話,如果設定一個特定的超時時間5min,但是如果剛好在這5min之內又新添加或者修改了一篇筆記的話該怎麼辦麼?

例如在mybatis中對應一條sql語句select * from comments condition,我可以透過ehcache建立一個記憶體緩存,但是如果comments新加入或更新了一則記錄,怎麼能優雅的更新上次在ehcache中加入的快取。

各位網友是否能夠建議一下相關的解決方案? thanks :-)

为情所困为情所困2710 天前698

全部回覆(1)我來回復

  • 代言

    代言2017-06-12 09:21:37

    既然是緩存,那就一定對數據實效性有容忍度,否則要嚴格即時的數據,就只能存取資料庫查詢了。

    根據題主描述的業務場景來看,普遍的解決方案是透過外置索引來維護圖書和書評的關係(當然索引也不是完全實時的),再透過kv快取(redis,ehcache,map等等)來快取書評的具體內容。
    在資料更新(update)時,通常情況先更新資料庫,然後更新緩存,索引不需要更新。
    在資料更新(insert)時,需要在update基礎上,再增加對應的關係到索引中。

    簡單的外置索引,可以在資料庫中,增加一張(圖書-書評)關係表,建好索引,在查詢書評時先查詢(分頁查詢)關係表,再透過書評主鍵,查詢具體書評資訊(快取加在單一書評資訊上),建議分兩次查詢並在記憶體中組裝數據,不要使用連表查詢(影響資料庫效能)。關係表資料不需要建立緩存,只需要增加書評資訊的快取即可。

    回覆
    0
  • 取消回覆