2012-03-20 65 views
1

我正在尋找內存腳本緩存的解決方案,使用Zend_Cache和zend框架。zend框架中的內存中腳本緩存後端

我們在我們的應用程序少數情況下,在爲了顯示有一張桌子,讓我們說,100元,其邏輯如下:

  • 獲取從內容表100個項目(一單查詢)
  • 對於每一個項目,讓誰批准了DB /內存緩存後端內容創建者用戶和用戶(這通常是由一個for循環)

做在大多數情況下,用戶誰批准內容是一個2或3個管理員用戶,但腳本調用th e數據庫/ memecache多次。它變得更糟,因爲用戶模型必須查詢3個不同的表來知道用戶屬於哪個角色以及他也屬於哪個社區。

因此,所有的一切,可顯示100項的表格,我們查詢數據庫(或內存緩存服務器)的600倍:-)

我在這裏想約2解決方案:

  • 不要查詢循環內的用戶表。循環播放100個項目,獲取所有用戶ID並通過單個查詢獲取所有用戶。我不確定這將是一個好的解決方案,因爲它意味着我將不得不編寫sql連接,導致模型函數返回一個非Zend_Db_Table_Row,我們大量使用它。

  • 另一種解決方案是在第一次加載時將用戶對象保存到內存緩存陣列中,下一次循環嘗試讀取用戶ID時,它將首先在內存緩存中的「特殊」中查找。我想使用Zend_Registry作爲緩存後端,類似這裏的解決方案:http://sameerparwani.com/posts/using-zend_registry-as-a-zend_cache-backend

我們確實使用了內存緩存服務器,但該腳本只是查詢內存緩存服務器,而不是查詢mysql數據庫的百倍寥寥無幾。但是,查詢memcache服務器會更快,因爲腳本已經加載了這些數據,我想使用腳本「內存」而不是查詢外部服務器。

+0

你能不能做到這一切在一個單一的查詢?獲取記錄,誰創建了它,誰批准了它? – Iznogood 2012-03-20 18:00:24

+0

如果我在Zend_Db_Table中使用連接,fetchAll()函數將不返回結果作爲表的行類模型 – aporat 2012-03-20 19:27:59

+0

發佈一些代碼,讓我們看看。因爲從你張貼的內容我看不出爲什麼你不能這樣做。加入Zend_Db非常容易,結果仍然是一個表格行。我/我們可能錯過了一些這就是爲什麼你應該發佈代碼。 – Iznogood 2012-03-21 11:54:33

回答

2

看看FaZend,它有一個實現。在研究代碼時,它應該有點不同(例如,沒有TTL,test()會返回一個布爾值),但它對您來說可能已經足夠了。未經測試!

編輯:

因爲Zend框架2有它的實現:Zend\Cache\Storage\Adapter\Memory

+0

感謝您的鏈接。我在幾天前發現了一個類似於這個實現的類,並添加了單元測試,文檔並將其發佈到github中。 https://github.com/aporat/Zend_Cache_Backend_Memory。 – aporat 2012-04-04 01:41:04

+0

Aporat,我找不到存儲庫了。你有沒有刪除它或什麼? – 2012-12-05 12:32:16