基于流的网站 - 使用memcache进行优化的选项(d)

时间:2011-12-05 18:32:09

标签: php mysql caching memcached redis

这是一个很难提出的问题而不是过于笼统或宽泛,所以如果这个问题太高,我会提前道歉。答案格式。

我正在开发一个系统,其中包括一个经常更新的Feed类型系统(一种'twitter'风格),以及一个根据用户投票对项目进行排名的系统。该系统基于用PHP编写的json / restful api,它访问(主要)innodb mysql数据库。数据库本身实际上本身已经过高度优化,并且很好地规范化了。该系统还利用sphinx进行搜索,并使用一些外部队列&处理系统进行数据处理。

我的问题是:有没有人对如何在一个系统中实现内存缓存的方法有任何建议,而这个系统依赖于数据库表关系?

例如:“热门列表”基于每次有人对某个项目进行投票时计算的排名。有人投票,为项目计算新的“等级”,并作为整数存储在mysql数据库中。

写一个类似cron作业的东西来每隔几分钟缓存这个条目列表会更有效率,因此不那么频繁地命中db - 或者 - 从DB中提取'id'是否有意义而不是缓存列表,缓存项目数据并从内存中为列表中的每个项目单独提取数据?

曲线球是每个项目,api调用还需要返回用户是否已经对该项目进行投票,这也可以被缓存,但是很难缓存需要检查的存在的东西。

我发现它是一种心理体操,试图确定它实际上有意义的数据,或者当很多依赖于如此大量更新的数据时可以缓存。

无论哪种方式,都不确定这是否是一个正确的问题,但是我很乐意从那些有很多经验来处理缓存静态元素很少的应用程序的人那里获得一些见解。


顺便说一下,我已经认真考虑过使用Redis来管理“排名项目”Feed ...即,不是在排名更新时点击数据库,而只是更新redis列表。我只花了一点时间使用redis,所以我不是百分之百,这是在需要超级可扩展的系统上处理这个问题的最佳方法。

1 个答案:

答案 0 :(得分:1)

Redis在这里有一些重要的东西:pub / sub。这将允许您发布事件之类的事情,并立即获得所有侦听器的通知(非常可扩展)。它还有各种“* ex”操作(原子,存在测试) - SETEX,SETNX等以及原子列表交换等。

就个人而言,我认为redis可以提供很多场景。