2012-03-20 69 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