MySql计数器,如网站点击数,如何实现高性能高并发的计数器功能

Clicks: 5338 Date: 2014-03-29 23:30:42 Power By 李轩Lane

TagMysql计数器高性能

现在有很多的项目,对计数器的实现甚是随意,比如在实现网站文章点击数的时候,是这么设计数据表的,如:”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。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

mysql点击计数器_MySql计数器,如网站点击数,如何实现高性能高并发的计数器功能...相关推荐

  1. mysql高并发 计数器_请问一下MySql计数器如何实现高性能高并发的计数器功能?...

    Windows性能计数器--磁盘性能分析Disk Physical Disk: 单次IO大小 Avg.Disk Bytes/Read Avg.Disk Bytes/Write IO响应时间 Avg.D ...

  2. 惊!一个千万级 PV 规模高性能高并发网站架构

    作者:一盏烛光,贤牛特邀工程师. 成为[贤牛]工程师,按需运维,灵活用工,让运维工程师多赚一些零花钱,多一些企业级运维经验. 客户端:缓存(expires).deflate 压缩 缓存服务器:CDN/ ...

  3. 千万级PV规模高性能高并发网站架构详解

    1.缓存(expires) 2.deflate压缩 3.Apache/nginx静态服务器提供html页面内容 4.CDN/cache缓存静态内容如:html.jpg.gif.js等 5.MYSQL数 ...

  4. 浅谈千万级PV/IP规模高性能高并发网站架构

    原创作者:老男孩linux实战运维培训机构 老男孩 QQ:31333741    说明:几个月前老男孩发过一次类似的文章,本次为了参加一个朋友邀请的活动,稍微完善了一下,欢迎各位同仁一起交流网站架构技 ...

  5. 网站设计高性能高并发

    高性能高并发 高并发访问的核心原则其实就一句话"把所有的用户访问请求都尽量往前推". 如果把来访用户比作来犯的"敌人",我们一定要把他们挡在800里地以外,即不 ...

  6. 浅谈千万级高性能高并发网站架构

    浅谈千万级PV/IP规模高性能高并发网站架构 高并发访问的核心原则其实就一句话"把所有的用户访问请求都尽量往前推". 如果把来访用户比作来犯的"敌人",我们一定 ...

  7. 浅谈千万级PV/IP规模高性能高并发网站架构(转自老男孩)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/736710 如果把来 ...

  8. 电商网站50W-100W高并发,秒杀功能是怎么实现的?

    电商网站50W-100W高并发,秒杀功能是怎么实现的? 在淘宝.天猫.京东等国内大型电商平台"造节"的带领下,国内各电商平台纷纷跟进,双十一.双十二.618等电商专属节日也吸引了大 ...

  9. redis 的incr 高并发 原子性计数器

    前言:6月底 公司录单的人比较多,由于先前的系统用的同步锁 ,我们是多服务实例,导致出现重复单号的问题,我想到的解决办法有两种 ,第一种是 Redis锁 第二种是自增key,下面实现的是用第二种方法 ...

最新文章

  1. Silverlight WCF RIA服务(二十三)Silverlight 客户端 4
  2. iOS统计项目的代码总行数
  3. 收到朋友寄来的煎饼了
  4. 城市天气数据获取接口
  5. intellij idea下载安装以及创建项目(输出Hello World)
  6. Predictably Irractional - 所有权的高昂代价
  7. 关于SimpleDateFormat的一些使用及性能数据
  8. logit回归怎么看显著性_spss logistic回归分析结果如何分析
  9. Camtasia 2019编辑视频文件时程序无响应的解决方法
  10. access数据库修复
  11. MAXIMO学习笔记
  12. Laya2自动同步cullingMask方案以及灯光裁剪补丁
  13. Adobe产品adobe ID登录卡死问题的解决
  14. 29岁的人生并不是那么平平淡淡_20190308
  15. Angular5.x多环境配置(开发环境、生产环境、测试环境)
  16. android studio安装apk时,vivo 部分手机出现 解析软件包错误
  17. 苹果x屏幕出现一条绿线_iPhone X 屏幕维修怎么防止被坑?各种屏幕的介绍
  18. Spring5框架-IOC容器
  19. mmseg底层代码分析及修改
  20. python爬虫-爬妹子图

热门文章

  1. ECS事件通知之创建失败事件
  2. DLA实现跨地域、跨实例的多AnalyticDB读写访问 1
  3. 舞动的桥 阿里云首个百万IOPS云盘的背后
  4. 可怕!CPU暗藏了这些未公开的指令!
  5. Dev Lake 0.4.0 版本:开源、开放的研发效能数据平台
  6. 深度好文 | 战“疫”上云正当时:打开云计算的正确姿势
  7. 主键索引 or 辅助索引?一文告诉你 Mysql limit 优化时的索引选择!
  8. 广东农信迁移上阿里云:系统建设从按月缩短至按天
  9. 靓仔落泪,性能问题定位难倒我了
  10. 避免大规模故障的微服务架构设计之道