2016-08-18 31 views
0

我知道我可以在config.yml文件中爲DoctrineCacheBundle設置多個名稱空間。但是,我可以使用一個驅動程序,但有多個命名空間嗎?如何在DoctrineCacheBundle cacheDriver中使用多個名稱空間?

這種情況是,在我的應用程序,我想緩存所有我的實體的所有查詢。問題是在創建/更新操作時刷新緩存。我只想刷新部分緩存查詢。我的應用程序被多個客戶端使用。因此,當客戶端更新某些數據時,例如在Article實體中,我只想爲此客戶端僅爲條目清除緩存。我可以爲每個查詢添加適當的ID並手動刪除它們,但查詢是動態使用的。在我的API移動應用程序發送數據庫應該返回數據的版本號,所以我不知道最終會使用什麼樣的ID。

回答

1

不幸的是我不認爲你想要做什麼可以用一些配置魔法來解決。你想要它什麼樣的索引緩存,爲此你必須找到一個更強大的工具。你可以看看doctrines second level cache。不知道它現在有多好(在測試版中嘗試過一次,並沒有爲我做好切換)。

或者你可以建立你自己的緩存管理器。如果你是我推薦使用redis。數據結構將幫助您保持索引(可以使用memcached進行模擬,但需要更多工作)。我通過索引找到了什麼。

您將擁有一個鍵,如client_1_articles,其中1是客戶端ID。在該鍵中,您將存儲客戶端1的所有文章的ID。對於每篇文章ID,您將擁有一個類似article_x的鍵,其中x是文章的ID。在這個例子中,client_1_articles是一個基本的索引,如果你想在某些時候使客戶端1的所有文章的緩存失效,那麼client_1_articles將會幫助你。

上述例子的抽象實現最終將會像圖結構在你的緩存,搭配有可能

-composed指標 '的Client_1:category_1'=> {article_1,article_2}

一個項目如-multiple指標: 'category_1'=> {article_1,article_2,article_3} ,'client_1'=> {article_1,article_3}

-etc。

希望這可以幫助你。至少這是我解決類似問題的方法。

祝你好運與您的項目,

亞歷Cosoi

+0

所以你的意思是使用例如SncRedisBundle,其配置爲通過DoctrineCacheBundle爲metadata_cache,RESULT_CACHE,query_cache然後在控制器同時使查詢中使用,使用$ cache = $ this-> container-> get('redis_cache')來緩存它; $ cache-> save('article_1',$ article);然後將這些密鑰保存到KEY到Redis?像$ redis-> append('client_1','article_1'); 然後當進行更新時,只需使用$ redis-> delete(array('key3','key4'))刪除正確的密鑰; ? – Tom

+0

就是這樣,是的。我不知道你是否想要結果緩存。我遇到了一些問題。我只使用元緩存,查詢緩存,並且我自己負責結果緩存。 –

相關問題