現在在負責學校的一個圖書館個人寫作平台,基本的商業模式已經完成了,但是專案在高並發環境下還沒有做任何的最佳化。
每個學生在閱讀完一本書後都可以寫書評或做筆記,書評是公開的,筆記是私有的。依照現在的做法每個學生操作都存取資料庫去查詢,這樣以後一定會有效能瓶頸。
我大概看了一下ehcache的相關教學但沒有一個好的解決方案,主要是無法判斷快取是否失效。例如將高頻學生的一定數量筆記都放入到快取中間去的話,如果設定一個特定的超時時間5min,但是如果剛好在這5min之內又新添加或者修改了一篇筆記的話該怎麼辦麼?
例如在mybatis中對應一條sql語句select * from comments condition
,我可以透過ehcache建立一個記憶體緩存,但是如果comments
新加入或更新了一則記錄,怎麼能優雅的更新上次在ehcache中加入的快取。
各位網友是否能夠建議一下相關的解決方案? thanks :-)
代言2017-06-12 09:21:37
既然是緩存,那就一定對數據實效性有容忍度,否則要嚴格即時的數據,就只能存取資料庫查詢了。
根據題主描述的業務場景來看,普遍的解決方案是透過外置索引來維護圖書和書評的關係(當然索引也不是完全實時的),再透過kv快取(redis,ehcache,map等等)來快取書評的具體內容。
在資料更新(update)時,通常情況先更新資料庫,然後更新緩存,索引不需要更新。
在資料更新(insert)時,需要在update基礎上,再增加對應的關係到索引中。
簡單的外置索引,可以在資料庫中,增加一張(圖書-書評)關係表,建好索引,在查詢書評時先查詢(分頁查詢)關係表,再透過書評主鍵,查詢具體書評資訊(快取加在單一書評資訊上),建議分兩次查詢並在記憶體中組裝數據,不要使用連表查詢(影響資料庫效能)。關係表資料不需要建立緩存,只需要增加書評資訊的快取即可。