CN107862082B - 基于MySQL计数器表的高并发计数方法及web服务器 - Google Patents

基于MySQL计数器表的高并发计数方法及web服务器 Download PDF

Info

Publication number
CN107862082B
CN107862082B CN201711225004.XA CN201711225004A CN107862082B CN 107862082 B CN107862082 B CN 107862082B CN 201711225004 A CN201711225004 A CN 201711225004A CN 107862082 B CN107862082 B CN 107862082B
Authority
CN
China
Prior art keywords
counting
mysql
slot
counter table
message queue
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201711225004.XA
Other languages
English (en)
Other versions
CN107862082A (zh
Inventor
郑秋燕
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nubia Technology Co Ltd
Original Assignee
Nubia Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nubia Technology Co Ltd filed Critical Nubia Technology Co Ltd
Priority to CN201711225004.XA priority Critical patent/CN107862082B/zh
Publication of CN107862082A publication Critical patent/CN107862082A/zh
Application granted granted Critical
Publication of CN107862082B publication Critical patent/CN107862082B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/95Retrieval from the web
    • G06F16/958Organisation or management of web site content, e.g. publishing, maintaining pages or automatic linking
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/25Integrating or interfacing systems involving database management systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/546Message passing systems or structures, e.g. queues
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/547Remote procedure calls [RPC]; Web services
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/54Indexing scheme relating to G06F9/54
    • G06F2209/541Client-server
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/54Indexing scheme relating to G06F9/54
    • G06F2209/548Queue

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Databases & Information Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Computer And Data Communications (AREA)
  • Management, Administration, Business Operations System, And Electronic Commerce (AREA)

Abstract

本发明公开了一种基于MySQL计数器表的高并发计数方法,包括步骤:在MySQL计数器表中设置多个槽位,且多个槽位对应的多个槽位值存入预设栈;实时检测是否发生计数事件;若检测到计数事件,将计数事件存储至消息队列;开启与槽位数量相同的多个计数线程以使各计数线程从消息队列中读取计数事件、从预设栈中读取槽位值、将计数事件更新至槽位值、将已进行计数的计数事件从消息队列中删除并将更新后的槽位值返回预设栈。与现有技术相比,本发明通过消息队列实现了将web应用计数操作与MySQL计数器的计数操作进行解耦,通过设置多个槽位来对同一时刻的大量计数事件进行并发的计数操作,其保证了MySQL计数器的计算操作不会发生阻塞,大大提高了高并发计数时的效率。

Description

基于MySQL计数器表的高并发计数方法及web服务器
技术领域
本发明涉及web技术领域,尤其涉及一种基于MySQL计数器表的高并发计 数方法及web服务器。
背景技术
MySQL计数器表在Web应用中很常见,比如:需要统计用户对网站的点击 次数、文件下载数以及网站的新增用户数等等,都需要用到计数器。通常, Web开发者会将计数相关的数据单独创建一张表,这样可以使得计数器表小而 快,但是MySQL中对于这条记录的计数器的行更新操作,会有一个行级的事 务,即这条记录会有一个全局的互斥锁。在同一时候,只能有一个进程(或 线程)对该条记录进行更新,因此,在高并发的情况下,计数器的更新操作 会变的很慢,导致进程(线程)阻塞,使得性能变低。
因此,有必要提供一种基于MySQL计数器表的高并发计数方法及web服务 器来解决上述技术问题。
发明内容
本发明的主要目的在于提出一种基于MySQL计数器表的高并发计数方法 及web服务器,旨在解决现有技术中利用MySQL计数器表进行计数时无法进 行并发计数、导致计数器容易阻塞、计数性能低的技术问题。
首先,为实现上述目的,本发明提供一种基于MySQL计数器表的高并发 计数方法,应用于web服务器,所述基于MySQL计数器表的高并发计数方法 包括以下步骤:
在MySQL计数器表中设置多个槽位,且多个槽位对应的多个槽位值存入 预设栈;
实时检测是否发生计数事件;
若检测到计数事件,将所述计数事件存储至消息队列;
开启与所述槽位数量相同的多个计数线程以使各所述计数线程从所述消 息队列中读取所述计数事件、从所述预设栈中读取所述槽位值、将所述计数 事件更新至所述槽位值、将已进行计数的所述计数事件从所述消息队列中删 除并将更新后的所述槽位值返回所述预设栈。
可选地,所述基于MySQL计数器表的高并发计数方法还包括:
统计当前计数结果时,从所述MySQL计数器表中读取各所述槽位对应的 槽位值;
将各所述槽位值相加并将相加后的和值作为当前计数结果。
可选地,所述MySQL计数器表中还设置有日期;
所述统计当前计数结果时,从所述MySQL计数器表中读取各所述槽位对 应的槽位值的步骤具体为:
获取当前日期;
根据所述当前日期从对应日期的MySQL计数器表中读取各所述槽位对应 的槽位值。
可选地,所述开启与所述槽位数量相同的多个计数线程以使所述计数线 程从所述预设栈中取出所述槽位值的步骤之后还包括:
检测所述预设栈是否为空;
若检测结果为是,则将所述计数线程从所述消息队列中取出的计数事件 再次存储至所述消息队列;
若检测结果为否,则执行所述从所述预设栈中读取所述槽位值的步骤。
可选地,所述将所述计数事件存储至消息队列的步骤具体为:
将所述计数事件并发存储至所述消息队列。
同时,本发明还提供一种web服务器,所述web服务器包括存储器、处 理器及存储在所述存储器上并可在所述处理器上运行的基于MySQL计数器表 的高并发计数程序,所述基于MySQL计数器表的高并发计数程序被所述处理 器执行时实现如下步骤:
在MySQL计数器表中设置多个槽位,且多个槽位对应的多个槽位值存入 预设栈;
实时检测是否发生计数事件;
若检测到计数事件,将所述计数事件存储至消息队列;
开启与所述槽位数量相同的多个计数线程以使各所述计数线程从所述消 息队列中读取所述计数事件、从所述预设栈中读取所述槽位值、将所述计数 事件更新至所述槽位值、将已进行计数的所述计数事件从所述消息队列中删 除并将更新后的所述槽位值返回所述预设栈。
可选地,所述基于MySQL计数器表的高并发计数程序被所述处理器执行 时,还用于实现以下步骤:
统计当前计数结果时,从所述MySQL计数器表中读取各所述槽位对应的 槽位值;
将各所述槽位值相加并将相加后的和值作为当前计数结果。
可选地,所述MySQL计数器表中还设置有日期;所述基于MySQL计数 器表的高并发计数程序被所述处理器执行时,还用于实现以下步骤:
获取当前日期;
根据所述当前日期从对应日期的MySQL计数器表中读取各所述槽位对应 的槽位值。
可选地,所述开启与所述槽位数量相同的多个计数线程以使所述计数线 程从所述预设栈中取出所述槽位值的步骤之后,所述基于MySQL计数器表的 高并发计数程序被所述处理器执行时,还用于实现以下步骤:
检测所述预设栈是否为空;
若检测结果为是,则将所述计数线程从所述消息队列中取出的计数事件 再次存储至所述消息队列;
若检测结果为否,则执行所述从所述预设栈中读取所述槽位值的步骤。
此外,为实现上述目的,本发明还提供一种计算机可读存储介质,所述 计算机可读存储介质上存储有基于MySQL计数器表的高并发计数程序,所述 基于MySQL计数器表的高并发计数程序被处理器执行时实现如上所述的基于 MySQL计数器表的高并发计数方法的步骤。
相较于现有技术,本发明所提出的基于MySQL计数器表的高并发计数方 法、web服务器及计算机可读存储介质,对MySQL计数器表进行改进,设置 多个槽位并将多个槽位对应的多个槽位值存入预设栈,之后检测到计数事件 时,首先将所述计数事件存储至消息队列,然后开启与所述槽位数量相同的 多个计数线程以使各所述计数线程从所述消息队列中读取所述计数事件、从 所述预设栈中读取所述槽位值、将所述计数事件更新至所述槽位值、将已进 行计数的所述计数事件从所述消息队列中删除并将更新后的所述槽位值返回所述预设栈,本发明通过消息队列实现了将web应用计数操作与MySQL计数 器的计数操作进行解耦,通过设置多个槽位来对同一时刻的大量计数事件进 行并发的计数操作,其保证了MySQL计数器的计算操作不会发生阻塞,大大 提高了高并发计数时的效率。
附图说明
图1为本发明基于MySQL计数器表的高并发计数方法第一实施例的实施 流程示意图;
图2为本发明基于MySQL计数器表的高并发计数方法第二实施例的实施 流程示意图;
图3为本发明基于MySQL计数器表的高并发计数程序第一实施例的功能 模块示意图;
图4为本发明基于MySQL计数器表的高并发计数程序第二实施例的功能 模块示意图;
图5为本发明基于MySQL计数器表的高并发计数方法进行计数时一实施 例的示意图。
附图标记:
基于MySQL计数器表的高并发计数程序 400
计数器表设置模块 401
检测模块 402
消息队列模块 403
计数模块 404
空栈检测模块 405
消息队列写入模块 406
计数统计模块 407
流程步骤 S301-S304、S401-S408
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步 说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限 定本发明。
在后续的描述中,使用用于表示元件的诸如“模块”、“部件”或“单元” 的后缀仅为了有利于本发明的说明,其本身没有特定的意义。因此,“模块”、 “部件”或“单元”可以混合地使用。
Web(World Wide Web,也称WWW或万维网)是Internet上集文本、声 音、动画、视频等多种媒体信息于一身的信息服务系统,整个web系统由Web 服务器、浏览器(Browser)及通信协议等3部分组成。Web系统采用的通信 协议是超文本传输协议(HTTP,HyperTextTransfer Protocol),它可以传输任 意类型的数据对象,是Internet发布多媒体信息的主要协议。WWW中的信息 资源主要由一篇篇的网页为基本元素构成,所有网页采用超文本标记语言 (HTML,HyperText Markup Language)来编写,HTML对Web页的内容、格 式及Web页中的超链进行描述。Web页间采用超级文本(HyperText)的格式 互相链接。当鼠标的光标移到这些链接上时,光标形状变成一手掌状,点击 即可从这一网页跳转到另一网页上,这也就是所谓的超链。
Web服务器是指驻留于因特网上某种类型计算机的程序。现有的web服 务器经常需要对一些事件进行计数,而MySQL计数器表是一种web应用中常 用的计数器,其可以统计用户对网站的点击次数、文件下载数以及网站的新 增用户数等等。本发明基于MySQL计数器对web服务器上的高并发计数方法 进行改进。
首先,本发明提出一种基于MySQL计数器表的高并发计数方法,该基于 MySQL计数器表的高并发计数方法应用于web服务器。
如图1所示,是本发明基于MySQL计数器表的高并发计数方法第一实施 例的实施流程图。在本实施例中,根据不同的需求,图1所示的流程图中的 步骤的执行顺序可以改变,某些步骤可以省略。所述基于MySQL计数器表的 高并发计数方法包括:
步骤S301,在MySQL计数器表中设置多个槽位,且多个槽位对应的多个 槽位值存入预设栈。
现有技术中,web应用与MySQL计数器具有耦合性,web应用中的计数 事件只能串行的写入MySQL计数器表中,当web应用中同时产生多个计数事 件时,MySQL计数器的计数线程会发生阻塞。本实施例为了解决高并发计数 阻塞问题,对MySQL计数器表进行改进,在MySQL计数器表中设置多个槽 位,每一个槽位具有一个对应的槽位值,该多个槽位可以同时进行计数操作。 同时,在web应用层设计一个栈(Stack)结构,该栈结构用来存储当前可用 的槽位的槽位值,初始时,默认将所有槽位的槽位值都存储(push)进栈 (Stack)。具体的,MySQL计数器表的结构如下所示:
字段 类型 说明
day date 计数的日期
slot tinyint 计数的槽位
cnt int 计数的个数
utime timestamp 计数更新的时间
ctime timestamp 计数插入的时间
其中,字段day表示统计的时间维度(如每天);字段slot是统计时要更 新或者插入的槽位,其中对于首次无该槽位则是插入操作,否则是更新操作; 字段cnt是每个槽位对应的统计个数,即槽位值;字段utime和字段ctime分 别是该条记录更新时间和插入时间。
步骤S302,实时检测是否发生计数事件,若检测到计数事件,则执行步 骤S303,反之,继续检测是否发生计数事件。
具体的,计数事件可以为web应用中的点击事件、文件下载事件以及网 站新增用户事件等需要进行计数统计的事件。
步骤S303,将所述计数事件存储至消息队列。
本实施例中,当检测到计数事件后,不会直接将计数事件更新至MySQL 计数器表,而是将计数事件存储至消息队列。其中,所述消息队列为支持高 并发插入的消息队列,如Kafka消息队列,即当web应用中同时产生大量计 数事件时,大量计数事件可以以多路并行的方式插入该消息队列中。
步骤S304,开启与所述槽位数量相同的多个计数线程以使各所述计数线 程从所述消息队列中读取所述计数事件、从所述预设栈中取出所述槽位值、 将所述计数事件更新至所述槽位值、将已进行计数的所述计数事件从所述消 息队列中删除并将更新后的所述槽位值返回所述预设栈。
本实施例中,将计数事件插入消息队列后,会开启多个计数线程,然后 通过多个计数线程将计数事件更新至各个槽位(槽位值),其中计数线程的数 量与MySQL计数器表中槽位的数量相同。如假设MySQL计数器表中设置有 N个槽位,初始时刻会将N个槽位的槽位值(通常初始时刻的槽位值为0) 存入预设栈中,当检测到计数事件后,会开启N个计数线程,N个计数线程 可同时对消息队列中的计数事件进行计数操作。具体的,以其中一个计数线 程为例,该计数线程首先从消息队列中读取一个计数事件,然后从预设栈中 取出(pop)一个槽位值,然后将该槽位值的取值加1后再存入预设栈中,同 时由于该计数事件已经被统计了,因此将消息队列中该计数事件进行删除。 需要说明的是,当该计数线程从消息队列中读取计数事件后,其他计数线程 会从消息队列中读取剩余的计数事件并进行计数操作,从而可以实现多个计 数线程同时进行计数工作,大大提高了计数效率。请参考图5,图5为本发明 基于MySQL计数器表的高并发计数方法进行计数时一实施例的示意图,如图 5所示,消息队列X中存储有大量计数事件X1、X2…Xn,本发明MySQL计 数器表中设置有10个槽位A1、A2……A10,该10个槽位A1、A2……A10对 应的槽位值分别记为B1、B2……B10,初始化时预设栈Y中包括B1、B2……B10 这些数据,当对消息队列X中的计数事件进行计数时,开启10个计数线程, 每个计数线程从消息队列X中一次读取一个计数事件,并从预设栈中取出一 个槽位值,然后将槽位值加1后再推入预设栈,同时将消息队列中的计数事 件删除。其中,对槽位值进行更新时,相关的MySQL语句类似如下:
insert into daily_hit_counter(day,slot,cnt)
values(CURRENT_DATE,slotId,1)
on duplicate key update cnt=cnt+1;其中cnt为相应槽位的计数个数,即槽位值。
通过上述步骤S301至S304,本发明基于MySQL计数器表的高并发计数 方法对MySQL计数器表进行改进,设置多个槽位并将多个槽位对应的多个槽 位值存入预设栈,之后检测到计数事件时,首先将所述计数事件存储至消息 队列,然后开启与所述槽位数量相同的多个计数线程以使各所述计数线程从 所述消息队列中读取所述计数事件、从所述预设栈中读取所述槽位值、将所 述计数事件更新至所述槽位值、将已进行计数的所述计数事件从所述消息队 列中删除并将更新后的所述槽位值返回所述预设栈,本发明通过消息队列实 现了将web应用计数操作与MySQL计数器的计数操作进行解耦,通过设置多 个槽位来对同一时刻的大量计数事件进行并发的计数操作,其保证了MySQL 计数器的计算操作不会发生阻塞,大大提高了高并发计数时的效率。
进一步地,基于上述第一实施例,提出本发明基于MySQL计数器表的高 并发计数方法的第二实施例。如图2所示,是本发明基于MySQL计数器表的 高并发计数方法第二实施例的实施流程图。在本实施例中,根据不同的需求, 图2所示的流程图中的步骤的执行顺序可以改变,某些步骤可以省略。所述 基于MySQL计数器表的高并发计数方法包括:
步骤S401,在MySQL计数器表中设置多个槽位,且多个槽位对应的多个 槽位值存入预设栈。现有技术中,web应用与MySQL计数器具有耦合性,web 应用中的计数事件只能串行的写入MySQL计数器表中,当web应用中同时产 生多个计数事件时,MySQL计数器的计数线程会发生阻塞。本实施例为了解 决高并发计数阻塞问题,对MySQL计数器表进行改进,在MySQL计数器表 中设置多个槽位,每一个槽位具有一个对应的槽位值,该多个槽位可以同时 进行计数操作。同时,在web应用层设计一个栈(Stack)结构,该栈结构用 来存储当前可用的槽位的槽位值,初始时,默认将所有槽位的槽位值都存储 (push)进栈(Stack)。
步骤S402,实时检测是否发生计数事件,若检测到计数事件,则执行步 骤S403,反之重复执行步骤S402。
步骤S403,将所述计数事件存储至消息队列。
步骤S404,开启与所述槽位数量相同的多个计数线程,所述计数线程从 所述消息队列中读取计数事件。
步骤S405,检测所述预设栈是否为空,若检测结果为是,则执行步骤S406, 反之若检测结果为否,则执行步骤S407。其中,预设栈为空表示当前MySQL 计时器表中没有可用的槽位,此时需要将计数事件丢回消息队列中。
步骤S406,将所述计数线程取出的所述计数事件再次存入所述消息队列。
步骤S407,从所述预设栈中读取所述槽位值,将所述计数事件更新至所 述槽位值、将已进行计数的所述计数事件从所述消息队列中删除并将更新后 的所述槽位值返回所述预设栈。本实施例中,将计数事件插入消息队列后, 会开启多个计数线程,然后通过多个计数线程将计数事件更新至各个槽位(槽 位值),其中计数线程的数量与MySQL计数器表中槽位的数量相同。如假设 MySQL计数器表中设置有N个槽位,初始时刻会将N个槽位的槽位值(通常 初始时刻的槽位值为0)存入预设栈中,当检测到计数事件后,会开启N个 计数线程,N个计数线程可同时对消息队列中的计数事件进行计数操作。具 体的,以其中一个计数线程为例,该计数线程首先从消息队列中读取一个计 数事件,然后从预设栈中取出(pop)一个槽位值,然后将该槽位值的取值加 1后再存入预设栈中,同时由于该计数事件已经被统计了,因此将消息队列中 该计数事件进行删除。需要说明的是,当该计数线程从消息队列中读取计数 事件后,其他计数线程会从消息队列中读取剩余的计数事件并进行计数操作, 从而可以实现多个计数线程同时进行计数工作,大大提高了计数效率。
步骤S408,统计当前计数结果时,从所述MySQL计数器表中读取各所述 槽位对应的槽位值,将各所述槽位值相加并将相加后的和值作为当前计数结 果。
具体的,当通过多个计数线程对多个槽位进行计数操作后,各个槽位对 应的槽位值之和即为计数事件的总数量,因此当需要统计当前计数结果时, 将各槽位值相加作为当前计数结果。优选的,统计计数结果通常是统计一个 时间段内web应用中发生的计数事件,由于MySQL计数器表中设置有日期, 因此统计当前计数结果时,其具体过程通常是:获取当前日期;根据所述当 前日期从对应日期的MySQL计数器表中读取各所述槽位对应的槽位值,然后 求和作为当前计数结果。
通过上述步骤S401至S408,本发明基于MySQL计数器表的高并发计数 方法通过消息队列将Web应用层计数操作与MySQL计数器的计数操作进行解 耦,利用消息队列支持高并发的插入、以及在MySQL计数器表中设置多个槽 位来执行同一时刻的计数操作,在Web应用层,通过预设栈存储MySQL计数 器表中的多个槽位值,并通过开启与槽位相对应的多个计数线程来保证 MySQL计数器的计数操作不会发生阻塞,最后,通过MySQL相应的聚合函数即可获取相应的计数结果,从而在高并发的环境下,实现了MySQL计数功能。
同时,本发明还提出一种web服务器,所述web服务器包括存储器、处 理器及存储在所述存储器上并可在所述处理器上运行的基于MySQL计数器表 的高并发计数程序400。
如图3所示,是本发明基于MySQL计数器表的高并发计数程序400第一 实施例的功能模块示意图。在本实施例中,所述基于MySQL计数器表的高并 发计数程序400可以被分割成一个或多个模块,所述一个或多个模块存储于所 述web服务器的存储器中,并由一个或多个处理器所执行,以完成本发明。 例如,在图3中,所述基于MySQL计数器表的高并发计数程序400可以被分 割成计数器表设置模块401、检测模块402、消息队列模块403以及计数模块 404。本发明所称的模块是指一种能够完成特定功能的一系列计算机程序指令 段,比计算机程序更适合于描述软件在所述web服务器中的执行过程。以下 将就上述各功能模块401-404的具体功能进行详细描述。其中:
所述计数器表设置模块401,用于在MySQL计数器表中设置多个槽位, 且多个槽位对应的多个槽位值存入预设栈。
现有技术中,web应用与MySQL计数器具有耦合性,web应用中的计数 事件只能串行的写入MySQL计数器表中,当web应用中同时产生多个计数事 件时,MySQL计数器的计数线程会发生阻塞。本实施例为了解决高并发计数 阻塞问题,对MySQL计数器表进行改进,在MySQL计数器表中设置多个槽 位,每一个槽位具有一个对应的槽位值,该多个槽位可以同时进行计数操作。 同时,在web应用层设计一个栈(Stack)结构,该栈结构用来存储当前可用 的槽位的槽位值,初始时,默认将所有槽位的槽位值都存储(push)进栈 (Stack)。具体的,MySQL计数器表的结构如下所示:
Figure BDA0001487084100000101
Figure BDA0001487084100000111
其中,字段day表示统计的时间维度(如每天);字段slot是统计时要更 新或者插入的槽位,其中对于首次无该槽位则是插入操作,否则是更新操作; 字段cnt是每个槽位对应的统计个数,即槽位值;字段utime和字段ctime分 别是该条记录更新时间和插入时间。
所述检测模块402,用于实时检测是否发生计数事件,若检测到计数事件, 则执行消息队列模块403,反之,继续检测是否发生计数事件。具体的,计数 事件可以为web应用中的点击事件、文件下载事件以及网站新增用户事件等 需要进行计数统计的事件。
所述消息队列模块403,用于将所述计数事件存储至消息队列。
本实施例中,当检测到计数事件后,不会直接将计数事件更新至MySQL 计数器表,而是将计数事件存储至消息队列。其中,所述消息队列为支持高 并发插入的消息队列,如Kafka消息队列,即当web应用中同时产生大量计 数事件时,大量计数事件可以以多路并行的方式插入该消息队列中。
所述计数模块404,用于开启与所述槽位数量相同的多个计数线程以使各 所述计数线程从所述消息队列中读取所述计数事件、从所述预设栈中取出所 述槽位值、将所述计数事件更新至所述槽位值、将已进行计数的所述计数事 件从所述消息队列中删除并将更新后的所述槽位值返回所述预设栈。
本实施例中,将计数事件插入消息队列后,会开启多个计数线程,然后 通过多个计数线程将计数事件更新至各个槽位(槽位值),其中计数线程的数 量与MySQL计数器表中槽位的数量相同。如假设MySQL计数器表中设置有 N个槽位,初始时刻会将N个槽位的槽位值(通常初始时刻的槽位值为0) 存入预设栈中,当检测到计数事件后,会开启N个计数线程,N个计数线程 可同时对消息队列中的计数事件进行计数操作。具体的,以其中一个计数线 程为例,该计数线程首先从消息队列中读取一个计数事件,然后从预设栈中 取出(pop)一个槽位值,然后将该槽位值的取值加1后再存入预设栈中,同 时由于该计数事件已经被统计了,因此将消息队列中该计数事件进行删除。 需要说明的是,当该计数线程从消息队列中读取计数事件后,其他计数线程 会从消息队列中读取剩余的计数事件并进行计数操作,从而可以实现多个计 数线程同时进行计数工作,大大提高了计数效率。请参考图5,图5为本发明 基于MySQL计数器表的高并发计数方法进行计数时一实施例的示意图,如图 5所示,消息队列X中存储有大量计数事件X1、X2…Xn,本发明MySQL计 数器表中设置有10个槽位A1、A2……A10,该10个槽位A1、A2……A10对 应的槽位值分别记为B1、B2……B10,初始化时预设栈Y中包括B1、B2……B10 这些数据,当对消息队列X中的计数事件进行计数时,开启10个计数线程, 每个计数线程从消息队列X中一次读取一个计数事件,并从预设栈中取出一 个槽位值,然后将槽位值加1后再推入预设栈,同时将消息队列中的计数事 件删除。其中,对槽位值进行更新时,相关的MySQL语句类似如下:
insert into daily_hit_counter(day,slot,cnt)
values(CURRENT_DATE,slotId,1)
on duplicate key update cnt=cnt+1;其中cnt为相应槽位的计数个数,即槽位值。
通过上述模块401-404,本发明基于MySQL计数器表的高并发计数程序 对MySQL计数器表进行改进,设置多个槽位并将多个槽位对应的多个槽位值 存入预设栈,之后检测到计数事件时,首先将所述计数事件存储至消息队列, 然后开启与所述槽位数量相同的多个计数线程以使各所述计数线程从所述消 息队列中读取所述计数事件、从所述预设栈中读取所述槽位值、将所述计数 事件更新至所述槽位值、将已进行计数的所述计数事件从所述消息队列中删 除并将更新后的所述槽位值返回所述预设栈,本发明通过消息队列实现了将 web应用计数操作与MySQL计数器的计数操作进行解耦,通过设置多个槽位 来对同一时刻的大量计数事件进行并发的计数操作,其保证了MySQL计数器 的计算操作不会发生阻塞,大大提高了高并发计数时的效率。
进一步地,基于上述本发明基于MySQL计数器表的高并发计数程序400 的第一实施例,提出本发明基于MySQL计数器表的高并发计数程序400的第 二实施例。请参考图4,图4为本发明基于MySQL计数器表的高并发计数程 序400第二实施例的功能模块示意图,与第一实施例相比,本实施例中,基于 MySQL计数器表的高并发计数程序400还包括空栈检测模块405、消息队列写 入模块406以及计数统计模块407。本实施例中,各功能模块的说明如下:
所述空栈检测模块405,用于检测预设栈是否为空,若检测结果为是,则 执行消息队列写入模块406,反之若检测结果为否,则执行计数模块404。其 中,预设栈为空表示当前MySQL计时器表中没有可用的槽位,此时需要将计 数事件丢回消息队列中。
所述消息队列写入模块406,用于在所述空栈检测模块405的检测结果为 是时,将所述计数线程取出的所述计数事件再次存入所述消息队列。
所述计数统计模块407,用于在统计当前计数结果时,从所述MySQL计 数器表中读取各所述槽位对应的槽位值,将各所述槽位值相加并将相加后的 和值作为当前计数结果。具体的,当通过多个计数线程对多个槽位进行计数 操作后,各个槽位对应的槽位值之和即为计数事件的总数量,因此当需要统 计当前计数结果时,将各槽位值相加作为当前计数结果。优选的,统计计数 结果通常是统计一个时间段内web应用中发生的计数事件,由于MySQL计数 器表中设置有日期,因此统计当前计数结果时,其具体过程通常是:获取当 前日期;根据所述当前日期从对应日期的MySQL计数器表中读取各所述槽位 对应的槽位值,然后求和作为当前计数结果。
通过上述模块401至407,本发明基于MySQL计数器表的高并发计数程 序通过消息队列将Web应用层计数操作与MySQL计数器的计数操作进行解 耦,利用消息队列支持高并发的插入、以及在MySQL计数器表中设置多个槽 位来执行同一时刻的计数操作,在Web应用层,通过预设栈存储MySQL计数 器表中的多个槽位值,并通过开启与槽位相对应的多个计数线程来保证 MySQL计数器的计数操作不会发生阻塞,最后,通过MySQL相应的聚合函数即可获取相应的计数结果,从而在高并发的环境下,实现了MySQL计数功能。
此外,本发明还提供一种计算机可读存储介质,所述计算机可读存储介 质上存储有基于MySQL计数器表的高并发计数程序,所述基于MySQL计数 器表的高并发计数程序被处理器执行时实现图1至图2所述的基于MySQL计 数器表的高并发计数方法的步骤。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体 意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或 者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还 包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情 况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、 方法、物品或者装置中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述 实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通 过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的 技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体 现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光 盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务 器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是 利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间 接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

Claims (10)

1.一种基于MySQL计数器表的高并发计数方法,应用于web服务器,其特征在于,所述基于MySQL计数器表的高并发计数方法包括以下步骤:
在MySQL计数器表中设置多个槽位,且多个槽位对应的多个槽位值存入预设栈;
实时检测是否发生计数事件;
若检测到计数事件,将所述计数事件存储至消息队列;
开启与所述槽位数量相同的多个计数线程以使各所述计数线程从所述消息队列中读取所述计数事件、从所述预设栈中读取所述槽位值、将所述计数事件更新至所述槽位值、将已进行计数的所述计数事件从所述消息队列中删除并将更新后的所述槽位值返回所述预设栈。
2.如权利要求1所述的基于MySQL计数器表的高并发计数方法,其特征在于,所述基于MySQL计数器表的高并发计数方法还包括:
统计当前计数结果时,从所述MySQL计数器表中读取各所述槽位对应的槽位值;
将各所述槽位值相加并将相加后的和值作为当前计数结果。
3.如权利要求2所述的基于MySQL计数器表的高并发计数方法,其特征在于,所述MySQL计数器表中还设置有日期;
所述统计当前计数结果时,从所述MySQL计数器表中读取各所述槽位对应的槽位值的步骤具体为:
获取当前日期;
根据所述当前日期从对应日期的MySQL计数器表中读取各所述槽位对应的槽位值。
4.如权利要求2所述的基于MySQL计数器表的高并发计数方法,其特征在于,所述开启与所述槽位数量相同的多个计数线程以使所述计数线程从所述预设栈中取出所述槽位值的步骤之后还包括:
检测所述预设栈是否为空;
若检测结果为是,则将所述计数线程从所述消息队列中取出的计数事件再次存储至所述消息队列;
若检测结果为否,则执行所述从所述预设栈中读取所述槽位值的步骤。
5.如权利要求1所述的基于MySQL计数器表的高并发计数方法,其特征在于,所述将所述计数事件存储至消息队列的步骤具体为:
将所述计数事件并发存储至所述消息队列。
6.一种web服务器,其特征在于,所述web服务器包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的基于MySQL计数器表的高并发计数程序,所述基于MySQL计数器表的高并发计数程序被所述处理器执行时实现如下步骤:
在MySQL计数器表中设置多个槽位,且多个槽位对应的多个槽位值存入预设栈;
实时检测是否发生计数事件;
若检测到计数事件,将所述计数事件存储至消息队列;
开启与所述槽位数量相同的多个计数线程以使各所述计数线程从所述消息队列中读取所述计数事件、从所述预设栈中读取所述槽位值、将所述计数事件更新至所述槽位值、将已进行计数的所述计数事件从所述消息队列中删除并将更新后的所述槽位值返回所述预设栈。
7.如权利要求6所述的web服务器,其特征在于,所述基于MySQL计数器表的高并发计数程序被所述处理器执行时,还用于实现以下步骤:
统计当前计数结果时,从所述MySQL计数器表中读取各所述槽位对应的槽位值;
将各所述槽位值相加并将相加后的和值作为当前计数结果。
8.如权利要求7所述的web服务器,其特征在于,所述MySQL计数器表中还设置有日期;所述基于MySQL计数器表的高并发计数程序被所述处理器执行时,还用于实现以下步骤:
获取当前日期;
根据所述当前日期从对应日期的MySQL计数器表中读取各所述槽位对应的槽位值。
9.如权利要求6所述的web服务器,其特征在于,所述开启与所述槽位数量相同的多个计数线程以使所述计数线程从所述预设栈中取出所述槽位值的步骤之后,所述基于MySQL计数器表的高并发计数程序被所述处理器执行时,还用于实现以下步骤:
检测所述预设栈是否为空;
若检测结果为是,则将所述计数线程从所述消息队列中取出的计数事件再次存储至所述消息队列;
若检测结果为否,则执行所述从所述预设栈中读取所述槽位值的步骤。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有基于MySQL计数器表的高并发计数程序,所述基于MySQL计数器表的高并发计数程序被处理器执行时实现如权利要求1至5中任一项所述的基于MySQL计数器表的高并发计数方法的步骤。
CN201711225004.XA 2017-11-29 2017-11-29 基于MySQL计数器表的高并发计数方法及web服务器 Active CN107862082B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201711225004.XA CN107862082B (zh) 2017-11-29 2017-11-29 基于MySQL计数器表的高并发计数方法及web服务器

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201711225004.XA CN107862082B (zh) 2017-11-29 2017-11-29 基于MySQL计数器表的高并发计数方法及web服务器

Publications (2)

Publication Number Publication Date
CN107862082A CN107862082A (zh) 2018-03-30
CN107862082B true CN107862082B (zh) 2021-06-25

Family

ID=61704395

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201711225004.XA Active CN107862082B (zh) 2017-11-29 2017-11-29 基于MySQL计数器表的高并发计数方法及web服务器

Country Status (1)

Country Link
CN (1) CN107862082B (zh)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109343938A (zh) * 2018-09-07 2019-02-15 福建福诺移动通信技术有限公司 一种事件统计方法
CN111367694B (zh) * 2020-03-18 2024-01-26 北京奇艺世纪科技有限公司 事件处理方法、服务器及计算机存储介质
CN111464621B (zh) * 2020-03-30 2022-06-24 四川新网银行股份有限公司 分布式系统异步通信中消息发送与接收的数量检测方法

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20030064040A (ko) * 2002-01-25 2003-07-31 삼성전자주식회사 유니트 설정 및 데이터베이스 관리 장치
CN103064731A (zh) * 2012-12-26 2013-04-24 人民搜索网络股份公司 一种提高消息队列系统性能的装置及其方法
CN103268321A (zh) * 2013-04-19 2013-08-28 中国建设银行股份有限公司 高并发交易数据处理方法和装置
CN103914565A (zh) * 2014-04-21 2014-07-09 北京搜狐新媒体信息技术有限公司 一种向数据库插入数据的方法及装置
US9111078B2 (en) * 2006-11-10 2015-08-18 Bally Gaming, Inc. Package manager service in gaming system
CN105550188A (zh) * 2014-11-04 2016-05-04 阿里巴巴集团控股有限公司 一种数据文件处理的方法和装置
CN107251024A (zh) * 2015-02-26 2017-10-13 国际商业机器公司 用于诊断执行问题的数据库查询执行跟踪和数据生成

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7305697B2 (en) * 2001-02-02 2007-12-04 Opentv, Inc. Service gateway for interactive television
US20150005075A1 (en) * 2013-06-27 2015-01-01 Sports Gamet International LLC Stack Roster Fantasy Sports Game and Platform

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20030064040A (ko) * 2002-01-25 2003-07-31 삼성전자주식회사 유니트 설정 및 데이터베이스 관리 장치
US9111078B2 (en) * 2006-11-10 2015-08-18 Bally Gaming, Inc. Package manager service in gaming system
CN103064731A (zh) * 2012-12-26 2013-04-24 人民搜索网络股份公司 一种提高消息队列系统性能的装置及其方法
CN103268321A (zh) * 2013-04-19 2013-08-28 中国建设银行股份有限公司 高并发交易数据处理方法和装置
CN103914565A (zh) * 2014-04-21 2014-07-09 北京搜狐新媒体信息技术有限公司 一种向数据库插入数据的方法及装置
CN105550188A (zh) * 2014-11-04 2016-05-04 阿里巴巴集团控股有限公司 一种数据文件处理的方法和装置
CN107251024A (zh) * 2015-02-26 2017-10-13 国际商业机器公司 用于诊断执行问题的数据库查询执行跟踪和数据生成

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
"基于Node.js 高并发web系统的研究与应用";陈瑶;《中国优秀硕士学位论文全文数据库信息科技辑》;20160315;I139-514 *

Also Published As

Publication number Publication date
CN107862082A (zh) 2018-03-30

Similar Documents

Publication Publication Date Title
US9467460B1 (en) Modularized database architecture using vertical partitioning for a state machine
US9898517B2 (en) Declarative synchronization of shared data
CN108366096A (zh) 一种信息订阅方法、终端及计算机可读存储介质
US11474990B2 (en) Priority queue for exclusive locks
KR101963917B1 (ko) 가장 최근에 사용된 문서 목록들의 자동 동기화 기법
US20130066818A1 (en) Automatic Crowd Sourcing for Machine Learning in Information Extraction
US20140359029A1 (en) Message index subdivided based on time intervals
CN107862082B (zh) 基于MySQL计数器表的高并发计数方法及web服务器
US10963447B2 (en) Automatic lock removal method for scalable synchronization in dynamic data structures
CN111666490A (zh) 基于kafka的信息推送方法、装置、设备及存储介质
US9069566B1 (en) Implementation of a multiple writer single reader queue in a lock free and a contention free manner
KR20130126930A (ko) 텍스트 메시지를 사용하는 스프레드시트와의 상호작용
US20140067823A1 (en) Textual Search for Numerical Properties
WO2020207022A1 (zh) 基于Scrapy的数据爬取方法、系统、终端设备及存储介质
CN106326129A (zh) 一种程序异常信息生成方法及装置
US20130185536A1 (en) Hash-based managing of storage identifiers
US20070261037A1 (en) Methods and systems for displaying multiple unique dynamic messages on a user interface
CN111046106A (zh) 缓存数据同步方法、装置、设备及介质
US9275023B2 (en) Methods for further adapting XSL to HTML document transformations and devices thereof
WO2020192663A1 (zh) 一种数据管理方法及相关设备
CN102779076B (zh) 一种浏览器中进程间通信的方法和装置
CN109165259B (zh) 基于网络附属存储的索引表更新方法、处理器及存储装置
CN110795920A (zh) 一种文档生成方法及设备
WO2022179377A1 (zh) 一种raid 5校验值的更新方法、装置和介质
US9659041B2 (en) Model for capturing audit trail data with reduced probability of loss of critical data

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant