LaneBlog

蝼蚁虽小,也有梦想

PHP Socket服务 | PHP微信开发框架 | 开源博客

    现在有很多的项目,对计数器的实现甚是随意,比如在实现网站文章点击数的时候,是这么设计数据表的,如:”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`)
)ENGINE=InnoDB;
这种方式,虽然分担了文章表的压力,但是每当有一个进程请求更新的时候,都会产生全局的互斥锁,只能串行,不能并行。在高并发下会有较长的等待时间。 另一种比较好的办法是对每一个文章的计数器不是一行,而是多行,比如吧,一百行。每次随机更新其中一行,该文章的浏览数就是所有行的和。
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`)
)ENGINE=InnoDB;
小访问量的随机池子100个肯定多了,三五个足矣。每次访问的时候,随机一个数字(1-100)作为pond,如何该pond存在则更新view+1,否则插入,view=1。借助DUPLICATE KEY,不然在程序里是实现得先SELECT,判断一下再INSERT或者UPDATE。
INSERT INTO `article_view` (`article_id`, `pond`, `view`) VALUES (`123`, RAND()*100, 1) ON DUPLICATE KEY UPDATE `view`=`view`+1
获取指定文章的总访问量的时候:
SELECT SUM(`view`) FROM `article_view` WHERE `article_id`='123'
Ps:凡事都是双刃剑。为了更快的读我们通常要牺牲一些东西。在读比较多的表要加快读的速度,在写较多的表要加快写的速度。各自权衡。在加快读的速度的时候,我们牺牲的并不仅仅是写的性能,还有开发成本,开发变的更复杂,维护成本等。所以并不是读的速度越快越好,需要找一个平衡点。 注:这里仅仅是Mysql方面,有人会说高并发下你这是直接读写Mysql啦,项目的瓶颈本来就在数据库啦。。。其实。。。这里只是说Mysql的表怎么去设计而已。你完全可以在这个地方用队列去写表,你也可以把计数器在内存中保存,一直来累加,1个小时持久化一次。你也可以去用号称每秒读写十万次的Redis。

Reply: kevin On 2015-10-28 11:28:01

INSERT INTO `article_view` (`article_id`, `pond`, `view`) VALUES (`123`, RAND()*100, 1) ON DUPLICATE KEY UPDATE `view`=`view`+1我认为你这一句话有问题,duplicate key会检测主键或者唯一健,是否存在在判断应该更新还是添加,那么你这里是给pond设置唯一健么,还是怎么处理。??

回复

Reply: Lane On 2015-10-28 14:14:11

必须有主键,他只是根据主键来判断是否存在(插入或更新)。article_id是主键。

回复

Reply: kevin On 2015-10-28 22:50:02

那么这样的:a_id = 3 pond= 6 view = 8 已经有这条记录了。当新的数据是value('3',7,1)这时候,怎办么,更新view8为9, pondgeng xin 为7么??

回复

Reply: Lane On 2015-10-31 19:23:51

a_id = 3 pond= 6 view = 8已经有了对吧,然后value('3',7,1)来了。就是a_id=3 pond=7 view +=1。 pond=6和pond=7各自有各自的view,互不干扰。

回复

Reply: from china city x On 2016-08-04 11:27:01

非常好用,谢谢

回复

Reply: ejucebaibif On 2020-01-24 15:49:15

http://mewkid.net/who-is-xandra/ - Amoxicillin <a href="http://mewkid.net/who-is-xandra/">Amoxicillin 500mg Capsules</a> lss.iflq.lanecn.com.xcm.un http://mewkid.net/who-is-xandra/

回复

Reply: awafwyosefab On 2020-01-24 16:19:26

http://mewkid.net/who-is-xandra/ - Amoxicillin 500mg Capsules <a href="http://mewkid.net/who-is-xandra/">Amoxicillin On Line</a> jju.boby.lanecn.com.adu.nu http://mewkid.net/who-is-xandra/

回复

Reply: uyowihevi On 2020-01-30 10:28:53

http://mewkid.net/who-is-xandra/ - Amoxicillin Online <a href="http://mewkid.net/who-is-xandra/">Amoxicillin</a> pvv.tsws.lanecn.com.hfu.wt http://mewkid.net/who-is-xandra/

回复

Reply: ukejacetfemw On 2020-04-14 16:21:58

http://mewkid.net/when-is-xaxlop/ - Amoxicillin 500mg Capsules <a href="http://mewkid.net/when-is-xaxlop/">Buy Amoxicillin</a> kpv.jvoj.lanecn.com.tmc.fb http://mewkid.net/when-is-xaxlop/

回复

Reply: awaqubaoveka On 2020-04-14 17:02:20

http://mewkid.net/when-is-xaxlop/ - Amoxicillin <a href="http://mewkid.net/when-is-xaxlop/">Amoxicillin 500mg Capsules</a> dln.gvep.lanecn.com.ptn.fj http://mewkid.net/when-is-xaxlop/

回复

Reply: best place to buy cialis online reviews On 2020-08-25 01:32:56

viagra de 50 mg gampHimb https://cialisse.com/ - viagra vs cialis Bedelumess Pharmacy4you DumSoone <a href=https://cialisse.com/#>Cialis</a> TEALLOTKAX Discount Cialis 20 Mg

回复

Add Comment
©2014 www.lanecn.com , All rights reserved. Power By Li Xuan.  京ICP备14005030号