php – 在MySQL中扩展递增计数器(用于跟踪综合浏览量)
我有一个整数MySQL列,每次查看页面时都会增加. SQL查询看起来像这样: UPDATE页面SET views = views 1 WHERE id = $id 当每秒多次查看同一页面(相同的id)时,我们开始遇到缩放问题(记录将锁定在MySQL中)并且查询会使MySQL陷入停顿.为了解决这个问题,我们一直在使用以下策略: 每次加载页面时,我们都会在Memcache中增加一个计数器,并将一个作业放入队列(Gearman)中,该队列将在后台更新MySQL中的计数器(在3台工作机器中).简化的代码如下所示: 在页面视图:
在后台工作者:
这运作良好.它允许我们减少对DB的查询(因为我们在写入DB之前在memcache中聚合视图)并且DB写入在后台发生,而不是阻止页面加载. 不幸的是,我们开始再次看到MySQL锁定.似乎非常活跃的页面几乎同时运行,导致MySQL再次锁定.锁正在减慢写入速度并且经常会杀死我们的工作人员.这导致队列变得非常大,通常有7万个“落后”的工作 我的问题:接下来我们应该做些什么来扩展这个? 最佳答案 我对Gearman了解不多,所以我可能错了.每次增加计数器时,您都会将齿轮工作任务排入队列.我想只有当$memcache->增量的结果为1时才最好将任务排入队列.我的理由是,当齿轮人任务清除page_view后,下一次更新将到达时:$i,你将没有渴望在DB中更新这个新值的齿轮工作任务的长队列.这应该使您的代码独立于您的更新速率,并限制齿轮师选择新任务的速度(希望足够慢).在一个完美的世界里,你可以让齿轮工人延迟这个任务~1s.这将确保您仅以1 qps的速率更新此计数器. 独立于gearman,如果你可以接受较慢的READ并假设你正在使用InnoDB,你可以对这个计数器进行分片. 要做到这一点,只需添加一个分片列并使其成为主键的一部分,如
更新此计数器时,随机选择1到10之间的分片.当您阅读它时,请对要读取的ID的所有分片进行SUM.这将使读取速度降低10倍,但它允许您在写入时缩放10倍. (当然它不需要是10,你可以选择你想要的任何数字.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- mysql – 未定义的方法`eq’代表nil:nilClass with rails
- MYSQL数据库mysql prompt的用法详解
- 小结SQL?Server连接失败错误及解决(1)
- 执行count()计算会减慢我的mysql查询吗?
- Mysql必读Mysql单文件存储删除数据文件容量不会减少的bug与
- MYSQL数据库MySql实现跨表查询的方法详解
- Mysql应用Mysql半同步复制原理及问题排查
- MYSQL教程mysql4.0升级到mysql5(4.1),解决字符集问题
- MYSQL数据库服务器不支持 MySql 数据库的解决方法
- php – 哪个更快:“SELECT * FROM table”或“SELECT x,y