對於特定的數據庫表,我們需要內存緩存中的數據始終與數據庫同步。我目前的嘗試是將更改寫入after_commit
鉤子中 - 這樣我們就不會將任何更改寫入緩存,以便以後恢復。確保將數據緩存在after_commit掛接時的一致性
然而,這種策略很容易受到以下情形:
- 線程A的鎖和更新記錄,保存的價值
1
- 線程A提交了更改
- 線程B的鎖和更新記錄,商店值
2
- 線程B提交更改
- 線程B運行
after_commit
掛接,因此緩存現在的值爲2
- 線程A運行
after_commit
掛鉤,所以緩存目前擁有價值1
但應該有值2
我說得對不對這個問題,一個是如何解決這個問題?
感謝您的見解。由於緩存涉及整個樹結構,因此在那裏處理回滾實際上意味着要爲緩存重新實現類似db的事務處理。只需使緩存無效並稍後重新加載它也是一種解決方案,但對於樹結構而言非常複雜。這種問題沒有解決方案嗎? – Remo
記錄更改的頻率如何?你多久閱讀一次記錄?緩存中的結構有多複雜?也許有可能優化你的數據庫模式的閱讀,而不是依靠緩存來閱讀? – spickermann
記錄可以經常更改,它是一個50-100k記錄的樹形結構,所以我認爲這不是讀取(每個請求)沒有緩存的選項。該查詢是一個嵌入式查詢,大約需要1.4秒,我沒有看到很多優化潛力。 – Remo