2011-08-08 80 views
1

我已經內置到我們的ORM層對象緩存中。基本上,SQL查詢的散列用作鍵,值包含來自數據庫結果集的對象集合。但是,如果更新結果集中的某個對象,則會產生問題,緩存的結果集不包括更新的對象。沒有寫一致性。我將如何實現寫一致性?APC緩存一致性問題

感謝

更新:目前我有一個處理哪些對象緩存及其密鑰的ObjectWatcher類。對象使用可檢索的關鍵字進行緩存,因此對於Person類,它就是Person.101。 SQL查詢被散列並且鍵映射到Dependency對象,其中包含依賴對象的列表。因此,SELECT * FROM person可能會從映射到Person.101和Person.102的APC返回一個Dependency對象,從而得到的集合將從此Dependency對象構建。這適用於單個對象的更新。因此,如果我更新Person.101並將新更新對象放入APC覆蓋已過時的對象,那麼在運行較早的查詢時,已更新的對象將被放入該結果集中,這可能不正確。我需要一種方法來清除內存中的對象,但是所有的Dependency對象都持有對已更新對象的引用。在APC中是否有一種方法來搜索包含或包含或過濾鍵和值的鍵值?

回答

1

此問題與APC無關。
您需要管理數據如何存儲在APC(或任何其他存儲)中。如果你想更新APC中的鍵的值,當對象被改變時 - 只有當對象知道鍵(查詢的散列)時這個對象纔有可能,並且這個對象應該能夠收集來自另一個對象的所有數據,該查詢。這聽起來像是荒謬的想法。

任何模型都應該設計爲Single Responsibility原則,所以如果你想緩存整個對象(這也不是很好的想法),那麼爲每個對象創建唯一的鍵。
此外,對象不應該關心他們將如何存儲(緩存),以及在哪裏。所以你需要一個對象,它將管理對象緩存。

而且我建議不要緩存整個對象,而只緩存數據庫中的記錄值,這需要花費很多時間從數據庫中獲取它們。

但是,如果您仍然希望使用SQL查詢的散列作爲關鍵字,那麼您可以使用tags並在這些標記中寫入對象的「名稱」。 例如,如果在結果集中有對象Person,Employer和Customer,那麼key將具有標籤「person」,「employer」和「customer」。而且,當對象Customer將被更改時,可以從緩存中刪除標記爲「customer」的所有密鑰。
但是,無論如何,它不是Customer對象的責任,所有這些事情都應該由另一個對象來管理。

問題是編輯,所以我會太編輯我的答案:)

標籤不是APC的一部分,是包裝的一部分。標籤是非常有用的東西,非常方便您的情況。

持有更新後的對象的引用

標籤可以是該參考文獻。您不需要通過標籤來搜索關鍵字,只需要刪除與該標籤關聯的所有關鍵字(以保持數據實際),並且此包裝器具有現成的方法來執行此操作。

在示例中:
讓我們查詢SELECT * FROM persons WHERE email <> '' - 此查詢的緩存結果將標記爲「person」。因此,當我們更新任何Person對象時,我們將刪除標記爲「person」的所有密鑰,因此我們的查詢結果SELECT * FROM persons WHERE email <> ''將被刪除,並且在接下來的請求中,我們的腳本將生成新的(實際的)值。

+0

對不起,我應該更具體,我已經更新了這個問題。如果我將標籤寫入APC中的密鑰,如何搜索包含標籤的密鑰? – Gcoop