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

标签 php mysql caching memcached redis

这是一个有点难问的问题,但又不会太笼统或太宽泛,所以如果对于这种问答格式来说它的级别太高,我提前表示歉意。

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

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

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

是否可以更有效地编写类似 cron 作业的东西来每隔几分钟缓存此条目列表,从而降低访问数据库的频率 - 或者 - 从数据库中提取“id”是否有意义,以及而不是缓存列表,缓存项目数据并从内存中为列表中的每个项目单独提取数据?

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

我发现它有点像智力体操,试图确定哪些数据实际上有意义,或者在如此多地依赖于如此频繁更新的数据时可以缓存哪些数据。

无论哪种方式,我都不确定这是否是要问的正确问题,但我希望任何在处理静态元素很少的应用程序的缓存方面具有丰富经验的人提供一些见解。


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

最佳答案

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

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

关于php - 基于流的网站 - 使用 memcache(d) 进行优化的选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8390072/

相关文章:

http - 按 BACK 按钮时防止缓存

缓存从 pcap 捕获的数据包

PHP $row ['value' ] 在 div 值中

php - 如何插入 NULL 值

java - 从 MySQL 的mediumblob 恢复后,PPT 文件损坏

MYSQL 查询 - 使用另一个表中的多个 ID 对项目求和

sql - 获取最后 30 行

python - Django localmem 大小

php - elasticsearch - 其中字段为空

php - 根据另一个数组从数组中删除行