【问题标题】:Stream based website - options for optimization with memcache(d)基于流的网站 - 使用 memcache(d) 进行优化的选项
【发布时间】:2012-01-13 11:22:55
【问题描述】:

这是一个很难提出的问题,但不能使其过于笼统或宽泛,因此,如果此问答格式的级别太高,我提前道歉。

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

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

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

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

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

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

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


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

【问题讨论】:

    标签: php mysql caching memcached redis


    【解决方案1】:

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

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

    【讨论】:

    • 嗯......你在这里进一步调整了我对 redis 的兴趣。就我而言,“投票”是事件,算法是处理程序,redis 会存储结果吗?我想我在较高的层面上理解了这个概念,但从功能层面来看,每次投票或请求“流行/热门”列表时,redis 如何最好地替代固定数据库?
    • @Jonathan 我们在这里以不同的方式使用它——有时作为事件本身,但有时我们也使用 redis 来存储数据的可缓存快照,并在我们更改它/使其无效时发送一条消息.我并不声称自己是完美的 redis 大师(尽管我确实从零开始为它写了一个客户端 - BookSleeve),但我真的认为它值得研究。
    • 谢谢马克!你让我更多地思考 redis 如何为我工作......我非常感谢你的反馈!
    猜你喜欢
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多