当前位置: 首页 > 编程笔记 >

MySQL中实现高性能高并发计数器方案(例如文章点击数)

南宫奇思
2023-03-14
本文向大家介绍MySQL中实现高性能高并发计数器方案(例如文章点击数),包括了MySQL中实现高性能高并发计数器方案(例如文章点击数)的使用技巧和注意事项,需要的朋友参考一下

现在有很多的项目,对计数器的实现甚是随意,比如在实现网站文章点击数的时候,是这么设计数据表的,如:”article_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:凡事都是双刃剑。为了更快的读我们通常要牺牲一些东西。在读比较多的表要加快读的速度,在写较多的表要加快写的速度。各自权衡。在加快读的速度的时候,我们牺牲的并不仅仅是写的性能,还有开发成本,开发变的更复杂,维护成本等。所以并不是读的速度越快越好,需要找一个平衡点。

 类似资料:
  • 主要内容:1.难题与方案,2.具体措施,3.九种技术架构1.难题与方案 1、亿级流量电商网站的商品详情页系统架构 面临难题:对于每天上亿流量,拥有上亿页面的大型电商网站来说,能够支撑高并发访问,同时能够秒级让最新模板生效的商品详情页系统的架构是如何设计的? 解决方案:异步多级缓存架构+nginx本地化缓存+动态模板渲染的架构 2、redis企业级集群架构 面临难题:如何让redis集群支撑几十万QPS高并发+99.99%高可用+TB级海量数据+企业级数

  • 本文向大家介绍Django中实现一个高性能计数器(Counter)实例,包括了Django中实现一个高性能计数器(Counter)实例的使用技巧和注意事项,需要的朋友参考一下 计数器(Counter)是一个非常常用的功能组件,这篇blog以未读消息数为例,介绍了在 Django中实现一个高性能计数器的基本要点。 故事的开始:.count() 假设你有一个Notification Model类,保存

  • 主要内容:1.负载均衡,2.分布式微服务,3.缓存机制,4.分布式关系型数据库,5.分布式消息队列,6.CDN 内容分发网络,7.其他,8.总结1.负载均衡 靠优化单台机器的内存、CPU、磁盘、网络带宽,使其发挥极致性能,已经不太现实。 负载均衡,它的职责是将网络请求 “均摊”到不同的机器上。避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况 通过负载均衡,可以让每台服务器获取到适合自己处理能力的负载。在为高负载服务器分流的同时,还可以避免资源浪费,一举两得。 常见的负载算法: 随机算法

  • 主要内容:一、为什么要用缓存集群,二、20万用户同时访问一个热点缓存的问题,三、基于流式计算技术的缓存热点自动发现,四、动加载为JVM本地缓存,五、限流熔断保护,六、本文总结一、为什么要用缓存集群 这篇文章,咱们来聊聊热点缓存的架构优化问题。 其实使用缓存集群的时候,最怕的就是热key、大value这两种情况,那啥叫热key大value呢? 简单来说,热key,就是你的缓存集群中的某个key瞬间被数万甚至十万的并发请求打爆。 大value,就是你的某个key对应的value可能有GB级的大小,导

  • 主要内容:一般业务系统运行流程图,一台 4 核 8G 的机器能扛多少并发量呢?,高并发来袭时数据库会先被打死吗?,8 核 16G 的数据库每秒大概可以抗多少并发压力?,数据库架构可以从哪些方面优化?,总结今天给大家分享一个知识点,是关于 MySQL 数据库架构演进的,因为很多兄弟天天基于 MySQL 做系统开发,但是写的系统都是那种低并发压力、小数据量的,所以哪怕上线了也就是这么正常跑着而已。 但是你知道你连接的这个 MySQL 数据库他到底能抗多大并发压力吗?如果 MySQL 数据库扛不住压力

  • 本文向大家介绍vue点击当前路由高亮小案例,包括了vue点击当前路由高亮小案例的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了vue点击当前路由高亮的具体代码,供大家参考,具体内容如下 功能展示: 组件代码: 标签上加exact 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。