CN113094413B - 基于队列的数据统计方法、装置、计算机设备及存储介质 - Google Patents
基于队列的数据统计方法、装置、计算机设备及存储介质 Download PDFInfo
- Publication number
- CN113094413B CN113094413B CN202110479321.4A CN202110479321A CN113094413B CN 113094413 B CN113094413 B CN 113094413B CN 202110479321 A CN202110479321 A CN 202110479321A CN 113094413 B CN113094413 B CN 113094413B
- Authority
- CN
- China
- Prior art keywords
- order
- queue
- state
- data
- dequeue
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2458—Special types of queries, e.g. statistical queries, fuzzy queries or distributed queries
- G06F16/2462—Approximate or statistical queries
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/526—Mutual exclusion algorithms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06Q—INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
- G06Q30/00—Commerce
- G06Q30/02—Marketing; Price estimation or determination; Fundraising
- G06Q30/0201—Market modelling; Market analysis; Collecting market data
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- Business, Economics & Management (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Finance (AREA)
- Data Mining & Analysis (AREA)
- General Engineering & Computer Science (AREA)
- Strategic Management (AREA)
- Accounting & Taxation (AREA)
- Development Economics (AREA)
- Databases & Information Systems (AREA)
- Computational Linguistics (AREA)
- Probability & Statistics with Applications (AREA)
- Entrepreneurship & Innovation (AREA)
- Mathematical Physics (AREA)
- Fuzzy Systems (AREA)
- Game Theory and Decision Science (AREA)
- Economics (AREA)
- Marketing (AREA)
- General Business, Economics & Management (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请涉及数据处理技术领域,揭露一种基于队列的数据统计方法、装置、计算机设备及存储介质,其中方法包括将获取的待统计订单数据封装成Java对象,并将Java对象放入队列的队尾中,若监测到队列中存在元素的订单状态发生改变,则将改变订单状态后的元素重新放入队列的队尾中,根据预设出队时间,从队列头依次取出元素,得到出队元素;在预设时间间隔内,识别出每个出队元素的存储信息,并根据存储信息进行数据统计,得到订单状态的数据统计结果;当达到预设时间间隔时,获取目标统计结果。本申请还涉及区块链技术,待统计订单数据存储于区块链中。本申请通过对每个订单状态下的订单信息进行数据统计,有利于提高数据统计的准确率。
Description
技术领域
本申请涉及数据处理技术领域,尤其涉及一种基于队列的数据统计方法、装置、计算机设备及存储介质。
背景技术
数据统计是很多系统的核心业务,然而数据统计又是一种非常耗费CPU资源的操作,现有的数据统计方式都是采用定时跑批的方式来统计数据,并将统计好的数据归档存储,查询时直接查询归档表即可。
然而这种数据统计方式由于是通过定时跑批的方式来统计数据,并没有考虑到数据的状态发生变化,从而容易导致对同一个数据重复进行统计,进而导致数据统计的准确率较低。现亟需一种能够提高数据统计的准确率的方法。
发明内容
本申请实施例的目的在于提出一种基于队列的数据统计方法、装置、计算机设备及存储介质,以提高数据统计的准确率。
为了解决上述技术问题,本申请实施例提供一种基于队列的数据统计方法,包括:
获取待统计订单数据;
将所述待统计订单数据封装成Java对象,并依次将所述Java对象放入队列的队尾中,记录每个所述Java对象的入队时间;
若监测到所述队列中存在元素的订单当前状态发生改变,则将改变订单当前状态后的元素重新放入所述队列的队尾中,其中,一个所述Java对象对应一个所述元素,一个所述元素对应一个所述待统计订单数据;
根据预设出队时间,从队列头依次取出所述元素,得到出队元素;
在预设时间间隔内,读取出每个所述出队元素的存储信息,若订单上次状态以及统计时间为空,则将订单当前状态对应的数据统计结果加1,其中,所述存储信息包括订单状态和统计时间,所述订单状态包括订单当前状态和订单上次状态;
若所述订单上次状态和所述统计时间不为空,则根据所述订单上次状态和所述统计时间,定位到所述订单上次状态对应数据统计结果,并将所述数据统计结果减1,并将所述订单状态对应的数据统计结果加1
当达到所述预设时间间隔时,获取当前每个所述订单状态对应的数据统计结果,并将每个所述订单状态对应的数据统计结果作为目标统计结果。
为了解决上述技术问题,本申请实施例提供一种基于队列的数据统计装置,包括:
订单数据获取模块,用于获取待统计订单数据;
订单数据入队模块,用于将所述待统计订单数据封装成Java对象,并依次将所述Java对象放入队列的队尾中,记录每个所述Java对象的入队时间;
订单状态改变模块,用于若监测到所述队列中存在元素的订单当前状态发生改变,则将改变订单当前状态后的元素重新放入所述队列的队尾中,其中,一个所述Java对象对应一个所述元素,一个所述元素对应一个所述待统计订单数据;
出队元素获取模块,用于根据预设出队时间,从队列头依次取出所述元素,得到出队元素;
第一数据统计模块,用于在预设时间间隔内,读取出每个所述出队元素的存储信息,若订单上次状态以及统计时间为空,则将订单当前状态对应的数据统计结果加1,其中,所述存储信息包括订单状态和统计时间,所述订单状态包括订单当前状态和订单上次状态;
第二数据统计模块,用于若所述订单上次状态和所述统计时间不为空,则根据所述订单上次状态和所述统计时间,定位到所述订单上次状态对应数据统计结果,并将所述数据统计结果减1,并将所述订单状态对应的数据统计结果加1;
目标统计结果模块,用于当达到所述预设时间间隔时,获取当前每个所述订单状态对应的数据统计结果,并将每个所述订单状态对应的数据统计结果作为目标统计结果。
为解决上述技术问题,本发明采用的一个技术方案是:提供一种计算机设备,包括,一个或多个处理器;存储器,用于存储一个或多个程序,使得一个或多个处理器实现上述任意一项所述的基于队列的数据统计方法。
为解决上述技术问题,本发明采用的一个技术方案是:一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述任意一项所述的基于队列的数据统计方法。
本发明实施例提供了一种基于队列的数据统计方法、装置、计算机设备及存储介质。本发明实施例通过将待统计订单数据封装成Java对象放入队列之中,并监控每个订单数据的订单状态,当其订单状态发生改变时,改变状态的订单重新生成并入队,并且在队列头依次将元素出队,同时根据出队元素的存储信息,对每个订单状态下的订单信息进行数据统计,避免对同一订单数据进行重复统计,而且由于订单数据的订单状态发生改变时会重新入队,避免数据统计遗漏,从而有利于提高数据统计的准确率。
附图说明
为了更清楚地说明本申请中的方案,下面将对本申请实施例描述中所需要使用的附图作一个简单介绍,显而易见地,下面描述中的附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例提供的基于队列的数据统计方法的应用环境示意图;
图2根据本申请实施例提供的基于队列的数据统计方法的一实现流程图;
图3是本申请实施例提供的基于队列的数据统计方法中子流程的一实现流程图;
图4是本申请实施例提供的基于队列的数据统计方法中子流程的又一实现流程图;
图5是本申请实施例提供的基于队列的数据统计方法中子流程的又一实现流程图;
图6是本申请实施例提供的基于队列的数据统计方法中子流程的又一实现流程图;
图7是本申请实施例提供的基于队列的数据统计方法中子流程的又一实现流程图;
图8是本申请实施例提供的基于队列的数据统计装置示意图;
图9是本申请实施例提供的计算机设备的示意图。
具体实施方式
除非另有定义,本文所使用的所有的技术和科学术语与属于本申请的技术领域的技术人员通常理解的含义相同;本文中在申请的说明书中所使用的术语只是为了描述具体的实施例的目的,不是旨在于限制本申请;本申请的说明书和权利要求书及上述附图说明中的术语“包括”和“具有”以及它们的任何变形,意图在于覆盖不排他的包含。本申请的说明书和权利要求书或上述附图中的术语“第一”、“第二”等是用于区别不同对象,而不是用于描述特定顺序。
在本文中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本申请的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域技术人员显式地和隐式地理解的是,本文所描述的实施例可以与其它实施例相结合。
为了使本技术领域的人员更好地理解本申请方案,下面将结合附图,对本申请实施例中的技术方案进行清楚、完整地描述。
下面结合附图和实施方式对本发明进行详细说明。
请参阅图1,系统架构100可以包括终端设备101、102、103,网络104和服务器105。网络104用以在终端设备101、102、103和服务器105之间提供通信链路的介质。网络104可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
用户可以使用终端设备101、102、103通过网络104与服务器105交互,以接收或发送消息等。终端设备101、102、103上可以安装有各种通讯客户端应用,例如网页浏览器应用、搜索类应用、即时通信工具等。
终端设备101、102、103可以是具有显示屏并且支持网页浏览的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机和台式计算机等等。
服务器105可以是提供各种服务的服务器,例如对终端设备101、102、103上显示的页面提供支持的后台服务器。
需要说明的是,本申请实施例所提供的基于队列的数据统计方法一般由服务器执行,相应地,基于队列的数据统计装置一般配置于服务器中。
应该理解,图1中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。
请参阅图2,图2示出了基于队列的数据统计方法的一种具体实施方式。
需注意的是,若有实质上相同的结果,本发明的方法并不以图2所示的流程顺序为限,该方法包括如下步骤:
S1:获取待统计订单数据。
在本实施例中,为了更清楚的理解技术方案,下面对本申请所涉及的终端进行详细介绍。其中,本申请是在服务器的角度描述技术方案。
一是服务器,服务器能够通过存储在服务器中的数据库中获取待统计订单数据,也可以从外部连接的数据库获取待统计订单数据,亦可以获取从用户端输入的待统计订单数据。根据获取待统计订单数据的时间先后,服务器能够将待统计数据封装成Java对象形式,依次放入队列之中,从而进行数据的统计。例如,针对某一淘宝店铺的订单数据进行数据统计,统计该店铺里面商品的各个订单数据。
二是用户端,用户端可以接收服务器所发送订单数据统计结果,也可以通过向服务器输入订单数据,查看各个时刻的各个订单当前状态下的统计结果。
S2:将待统计订单数据封装成Java对象,并依次将Java对象放入队列的队尾中,记录每个Java对象的入队时间。
具体的,由于要将待统计订单数据放入到队列之中,所以需要将待统计订单数据封装成Java对象。本实施例的队列采用的是先进先出的阻塞队列(LinkedBlockingQueue),该队列能够在数据量较大时,能够控制队列并发影响。而传统的控制并发就是利用锁来控制,比如有一个线程要朝队列里放元素的时候,会将整个队列加锁,所以如果同一时间有程序去取元素也会被阻塞,如此在高并发场景也会影响到执行效率,故而此处可以进一步优化利用双锁机制来提升并发效率,该先进先出的阻塞队列就是具备双锁机制的队列。其中,双锁机制的实现就是为了将放和取两个操作分离互不影响,在队列中加两把锁,一把takeLock,一把putLock,putLock只影响放操作,takeLock只影响取操作,这样,当一个线程往队列中放订单的时候,不会影响到另一个线程来队列中取订单进行统计,从而实现提升数据统计效率。
具体的,由于本申请实施例采用的是先进先出的阻塞队列,所以需要从队列的尾部进行依次放入数据,也即从队列尾依次放入数据。其中,先进先出的意思是指先放出队列的数据,优选被取出。而记录Java对象的入队时间,是为了获取其出队时间,从而便于数据统计。
需要说明的是,一个待统计订单数据对应封装成一个Java对象,一个Java对象对应一个元素,也即一个待统计订单数据对应一个元素。
请参阅图3,图3示出了步骤S2的一种具体实施方式,该实施例包括:
S21:将待统计订单数据封装成对应的Java对象。
S22:判断队列是否已满,得到第一判断结果。
进一步的,若第一判断结果为队列已满,则等待队列的元素出队,或者唤醒另一线程的队列,再将Java对象放入队列的队尾中。
S23:若第一判断结果为队列未满,则通过访问易变型变量,将Java对象依次放入队列的队尾中。
具体的,易变型变量是指volatile,该volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。在本实施例中,由于先进先出的阻塞队列的计数器count采用Atomic变量来更新,这样避免了同时操作2个锁来更新数据。而且对于同一个锁,一个线程释放后另一个线程获得锁后才能得到可见性,利用volatile的增强语义来保证的可见性,放操作会更新使用volatile修饰的count变量,之后如果有读线程进入,如果先访问volatile修饰的count变量,也就是说只要访问了volatile变量,那么之前在不同锁的线程修改的数据会强制刷新到主cache里面,这样读线程就能够读取了。所以在本实施例中,通过访问volatile变量,使得之前在不同锁的线程修改的数据会强制刷新到主cache里面,这样能够保证将Java对象放入队列的队尾中。
在本实施中,通过将待统计订单数据封装成对应的Java对象,再判断队列是否已满,得到第一判断结果,若第一判断结果为队列未满,则通过访问易变型变量,将Java对象依次放入队列的队尾中,实现将待统计订单数据依次放入队列之中,利用队列先进先出的特性,有利于对订单数据的统计,从而提高数据统计的准确率。
S3:若监测到队列中存在元素的订单当前状态发生改变,则将改变订单当前状态后的元素重新放入队列的队尾中,其中,一个Java对象对应一个元素,一个元素对应一个待统计订单数据。
具体的,订单有不同的订单当前状态,并且订单当前状态可以由一种订单当前状态改变成另一个订单当前状态。例如,某一商品订单当前状态包括:待下单、已下单以及已完成这三种状态,订单当前状态可以由“待下单”改变成“已下单”,“已下单”改变成“已完成”。当一个元素的订单当前状态由“待下单”改变成“已下单”,则生成一个订单当前状态为“已下单”的元素,并将该元素重新从队尾进行入队,并记录入队时间。
需要说明的是,在队列中的元素的订单当前状态发生改变后,订单当前状态改变前的元素在没有达到预设时间时,仍然处于队列之中。
请参阅图4,图4示出了步骤S3的一种具体实施方式,该实施例包括:
S31:若监测到队列中存在元素的订单当前状态发生改变,则将订单当前状态发生改变的元素作为基础元素。
具体的,订单当前状态是指订单当前所处于的状态。
S32:读取出基础元素的订单当前状态发生改变之前的状态,作为基础状态,并根据基础状态,将基础元素对应的订单上次状态进行更新。
具体的,订单上次状态是指订单上一次统计时的订单当前状态,若为订单上次状态为空,则该元素没有被统计过。队列中的元素的订单当前状态发生改变时,要将其订单是上次状态进行更新,以避免同一订单数据被重复统计。
S33:将基础元素重新放入队列的队尾中,并记录基础元素的入队时间。
具体的,在本申请实施例中,每个元素出队一次都会给统计一次,为了避免同一订单当前状态下的订单被重复统计,所以对基础元素的订单上次状态进行更新,并且更新后的基础元素将重新放入队列之中,并记录基础元素的入队时间,便于判断该元素的出队时间。例如,一个元素的订单当前状态为“待下单”,此时该元素的订单上次状态为“空”,当该元素的订单当前状态由“待下单”改变成“已下单”,则生成一个订单当前状态为“已下单”的元素,并且生成的元素的订单上次状态为“待下单”。
在本实施中,在队列中的元素的订单当前状态发生改变时,将该元素进行更新,并且重新入队,避免同一订单数据被重复统计,有利于提高数据统计的准确率。
请参阅图5,图5示出了步骤S3之后的一种具体实施方式,该实施例包括:
S3A:当监测到有新的待统计订单数据产生,则将新的待统计订单数据封装成新的Java对象。
具体的,当有新的待统计订单数据产生,则获取该新的待统计订单数据,并将其进行封装,得到新的Java对象。
S3B:将新的Java对象放入队列的队尾中,并记录新的Java对象的入队时间。
具体的,在将新的Java对象放入队列的队尾之前,需要判断队列是否为空,若队列为空,则将新的Java对象放入队列的队尾中,若队列已满,则等待队列的元素出队,或者唤醒另一线程的队列,再将Java对象放入队列的队尾中。
在本实施中,当监测到有新的待统计订单数据产生,则将新的待统计订单数据封装成新的Java对象,将新的Java对象放入队列的队尾中,并记录新的Java对象的入队时间,实现将某一时间段的订单数据放入到队列中,有利于对订单数据进行数据统计。
S4:根据预设出队时间,从队列头依次取出元素,得到出队元素。
具体的,上述步骤已经记录了每个元素的入队时间,并且入队时间越早的元素越靠近队列头,当元素的入队间隔达到预设出队时间,则将该元素从队列头取出,并将其作为出队元素。
需要说的是,预设时间根据实际情况进行设定,此处不做限定。在一具体实施例中,预设时间为1秒。
请参阅图6,图6示出了步骤S4的一种具体实施方式,该实施例包括:
S41:判断队列是否为空,得到第二判断结果。
具体的,若是第二判断结果为队列为空,说明此时队列中所有的元素均已出队,此时可以等到新的待统计订单数据生成,或是出队元素的订单当前状态发生改变,从而有新的元素入队。
S42:若第二判断结果为队列不为空,则统计队列中处于队列头对应元素的入队间隔。
其中,入队间隔是指当前时间减去入队时间。
S43:当入队间隔达到预设出队时间时,则通过访问易变型变量,从队列头依次取出元素,得到出队元素。
具体的,当入队间隔达到预设出队时间时,通过访问易变型变量,也即访问volatile变量,使得之前在不同锁的线程修改的数据会强制刷新到主cache里面,这样能够将Java对象从队列头依次取出元素。
在本实施中,当队列不为空时,统计队列中处于队列头对应元素的入队间隔,当入队间隔达到预设出队时间时,则通过访问易变型变量,从队列头依次取出元素,得到出队元素,实现从队列头依次取出元素,便于对待统计订单数据进行统计。
请参阅图7,图7示出了步骤S4之后的一种具体实施方式,该实施例包括:
S4A:当监测到出队元素的订单当前状态发生改变时,则将获取出队元素的订单当前状态发生改变之前的订单当前状态,作为改变状态。
具体的,已经出队的元素在订单当前状态发生改变时需要重新入队,所以需要获取出队元素的订单当前状态发生改变之前的订单当前状态,便于对该元素的订单上次状态进行更新。
S4B:根据改变状态对出队元素的订单上次状态进行更新,得到更新后的出队元素。
具体的,通过改变状态对出队元素的订单上次状态进行更新,避免对同一订单数据进行重复统计。
S4C:将更新后的出队元素重新放入队列的队尾中,并记录更新后的出队元素的入队时间。
具体的,将更新后的出队元素重新放入队列的队尾中之前,需要判断队列是否为空,若队列为空,则将更新后的出队元素放入队列的队尾中,若队列已满,则等待队列的元素出队,或者唤醒另一线程的队列,再将更新后的出队元素放入队列的队尾中。
在本实施中,当监测到出队元素的订单当前状态发生改变时,对该出队元素进行更新,并将其重新入队,便于对不同状态下的待统计订单数据进行数据统计。
S5:在预设时间间隔内,读取出每个出队元素的存储信息,若订单上次状态以及统计时间为空,则将订单当前状态对应的数据统计结果加1,其中,存储信息包括订单状态和统计时间,订单状态包括订单当前状态和订单上次状态。
具体的,由于需要对某一时间段内订单数据的统计,所以在预设时间间隔内,要对出队元素进行数据统计,所以要识别出每个出队元素的存储信息,存储信息包括订单上次状态、统计时间以及订单当前状态。并根据存储信息进行数据统计,得到每个订单状态对应的数据统计结果。
需要说明的是,预设时间间隔应当比预设出队时间长,且预设时间间隔根据实际情况进行设定,此处不做限定。在一具体实施例中,预设时间间隔为24小时。
具体的,在预设时间间隔内,识别出每个出队元素的存储信息,并判断订单上次状态以及统计时间是否为空。若判断订单上次状态以及统计时间为空,则将订单当前状态对应的数据统计结果加1。
由于每一次元素出队时,都会生成新的订单上次状态和统计时间,所以通过判断统计时间以及订单上次状态是否为空,从而进行不同的数据统计。
具体的,若判断订单上次状态和统计时间为空,说明该元素是首次出队,之前还没被数据统计过,则只需要将该元素的订单当前状态对应的数据统计结果加1,即可完成对该出队元素的数据统计。例如,一个出队元素的订单上次状态为“空”,统计时间也为“空”,而其订单当前状态为“待下单”,而之前待下单的数据统计结果为10,则待下单的数据统计结果加1后,变成待下单的数据统计结果为11。
S6:若订单上次状态和统计时间不为空,则根据订单上次状态和统计时间,定位到订单上次状态对应数据统计结果,并将数据统计结果减1,并将订单状态对应的数据统计结果加1。
具体的,由于每个元素出队一次都会给统计一次,为了避免同一订单当前状态下的订单被重复统计,所以当订单上次状态和统计时间不为空时,说明该元素之前有出队记录,也即该元素已经被数据统计过一次了。所以需要根据统计时间和订单上次状态,定位到订单上次状态对应数据统计结果,并将该数据统计结果减1,同时将订单当前状态对应的数据统计结果加1。例如,一个出队元素的订单上次状态为“已下单”,统计时间也为“11:00”,而其订单当前状态为“已完成”,则根据统计时间和订单上次状态,定位到订单上次状态对应数据统计结果,也即已下单的数据统计结果,若之前的已下单的数据统计结果为11,将其数据统计结果减1后,此时的已下单的数据统计结果为10,而之前已完成的数据统计结果为9,则已完成的数据统计结果加1后,变成已完成的数据统计结果为10。
S7:当达到预设时间间隔时,获取当前每个订单状态对应的数据统计结果,并将每个订单状态对应的数据统计结果作为目标统计结果。
具体的,当达到预设时间间隔时,则获取当前每个订单状态对应的数据统计结果,并将每个订单状态对应的数据统计结果作为目标统计结果。例如,在到达预设时间间隔时,每个订单状态对应的数据统计结果分别为待下单的数据统计结果为10,已下单的数据统计结果为30,已完成的数据统计结果为20,所以将这些结果作为目标统计结果。
本实施例中,通过将待统计订单数据封装成Java对象放入队列之中,并监控每个订单数据的订单当前状态,当其订单当前状态发生改变时,改变的订单重新生成并入队,并且在队列头依次将元素出队,对出队元素进行数据统计,同时根据出队元素的订单上次状态和统计时间,将之前统计过的数据记录进行相应的修改,使得避免对同一个订单数据进行重复记录,有利于提高数据记录的准确率,同时根据队列尾入队,队列头出队,便于逐个对订单数据进行统计,避免订单被遗漏统计;本申请还通过设计队列的双锁机制,达到读写数据分离的效果,提高统计效率。
需要强调的是,为进一步保证上述待统计订单数据的私密和安全性,上述待统计订单数据还可以存储于一区块链的节点中。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,该计算机程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,前述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)等非易失性存储介质,或随机存储记忆体(Random Access Memory,RAM)等。
请参考图8,作为对上述图2所示方法的实现,本申请提供了一种基于队列的数据统计装置的一个实施例,该装置实施例与图2所示的方法实施例相对应,该装置具体可以应用于各种电子设备中。
如图8所示,本实施例的基于队列的数据统计装置包括:订单数据获取模块71、订单数据入队模块72、订单状态改变模块73、出队元素获取模块74、第一数据统计模块75、第二数据统计模块76以及目标统计结果模块77,其中:
订单数据获取模块71,用于获取待统计订单数据;
订单数据入队模块72,用于将待统计订单数据封装成Java对象,并依次将Java对象放入队列的队尾中,记录每个Java对象的入队时间;
订单状态改变模块73,用于若监测到队列中存在元素的订单当前状态发生改变,则将改变订单当前状态后的元素重新放入队列的队尾中,其中,一个Java对象对应一个元素,一个元素对应一个待统计订单数据;
出队元素获取模块74,用于根据预设出队时间,从队列头依次取出元素,得到出队元素;
第一数据统计模块75,用于在预设时间间隔内,读取出每个出队元素的存储信息,若订单上次状态以及统计时间为空,则将订单当前状态对应的数据统计结果加1,其中,存储信息包括订单状态和统计时间,订单状态包括订单当前状态和订单上次状态;
第二数据统计模块76,用于若订单上次状态和统计时间不为空,则根据订单上次状态和统计时间,定位到订单上次状态对应数据统计结果,并将数据统计结果减1,并将订单状态对应的数据统计结果加1;
目标统计结果模块77,用于当达到预设时间间隔时,获取当前每个订单状态对应的数据统计结果,并将每个订单状态对应的数据统计结果作为目标统计结果。
进一步的,订单数据入队模块72包括:
订单数据封装单元,用于将待统计订单数据封装成对应的Java对象;
第一判断结果获取单元,用于判断队列是否已满,得到第一判断结果;
Java对象入队单元,用于若第一判断结果为队列未满,则通过访问易变型变量,将Java对象依次放入队列的队尾中。
进一步的,订单状态改变模块73包括:
基础元素获取单元,用于若监测到队列中存在元素的订单当前状态发生改变,则将订单当前状态发生改变的元素作为基础元素;
状态更新单元,用于读取出基础元素的订单当前状态发生改变之前的状态,作为基础状态,并根据基础状态,将基础元素对应的订单上次状态进行更新;
基础元素入队单元,用于将基础元素重新放入队列的队尾中,并记录基础元素的入队时间。
进一步的,在订单状态改变模块73之后,该基于队列的数据统计装置还包括:
新的Java对象生成模块,用于当监测到有新的待统计订单数据产生,则将新的待统计订单数据封装成新的Java对象;
新的Java对象入队模块,用于将新的Java对象放入队列的队尾中,并记录新的Java对象的入队时间。
进一步的,出队元素获取模块74包括:
第二判断结果获取单元,用于判断队列是否为空,得到第二判断结果;
入队间隔统计单元,用于若第二判断结果为队列不为空,则统计队列中处于队列头对应元素的入队间隔;
出队元素获取单元,用于当入队间隔达到预设出队时间时,则通过访问易变型变量,从队列头依次取出元素,得到出队元素。
进一步的,在出队元素获取模块74之后,该基于队列的数据统计装置还包括包括:
改变状态获取模块,用于当监测到出队元素的订单当前状态发生改变时,则将获取出队元素的订单当前状态发生改变之前的订单当前状态,作为改变状态;
状态更新模块,用于根据改变状态对出队元素的订单上次状态进行更新,得到更新后的出队元素;
出队元素重新入队模块,用于将更新后的出队元素重新放入队列的队尾中,并记录更新后的出队元素的入队时间。
需要强调的是,为进一步保证上述待统计订单数据的私密和安全性,上述待统计订单数据还可以存储于一区块链的节点中。
为解决上述技术问题,本申请实施例还提供计算机设备。具体请参阅图9,图9为本实施例计算机设备基本结构框图。
计算机设备8包括通过系统总线相互通信连接存储器81、处理器82、网络接口83。需要指出的是,图中仅示出了具有三种组件存储器81、处理器82、网络接口83的计算机设备8,但是应理解的是,并不要求实施所有示出的组件,可以替代的实施更多或者更少的组件。其中,本技术领域技术人员可以理解,这里的计算机设备是一种能够按照事先设定或存储的指令,自动进行数值计算和/或信息处理的设备,其硬件包括但不限于微处理器、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程门阵列(Field-Programmable Gate Array,FPGA)、数字处理器(Digital Signal Processor,DSP)、嵌入式设备等。
计算机设备可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。计算机设备可以与用户通过键盘、鼠标、遥控器、触摸板或声控设备等方式进行人机交互。
存储器81至少包括一种类型的可读存储介质,可读存储介质包括闪存、硬盘、多媒体卡、卡型存储器(例如,SD或DX存储器等)、随机访问存储器(RAM)、静态随机访问存储器(SRAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、可编程只读存储器(PROM)、磁性存储器、磁盘、光盘等。在一些实施例中,存储器81可以是计算机设备8的内部存储单元,例如该计算机设备8的硬盘或内存。在另一些实施例中,存储器81也可以是计算机设备8的外部存储设备,例如该计算机设备8上配备的插接式硬盘,智能存储卡(SmartMedia Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)等。当然,存储器81还可以既包括计算机设备8的内部存储单元也包括其外部存储设备。本实施例中,存储器81通常用于存储安装于计算机设备8的操作系统和各类应用软件,例如基于队列的数据统计方法的程序代码等。此外,存储器81还可以用于暂时地存储已经输出或者将要输出的各类数据。
处理器82在一些实施例中可以是中央处理器(Central Processing Unit,CPU)、控制器、微控制器、微处理器、或其他数据处理芯片。该处理器82通常用于控制计算机设备8的总体操作。本实施例中,处理器82用于运行存储器81中存储的程序代码或者处理数据,例如运行上述基于队列的数据统计方法的程序代码,以实现基于队列的数据统计方法的各种实施例。
网络接口83可包括无线网络接口或有线网络接口,该网络接口83通常用于在计算机设备8与其他电子设备之间建立通信连接。
本申请还提供了另一种实施方式,即提供一种计算机可读存储介质,计算机可读存储介质存储有计算机程序,计算机程序可被至少一个处理器执行,以使至少一个处理器执行如上述的一种基于队列的数据统计方法的步骤。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本申请各个实施例的方法。
本发明所指区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链(Blockchain),本质上是一个去中心化的数据库,是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一批次网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。区块链可以包括区块链底层平台、平台产品服务层以及应用服务层等。
显然,以上所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例,附图中给出了本申请的较佳实施例,但并不限制本申请的专利范围。本申请可以以许多不同的形式来实现,相反地,提供这些实施例的目的是使对本申请的公开内容的理解更加透彻全面。尽管参照前述实施例对本申请进行了详细的说明,对于本领域的技术人员来而言,其依然可以对前述各具体实施方式所记载的技术方案进行修改,或者对其中部分技术特征进行等效替换。凡是利用本申请说明书及附图内容所做的等效结构,直接或间接运用在其他相关的技术领域,均同理在本申请专利保护范围之内。
Claims (9)
1.一种基于队列的数据统计方法,其特征在于,包括:
获取待统计订单数据;
将所述待统计订单数据封装成Java对象,并依次将所述Java对象放入队列的队尾中,记录每个所述Java对象的入队时间;
若监测到所述队列中存在元素的订单当前状态发生改变,则将改变订单当前状态后的元素重新放入所述队列的队尾中,其中,一个所述Java对象对应一个所述元素,一个所述元素对应一个所述待统计订单数据;
根据预设出队时间,从队列头依次取出所述元素,得到出队元素;
在预设时间间隔内,读取出每个所述出队元素的存储信息,若订单上次状态以及统计时间为空,则将订单当前状态对应的数据统计结果加1,其中,所述存储信息包括订单状态和所述统计时间,所述订单状态包括所述订单当前状态和所述订单上次状态;
若所述订单上次状态和所述统计时间不为空,则根据所述订单上次状态和所述统计时间,定位到所述订单上次状态对应数据统计结果,并将所述数据统计结果减1,并将所述订单状态对应的数据统计结果加1;
当达到所述预设时间间隔时,获取当前每个所述订单状态对应的数据统计结果,并将每个所述订单状态对应的数据统计结果作为目标统计结果;
所述若监测到所述队列中存在元素的订单当前状态发生改变,则将改变订单当前状态后的元素重新放入所述队列的队尾中,包括:
若监测到所述队列中存在所述元素的订单当前状态发生改变,则将所述订单当前状态发生改变的元素作为基础元素;
读取出所述基础元素的订单当前状态发生改变之前的状态,作为基础状态,并根据所述基础状态,将所述基础元素对应的订单上次状态进行更新,其中,订单上次状态是指订单上一次统计时的订单当前状态;
将所述基础元素重新放入所述队列的队尾之中,并记录所述基础元素的入队时间。
2.根据权利要求1所述的基于队列的数据统计方法,其特征在于,所述将所述待统计订单数据封装成Java对象,并依次将所述Java对象放入队列的队尾中,记录每个所述Java对象的入队时间,包括:
将所述待统计订单数据封装成对应的Java对象;
判断所述队列是否已满,得到第一判断结果;
若所述第一判断结果为所述队列未满,则通过访问易变型变量,将所述Java对象依次放入所述队列的队尾中。
3.根据权利要求1所述的基于队列的数据统计方法,其特征在于,在所述若监测到所述队列中存在元素的订单当前状态发生改变,则将改变订单当前状态后的元素重新放入所述队列的队尾中之后,所述方法还包括:
当监测到有新的待统计订单数据产生,则将所述新的待统计订单数据封装成新的Java对象;
将所述新的Java对象放入所述队列的队尾中,并记录所述新的Java对象的入队时间。
4.根据权利要求1所述的基于队列的数据统计方法,其特征在于,所述根据预设出队时间,从队列头依次取出所述元素,得到出队元素,包括:判断所述队列是否为空,得到第二判断结果;
若所述第二判断结果为所述队列不为空,则统计所述队列中处于队列头对应元素的入队间隔;
当所述入队间隔达到所述预设出队时间时,则通过访问易变型变量,从所述队列头依次取出元素,得到所述出队元素。
5.根据权利要求1至4任一项所述的基于队列的数据统计方法,其特征在于,在所述根据预设出队时间,从队列头依次取出所述元素之后,所述方法还包括:
当监测到所述出队元素的订单当前状态发生改变时,则将获取所述出队元素的订单当前状态发生改变之前的订单当前状态,作为改变状态;
根据所述改变状态对所述出队元素的订单上次状态进行更新,得到更新后的出队元素;
将所述更新后的出队元素重新放入所述队列的队尾中,并记录更新后的出队元素的入队时间。
6.一种基于队列的数据统计装置,其特征在于,包括:
订单数据获取模块,用于获取待统计订单数据;
订单数据入队模块,用于将所述待统计订单数据封装成Java对象,并依次将所述Java对象放入队列的队尾中,记录每个所述Java对象的入队时间;
订单状态改变模块,用于若监测到所述队列中存在元素的订单当前状态发生改变,则将改变订单当前状态后的元素重新放入所述队列的队尾中,其中,一个所述Java对象对应一个所述元素,一个所述元素对应一个所述待统计订单数据;
出队元素获取模块,用于根据预设出队时间,从队列头依次取出所述元素,得到出队元素;
第一数据统计模块,用于在预设时间间隔内,读取出每个所述出队元素的存储信息,若订单上次状态以及统计时间为空,则将订单当前状态对应的数据统计结果加1,其中,所述存储信息包括订单状态和所述统计时间,所述订单状态包括所述订单当前状态和所述订单上次状态;
第二数据统计模块,用于若所述订单上次状态和所述统计时间不为空,则根据所述订单上次状态和所述统计时间,定位到所述订单上次状态对应数据统计结果,并将所述数据统计结果减1,并将所述订单状态对应的数据统计结果加1;
目标统计结果模块,用于当达到所述预设时间间隔时,获取当前每个所述订单状态对应的数据统计结果,并将每个所述订单状态对应的数据统计结果作为目标统计结果;
所述订单状态改变模块包括:
基础元素获取单元,用于若监测到所述队列中存在所述元素的订单当前状态发生改变,则将所述订单当前状态发生改变的元素作为基础元素;
状态更新单元,用于读取出所述基础元素的订单当前状态发生改变之前的状态,作为基础状态,并根据所述基础状态,将所述基础元素对应的订单上次状态进行更新,其中,订单上次状态是指订单上一次统计时的订单当前状态;
基础元素入队单元,用于将所述基础元素重新放入所述队列的队尾之中,并记录所述基础元素的入队时间。
7.根据权利要求6所述的基于队列的数据统计装置,其特征在于,所述订单数据入队模块包括:
订单数据封装单元,用于将所述待统计订单数据封装成对应的Java对象;
第一判断结果获取单元,用于判断所述队列是否已满,得到第一判断结果;
Java对象入队单元,用于若所述第一判断结果为所述队列未满,则通过访问易变型变量,将所述Java对象依次放入所述队列的队尾中。
8.一种计算机设备,其特征在于,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器执行所述计算机程序时实现如权利要求1至5中任一项所述的基于队列的数据统计方法。
9.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至5中任一项所述的基于队列的数据统计方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110479321.4A CN113094413B (zh) | 2021-04-30 | 2021-04-30 | 基于队列的数据统计方法、装置、计算机设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110479321.4A CN113094413B (zh) | 2021-04-30 | 2021-04-30 | 基于队列的数据统计方法、装置、计算机设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113094413A CN113094413A (zh) | 2021-07-09 |
CN113094413B true CN113094413B (zh) | 2023-07-25 |
Family
ID=76680937
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110479321.4A Active CN113094413B (zh) | 2021-04-30 | 2021-04-30 | 基于队列的数据统计方法、装置、计算机设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113094413B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107767236A (zh) * | 2017-11-14 | 2018-03-06 | 北京小度信息科技有限公司 | 一种订单推送方法、装置、服务器和计算机可读存储介质 |
CN110019258A (zh) * | 2017-09-12 | 2019-07-16 | 北京京东尚科信息技术有限公司 | 处理订单数据的方法和装置 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060294058A1 (en) * | 2005-06-28 | 2006-12-28 | Microsoft Corporation | System and method for an asynchronous queue in a database management system |
US10262377B2 (en) * | 2013-09-13 | 2019-04-16 | Mace Engineering Group Pty Ltd. | Sales order data collection and management system |
CN105719143A (zh) * | 2014-12-01 | 2016-06-29 | 阿里巴巴集团控股有限公司 | 数据核对方法及装置 |
CN108804237A (zh) * | 2017-05-05 | 2018-11-13 | 北京京东尚科信息技术有限公司 | 数据实时统计方法、装置、存储介质和电子设备 |
CN107872349B (zh) * | 2017-10-20 | 2020-11-27 | 深圳市敢为软件技术有限公司 | 实时快照统计方法、装置及可读存储介质 |
-
2021
- 2021-04-30 CN CN202110479321.4A patent/CN113094413B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110019258A (zh) * | 2017-09-12 | 2019-07-16 | 北京京东尚科信息技术有限公司 | 处理订单数据的方法和装置 |
CN107767236A (zh) * | 2017-11-14 | 2018-03-06 | 北京小度信息科技有限公司 | 一种订单推送方法、装置、服务器和计算机可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN113094413A (zh) | 2021-07-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP3073382B1 (en) | A multi-reader lock-free ring buffer | |
US9274798B2 (en) | Multi-threaded logging | |
CN110865888A (zh) | 一种资源加载方法、装置、服务器及存储介质 | |
US20180024929A1 (en) | Managing a prefetch queue based on priority indications of prefetch requests | |
US8041821B2 (en) | Connection pool management | |
CN111475516A (zh) | 分布式锁的调用方法、装置、计算机设备及存储介质 | |
US9246836B2 (en) | Single producer, single consumer lockless FIFO/LIFO queue | |
EP2758869A1 (en) | Processor configured to perform transactional memory operations | |
CN111813517B (zh) | 任务队列的分配方法、装置、计算机设备及介质 | |
CN109842621A (zh) | 一种减少token存储数量的方法及终端 | |
CN111176850B (zh) | 一种数据池的构建方法、装置、服务器及介质 | |
CN114564294A (zh) | 智能服务编排方法、装置、计算机设备及存储介质 | |
CN115455058A (zh) | 缓存数据的处理方法、装置、计算机设备及存储介质 | |
CN111813418A (zh) | 分布式链路跟踪方法、装置、计算机设备及存储介质 | |
CN113094413B (zh) | 基于队列的数据统计方法、装置、计算机设备及存储介质 | |
US7127446B1 (en) | File system based task queue management | |
CN111124627A (zh) | 应用程序的调起者确定方法、装置、终端及存储介质 | |
CN114637651A (zh) | 内存帧率检测方法、装置、计算机设备及存储介质 | |
CN115544042A (zh) | 缓存的信息更新方法及装置、设备和介质 | |
CN114168607A (zh) | 全局序列号生成方法、装置、设备、介质和产品 | |
CN115203304A (zh) | 一种基于定时轮询的批量数据导入方法及相关设备 | |
CN108234481B (zh) | 一种控制多机分布式访问外部系统的方法及分布式系统 | |
CN113761179A (zh) | 评论管控方法、服务器及可读存储介质 | |
CN110795470A (zh) | 一种关联数据获取方法、装置、设备及存储介质 | |
CN113992587B (zh) | 流量控制方法、装置、计算机设备及存储介质 |
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 |