我创建了一个论坛,我们正在实现一个apc和memcache缓存解决方案来保存数据库的一些工作.
我开始使用像"Categories :: getAll"这样的键来实现缓存层,如果我有特定于用户的数据,我会用像用户ID之类的东西来附加密钥,这样你就可以得到"User::getFavoriteThreads|1471"
.当用户添加新的收藏夹线程时,我将删除缓存键,它将重新创建该条目.
然而,问题出现了:
我想在论坛中缓存线程.很简单,"论坛:: getThreads | $ iForumId".但是......通过分页,我必须将其分成几个缓存条目,例如
"Forum::getThreads|$iForumId|$iLimit|$iOffset".
哪个好,直到有人在论坛中发布新帖子.我现在必须删除所有键"Forum::getThreads|$iForumId"
,无论限制和偏移是什么.
什么是解决这个问题的好方法?我真的宁愿不循环遍历每个可能的限制和偏移,直到找到不再匹配的东西.
谢谢.
只是一个更新:我认为Josh对数据使用的看法非常好.人们不太可能继续查看论坛的第50页.
基于这个模型,我决定在每个论坛中缓存90个最新的线程.在提取函数中,我检查limit和offset以查看指定的线程片段是否在缓存中.如果它在缓存限制内,我使用array_slice()来检索正确的部分并返回它.
这样,我可以在每个论坛使用一个缓存密钥,清除/更新缓存只需要很少的工作量:-)
我还想指出,在其他更加资源丰富的查询中,我使用了flungabunga的模型,存储了密钥之间的关系.不幸的是,Stack Overflow不会让我接受两个答案.
谢谢!
我设法通过memcache
使用自定义类(比如ExtendedMemcache)扩展类来解决这个问题,该类具有受保护的属性,该属性将包含组到键值的哈希表.
该ExtendedMemcache->set
方法接受3个ARGS( ,$strGroup
,$strKey
)$strValue
当你调用设置,它将存储之间的关系$strGroup
,并且$strKey
,在被保护的属性,然后继续存放$strKey
到$strValue
中关系memcache
.
然后,您可以向ExtendedMemcache
名为"deleteGroup" 的类添加一个新方法,当传递一个字符串时,将找到与该组关联的键,并依次清除每个键.
它将是这样的:http: //pastebin.com/f566e913b 我希望所有这些都有意义,并为你工作.
PS.我想如果你想使用静态调用,那么protected属性可以memcache
在它自己的密钥下保存.只是一个想法.
您可能还想查看存储缓存数据的成本,包括您的工作量和CPU成本,以及缓存将如何为您购买的成本.
如果您发现80%的论坛视图正在查看线程的第一页,那么您可以决定仅缓存该页面.这意味着缓存读取和写入都更容易实现.
与用户最喜欢的线程列表相同.如果这是每个人很少访问的内容,那么缓存可能无法提高性能.