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

Php 基于流的网站-使用memcache进行优化的选项(d),php,mysql,caching,memcached,redis,Php,Mysql,Caching,Memcached,Redis,这是一个有点难问的问题,但不要问得太笼统或太宽泛,因此,如果这个问题和答案格式的级别太高,我提前表示歉意 我正在开发一个系统,该系统包括一个经常更新的提要类型系统(一种“推特”风格),以及一个根据用户投票对项目进行排名的系统。该系统基于用PHP编写的json/restful api,该api访问(大部分)innodb mysql数据库。数据库本身实际上是高度优化的,并且非常规范化。该系统还使用sphinx进行搜索,并使用一些外部队列和处理系统进行数据处理 我的问题是:在一个如此依赖数据库表关系的

这是一个有点难问的问题,但不要问得太笼统或太宽泛,因此,如果这个问题和答案格式的级别太高,我提前表示歉意

我正在开发一个系统,该系统包括一个经常更新的提要类型系统(一种“推特”风格),以及一个根据用户投票对项目进行排名的系统。该系统基于用PHP编写的json/restful api,该api访问(大部分)innodb mysql数据库。数据库本身实际上是高度优化的,并且非常规范化。该系统还使用sphinx进行搜索,并使用一些外部队列和处理系统进行数据处理

我的问题是:在一个如此依赖数据库表关系的系统中,有人对如何实现memcache有什么建议吗

例如:“热门名单”基于每次有人对某个项目投票时计算的排名。如果有人投票,将为该项目计算一个新的“排名”,并将其作为整数存储在mysql数据库中

写一些像cron作业这样的东西每隔几分钟缓存一次这个条目列表会更有效吗,从而更少地命中数据库?或者,从数据库中提取一个“id”,而不是缓存列表,缓存条目数据,并分别从内存中为列表中的每个条目提取数据,这有意义吗

curveball是指,对于每个项,api调用还需要返回用户是否对该项进行了投票,这也可以缓存,但很难缓存需要检查的存在的内容

我发现这有点像心理体操,试图确定当如此多的数据依赖于更新如此频繁的数据时,它实际上有什么意义或者可以缓存什么数据

不管怎样,我都不确定这是否是一个正确的问题,但我希望任何有丰富经验的人都能对静态元素很少的应用程序进行缓存



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

Redis有一个重要的功能:发布/订阅。这将允许您发布事件之类的内容,并立即通知所有侦听器(非常可扩展)。它还具有各种“*ex”操作(原子、存在性测试)-SETEX、SETNX等,以及原子列表交换等


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

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


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

。。。你进一步改变了我对redis的兴趣。在我的例子中,“投票”是事件,算法是处理程序,redis会存储结果吗?我想我从较高的层面上理解了这个概念,但从功能层面来看,redis如何最好地替代每次投票或请求“热门/热门”名单时锁定数据库?@Jonathan我们在这里以不同的方式使用它——有时作为活动本身,但我们有时也使用redis来存储数据的可缓存快照,并在更改/使其无效时发送消息。我并不声称自己是完美的redis大师(尽管我从零开始就为它写了一个客户——BookSleeve),但我真的认为它值得研究。谢谢marc!你让我更多地思考redis如何为我工作。。。我真的很感谢你的反馈!隐马尔可夫模型。。。你进一步改变了我对redis的兴趣。在我的例子中,“投票”是事件,算法是处理程序,redis会存储结果吗?我想我从较高的层面上理解了这个概念,但从功能层面来看,redis如何最好地替代每次投票或请求“热门/热门”名单时锁定数据库?@Jonathan我们在这里以不同的方式使用它——有时作为活动本身,但我们有时也使用redis来存储数据的可缓存快照,并在更改/使其无效时发送消息。我并不声称自己是完美的redis大师(尽管我从零开始就为它写了一个客户——BookSleeve),但我真的认为它值得研究。谢谢marc!你让我更多地思考redis如何为我工作。。。我真的很感谢你的反馈!