实惠的网站建设产品,长沙公司网站,百度经验官网登录,网络策划是做什么的工作MySql计数器#xff0c;如网站点击数#xff0c;如何实现高性能高并发的计数器功能Clicks: 5338 Date: 2014-03-29 23:30:42 Power By 李轩LaneTagMysql计数器高性能现在有很多的项目#xff0c;对计数器的实现甚是随意#xff0c;比如在实现网站文章点击数的时候#xff…MySql计数器如网站点击数如何实现高性能高并发的计数器功能Clicks: 5338 Date: 2014-03-29 23:30:42 Power By 李轩LaneTagMysql计数器高性能现在有很多的项目对计数器的实现甚是随意比如在实现网站文章点击数的时候是这么设计数据表的如”article_id, menu_id, article_name, article_content, article_author, article_view......在article_view中记录该文章的浏览量。诈一看似乎没有问题。对于小站比如本博客就是这么做的因为小菜的博客难道会涉及并发问题吗答案显而易见一天没多少IP而且以后不会很大。言归正传对文章资讯类为主的项目在浏览一个页面的时候不但要进行大量的查(查询上文的记录已经所属分类的名字、热门文章资讯评论、TAG等)还要进行写操作(更新浏览数点击数)。把文章的详细内容和计数器放在一张表尽管对开发很方便但是会造成数据库的压力过大(不然为什么大项目都要分库分表呢)。那么分两张表存放就好了么一张表存文章详细信息另一张表单独存计数器。CREATE TABLE article_view(article_id int(11) NOT NULL,view int(11) NOT NULL,PRIMARY KEY (article_id))ENGINEInnoDB;这种方式虽然分担了文章表的压力但是每当有一个进程请求更新的时候都会产生全局的互斥锁只能串行不能并行。在高并发下会有较长的等待时间。另一种比较好的办法是对每一个文章的计数器不是一行而是多行比如吧一百行。每次随机更新其中一行该文章的浏览数就是所有行的和。CREATE TABLE article_view(article_id int(11) NOT NULL,pond tinyint(4) NOT NULL COMMENT 池子就是用来随机用的,view int(11) NOT NULL,PRIMARY KEY (article_id, pond))ENGINEInnoDB;小访问量的随机池子100个肯定多了三五个足矣。每次访问的时候随机一个数字(1-100)作为pond如何该pond存在则更新view1否则插入view1。借助DUPLICATE KEY不然在程序里是实现得先SELECT判断一下再INSERT或者UPDATE。INSERT INTO article_view (article_id, pond, view) VALUES (123, RAND()*100, 1) ON DUPLICATE KEY UPDATE viewview1获取指定文章的总访问量的时候SELECT SUM(view) FROM article_view WHERE article_id123Ps凡事都是双刃剑。为了更快的读我们通常要牺牲一些东西。在读比较多的表要加快读的速度在写较多的表要加快写的速度。各自权衡。在加快读的速度的时候我们牺牲的并不仅仅是写的性能还有开发成本开发变的更复杂维护成本等。所以并不是读的速度越快越好需要找一个平衡点。注这里仅仅是Mysql方面有人会说高并发下你这是直接读写Mysql啦项目的瓶颈本来就在数据库啦。。。其实。。。这里只是说Mysql的表怎么去设计而已。你完全可以在这个地方用队列去写表你也可以把计数器在内存中保存一直来累加1个小时持久化一次。你也可以去用号称每秒读写十万次的Redis。本文原创发布php中文网转载请注明出处感谢您的尊重