PHP - Redis/Memcachedb/Mongodb 或其他持久存储来存储计数器
Posted
技术标签:
【中文标题】PHP - Redis/Memcachedb/Mongodb 或其他持久存储来存储计数器【英文标题】:PHP - Redis/Memcachedb/Mongodb or other persistent storage to store counter 【发布时间】:2011-01-03 09:30:29 【问题描述】:通过计数器,它可能是浏览量、下载量、投票数等。基本上,不是非常“关键”的数据。
存储这些信息的“最佳”方式是什么? mysql 不是一个好的选择。你们都用什么?
【问题讨论】:
【参考方案1】:我想我会选择 Redis,因为:
Antirediz(他的昵称)正在积极开发Redis。 (每次我查看我的 github 仪表板时,他都会提交一些新代码)。他现在正在开发 redis fulltime 感谢 VMware Redis 最终是持久的,因此性能非常出色(首先只使用快速的内存)。 Redis 有一个您需要的原子increment 操作。 Redis 有很多优秀的 php 库。还有一个写成C extension,所以它的性能非常好。 Redis website 也有这些扩展的概述。有些是纯 PHP 代码(运行一点点但速度较慢,但更容易配置)。【讨论】:
我会说 redis。我正在做类似的事情,我在 20 美元的 512MB VPS 上每分钟推送 30k 个命令。 :) 我们尝试将 redis 用于计数器系统。 Redis 的主要数据存储是 RAM,而我们的数据集太大而无法发挥作用。更像东京暴君的东西——不必一直将整个数据集保存在内存中——可能是更好的选择。 一个简单的计数器不能保存在 RAM 中吗? Twitter 将几乎所有活跃的推文都存储在内存中。如果您想要性能,我认为您应该为内存模块支付一点现金。除此之外,您还可以便宜地买到几场公羊。【参考方案2】:带有 upserts 的 MongoDB 非常适合这个。
如果您要存储以下内容:
"url" : "www.example.com", "pageviews" : 0
您可以使用原子操作 $inc 以原子方式快速增加页面浏览量:
db.downloads.update('url' : 'www.example.com', '$inc' : pageviews : 1)
如果您使用 upsert,则不必在更新文档之前检查文档是否存在。例如,如果你说:
db.downloads.update('url' : 'www.example.com', '$inc' : pageviews : 1, "upsert" : true)
如果 URL 为 www.example.com 的文档不存在(页面浏览量设置为 1),则将创建该文档,或者如果确实存在,则页面浏览量将增加。这意味着您不必担心预先填充集合。
【讨论】:
【参考方案3】:1990 年代著名的查看计数器使用简单的文件来存储数字。如果您只需要存储一个数字,那么任何东西都足够了。
【讨论】:
如果您获得任何有意义的流量,写入磁盘上的文件会出现并发问题。除非您使用文件锁定,否则您将面临锁定争用的风险。像 memcached 这样的项目存在是有原因的。 但是,如果您只是将它用于一个简单(低流量)的网站,这可能会起作用并且很容易实现 锁竞争并不难。while(!get_lock() || count > 10000) sleep(0.001); count++ ; fread() or fwrite(); remove_lock();
像这样简单的东西可以轻松处理每秒数十万个请求...假设您选择的操作系统在文件系统操作方面速度很快。【参考方案4】:
我会说 APC 或 memcached 是不错的选择。
【讨论】:
以上是关于PHP - Redis/Memcachedb/Mongodb 或其他持久存储来存储计数器的主要内容,如果未能解决你的问题,请参考以下文章
IntelliJ IDEA 11编辑php是,支持php文件名为.php5和.php4,如何设置能让其也支持.php呢?