记录网络用户行为数据的方法及其装置、计算机可读介质与流程

文档序号:11407370阅读:544来源:国知局
记录网络用户行为数据的方法及其装置、计算机可读介质与流程

本发明涉及网络通信技术领域,尤其涉及一种记录网络用户行为数据的方法及其装置、计算机可读介质。



背景技术:

随着网络技术的迅速发展,各种网站或网络应用也如雨后春笋般涌现。在网络业务领域,记录网络(web)用户的操作行为,并对这些数据进行分析,可以让企业更加详细、清楚地了解用户的行为习惯,从而找出网站、推广渠道等企业营销环境存在的问题,有助于企业发掘页面转化率,让企业的营销更加精准、有效,提高业务转化率,从而提升企业的广告收益。为了更好地掌握和分析网络(web)用户对网站以及网站中的网页访问的情况,需要执行网站分析(webanalytics)。网站分析是指通过分析网络(web)用户对网页访问的行为来提供一系列分析结果,利用所提供的分析结果可以方便并直观地了解网络(web)用户对网页访问的趋势。具体地,分析结果可能包括提供了访问者在网站内部的网页访问顺序的点击路径信息,利用此种信息网站技术人员可以更好地组织并调整网站内部的网页结构和内容安排。

网络(web)用户行为分析一般包括数据采集和数据分析:

其中,数据采集就是获取web用户行为数据的过程,对于网站来说,自动获取用户行为数据最常用的方法就是基于服务器日志的方法(serverlog),就是通过web服务器所产生的日志文件来获取有用的数据,通常情况下日志文件中存在着大量与用户行为分析无关的冗余数据,如何从这些海量的数据中提炼出与用户行为分析是非常关键的一步,因此需要对日志文件进行预处理,然后进行分析,目前最重要的技术就是web日志的挖掘。但是,很多关于用户行为分析有价值的数据难以从日志文件中获取,因此,为了进一步获取关于用户行为有价值的数据,逐渐产生了从客户端直接获取用户与网站之间交互情况的行为数据的方法,主要包括基于浏览器的方法、基于网站的方法以及基于代理的方法,其中,基于浏览器的方法是由用户使用所开发的客户端程序去浏览网站,通常情况下是对已有的浏览器进行定制,例如ie,navigator,也可以是其他的浏览器,然后利用开发的客户端程序获得用户与网站交互的行为数据并把数据传回到服务器端。基于网站的方法是通过被测试的服务器端安装组件,这一组件的功能就是对用户要访问的网页的html代码中自动插入事件处理脚本程序,而且插入的代码是javascript脚本,因此,对于当前主流的浏览器均能够获得支持。基于代理的方法是在测试用户的客户端和被测试的服务器之间架设一代理服务器,代理服务器用来完成被测试服务器的用户行为数据的收集工作。通过代理的方法可以对多个不同的用户浏览不同的网站进行数据收集。

所谓数据分析实际上是一个从海量数据获得有价值的信息的数据挖掘过程,通过对采集到的流量数据的过滤、预处理、综合分析处理等程序,从中获取有价值的分析结果,并以准确直观的方式表示出来。

然而,在记录用户操作行为过程,也即是数据采集过程中需要面临两个问题:其一,由于记录用户的操作行为必然会耗费用户对页面操作的响应时间,从而影响用户体验;其二,在大量web用户同时在线进行操作时,记录用户行为直接写非内存型数据库,可能会对非内存型数据库的服务器造成极大的压力。



技术实现要素:

本发明的主要目的在于提出一种记录网络用户行为数据的方法及其装置、计算机可读介质,旨在解决大量网络(web)用户同时在线操作时,对服务器造成极大负荷的问题。

为实现上述目的,本发明提供的一种记录网络(web)用户行为数据的方法,该方法包括以下步骤:

获取网络(web)用户行为数据,将所述网络(web)用户行为数据写入本地缓存的阻塞式队列;

通过至少一个线程异步操作将所述阻塞式队列中的所述网络(web)用户行为数据进行处理并持久化到非内存型数据库。

其中,网络(web)用户行为数据至少包括以下信息类型:

访问网站的主体,主要是指用户的ip地址等信息;

访问网站的路径,主要是用户通过哪一种方式获得网站的链接;

用户网页停留时间,用户查询了网站的哪一些网页,在每一个网页中停留的时间;

用户是否达成浏览目的,例如用户进入购物网站,是否最终完成交易;或者用户进入文件查询网站,是否最终找到并获取用户所需要的文件;

用户的请求信息,例如进入购物网站时,用户查询了哪一类型的商品,或者在浏览器界面查询了哪一些信息;

用户请求的日期和时间,特别是用户请求的频率;

用户请求的结果,如成功、失败还是网站服务器发送错误、

由于web服务器类型的多种多样,不同的web服务器产生的信息是不一样的,各个网站根据自身的需要均会产生特定的用户行为数据。

无论是基于服务器日志文件,还是基于浏览器的方法、基于网站的方法以及基于代理的方法获取网络(web)用户行为数据,均需要对网络(web)用户行为数据进行识别分类存储。

其中,根据访问网站主体不同分别建立一所述线程,所述线程异步操作处理对应的所述访问网站主体的网络(web)用户行为数据。另外,可以设置每一线程关联处理多个所述访问网站主体的网络(web)用户行为数据。

其中,根据所述网络(web)用户行为数据的信息类型分别建立一所述线程,所述线程异步操作处理对应的每一所述信息类型的网络(web)用户行为数据。

进一步的,所述记录网络(web)用户行为数据的方法,还包括以下步骤:在获取网络(web)用户行为数据之前,在本地缓存预设一阻塞式队列。

其中,在获取网络(web)用户行为数据之前,在本地缓存中也可以设置多个阻塞式队列,每一阻塞式队列关联接收不同的网页,或者不同区域划分的访问网站用户的网络(web)用户行为数据,从而进一步提升网络(web)用户行为数据获取的处理效率。

进一步的,所述记录网络(web)用户行为数据的方法,还包括以下步骤:

预设一监控线程,并通过所述监控线程实时监控所述本地缓存中的阻塞式队列的长度。

进一步的,所述记录网络(web)用户行为数据的方法,还包括以下步骤:

预设所述本地缓存中的阻塞式队列的最大长度阀值,当所述阻塞式队列的长度大于所述最大长度阀值时,增加所述线程数量。

进一步的,所述记录网络(web)用户行为数据的方法,还包括以下步骤:

预设所述本地缓存中的阻塞式队列的最小长度阀值,当所述阻塞式队列的长度小于所述最小长度阀值时,减少所述线程数量。

其中,所述阻塞式队列接收网络(web)用户行为数据,所述阻塞式队列通过线程将网络(web)用户行为数据分发给服务器存储数据库,根据所述服务器存储数据库与所述本地缓存之间的数据传输率确定所述最大长度阀值和最小长度阀值。

本发明的另一方面,为实现上述目的,本发明还提出一种记录网络用户行为数据的装置,该装置包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的数据采集程序,所述数据采集程序被所述处理器执行时实现如下的记录网络(web)用户行为数据的方法步骤:

获取网络(web)用户行为数据,将所述网络(web)用户行为数据写入本地缓存的阻塞式队列;

通过至少一个线程异步操作将所述阻塞式队列中的所述网络(web)用户行为数据进行处理并持久化到非内存型数据库。

进一步的,所述数据采集程序被所述处理器执行时还实现如下的记录网络(web)用户行为数据的方法步骤:

在获取网络(web)用户行为数据之前,在本地缓存预设一阻塞式队列;

以及预设一监控线程,并通过所述监控线程实时监控所述本地缓存中的阻塞式队列的长度。

进一步的,所述数据采集程序被所述处理器执行时还实现如下的记录网络(web)用户行为数据的方法步骤:

在所述阻塞式队列的长度大于预设的所述本地缓存中的阻塞式队列的最大长度阀值时,增加所述线程数量。

进一步的,所述数据采集程序被所述处理器执行时还实现如下的记录网络(web)用户行为数据的方法步骤:

在所述阻塞式队列的长度小于预设的所述本地缓存中的阻塞式队列的最小长度阀值时,减少所述线程数量。

此外,为实现上述目的,本发明还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有网络用户行为数据采集程序,所述网络用户行为数据采集被处理器执行时实现上述的记录网络(web)用户行为数据的方法的步骤。

本发明提出的记录网络用户行为数据的方法及其装置、计算机可读介质,实现记录用户操作行为数据,通过本地缓存写数据的高效性来提高用户体验,以及通过异步线程进行对记录数据的处理及记录,同时为了防止高并发时,可能会导致用户行为数据生成数量大于处理数量,从而导致本地缓存的队列排满产生阻塞,因此加入一个监控线程能够进行智能控制,减少队列阻塞的可能性。

附图说明

图1为实现本发明各个实施例的web工作过程的原理图;

图2为本发明涉及的其中一种web用户行为分析系统框架结构图;

图3为本发明实施例的第一种记录网络(web)用户行为数据的方法流程框图;

图4为本发明实施例的第一种记录网络(web)用户行为数据的方法执行结构示意图;

图5为本发明实施例的第二种记录网络(web)用户行为数据的方法流程框图;

图6为本发明实施例的第三种记录网络(web)用户行为数据的方法流程框图;

本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

本发明技术方案涉及的web(worldwideweb)即全球广域网,也称为万维网,它是一种基于超文本和http的、全球性的、动态交互的、跨平台的分布式图形信息系统。是建立在internet上的一种网络服务,为浏览者在internet上查找和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将internet上的信息节点组织成一个互为关联的网状结构。

所谓web(worldwideweb)的表现形式如下:

(1)、超文本(hypertext)

超文本是一种用户接口方式,用以显示文本及与文本相关的内容。现时超文本普遍以电子文档的方式存在,其中的文字包含有可以链接到其他字段或者文档的超文本链接,允许从当前阅读位置直接切换到超文本链接所指向的文字。超文本的格式有很多,目前最常使用的是超文本标记语言(hypertextmarkuplanguage,html)及富文本格式(richtextformat,rtf)。我们日常浏览的网页上的链结都属于超文本。超文本链接一种全局性的信息结构,它将文档中的不同部分通过关键字建立链接,使信息得以用交互方式搜索。

(2)、超媒体(hypermedia)

超媒体是超级媒体的简称。是超文本(hypertext)和多媒体在信息浏览环境下的结合。用户不仅能从一个文本跳到另一个文本,而且可以激活一段声音,显示一个图形,甚至可以播放一段动画。internet采用超文本和超媒体的信息组织方式,将信息的链接扩展到整个internet上。web就是一种超文本信息系统,web的一个主要的概念就是超文本链接。它使得文本不再像一本书一样是固定的线性的,而是可以从一个位置跳到另外的位置并从中获取更多的信息,还可以转到别的主题上。想要了解某一个主题的内容只要在这个主题上点一下,就可以跳转到包含这一主题的文档上。正是这种多连接性把它称为web。

(3)、超文本传输协议(http,hypertexttransferprotocol)是互联网上应用最为广泛的一种网络协议。

如图1所示,web的工作过程可以分成:建立连接、发送请求信息、发送响应信息、关闭连接。客户端是终端用户,服务器端是网站,通过使用web浏览器,客户端向web服务器发起一个http请求,应答的web服务器上存储了相应的html文本和图像资源。web页面由多个对象构成,对象(object)仅仅是可由单个统一资源定位符url寻址的文件,例如htmt文本文件、静态图像、java小应用程序、语音片段、动画视频等。大多数web页面由单个基本的html文件和若干所引用的对象构成。基本html文件使用相应的url来引用本页面的其他对象。每个url由存放该对象的服务器主机名和该对象的路径名两个部分构成。

如图2所示,其中一种web用户行为分析系统框架结构图,web用户的行为信息从客户端、用户终端、代理服务器获取。web网络用户行为分析的对象是:上网用户个体,我们把用户访问网页的一次行为称为事件,每当事件发生的时候,用户行为分析系统首先要做的是通过一定的方法来获取用户相应的上网行为,其中部分信息来对用户加以区分,其他部分用来计算用户的兴趣度,但是收集的浏览信息往往是杂乱无章的,并且存在一些干扰信息,不能完全反映用户的兴趣爱好,需要对信息进行相应的处理,经过预处理之后作为数据挖掘的基本输入,聚类或分类计算可以得到该网页对于某个主题的相关度,之后结合用户访问的网页对于主题的相关度和设置的一些参数,定义公式来计算每个用户对于某个主题的相关度,本课题将用户对于某个主题的相关度称为用户的兴趣度,最后可以根据用户对于这个主题的相关度的大小,为用户提供网页推荐等个性化的服务,或者是达到其它的目的。如图2所示,把web用户行为分析系统分为四个模块:数据获取及预处理模块、数据挖掘模块、兴趣度更新模块。

数据获取模块的作用就是获取以上信息,并把它们传送给其它的模块或者存放在相应的数据库表格中,以待后面的分析。在数据获取之前,需要分析用户是否愿意提供相应的信息,用户一般都想保密自己的一些重要信息,尤其是具有隐私性和敏感性的信息,例如用户的银行卡号、工资、手机号码等,80%的用户愿意向网站提供自己的姓名、性别、兴趣爱好等,所以必须跟被监测用户沟通好,保证本系统不会得到用户不愿透露的隐私信息,只是观察用户的浏览信息,以得到他们的许可。

数据预处理模块是用户行为分析系统中不可缺少的一个环节。大型网站每天所产生的数据量是惊人的,并且数据库极易受到噪声数据、空缺数据和一些不一致数据的侵扰,低质量的数据将导致低质最的结果,含有大量的冗余数据会降低数据挖掘数据的性能,从而得不到输出或是得到不可靠的输出。要使挖掘内核更有效地挖掘知识,就必须为它提供准确、简洁的数据,预处理是指网页的分析、过滤、消除重复记录、完成数据类型的转化,检查数据完整性和一致性,去除网页中无关内容,将信息进行必要的整理,从而使数椐挖掘的过程更有效容易。常见的数据预处理的方法有:数据清理、数据转换、数据归约。

因特网上大量信息表现为文本,文本是指在以html格式存储的半格式化的web页面和文档,如何从这些浩瀚的文本数据中挖掘出潜在的知识是一个需要亟待解决的问题。对于数据挖掘技术来说,考虑到分类算法在用户行为分析系统中的应用,事先可以将用户的兴趣主题定义好,这样做的目的是从用户的角度出发,不同的用户可以根据自己的实际需求来设置主题,之后得到系统分析的用户对于某个主题的兴趣度,并实施相应的行为,实现自己的目标。分析web的基本文本内容是兴趣度计算过程中的一个主要方面,它是获取用户兴趣度的前提,用分类分析的方法将网络用户归到不同的类别,这些类别就是相关的兴趣主题。

实施例1

基于上述web结构以及web用户行为分析系统,提出本发明方法各个实施例。

如图3所示,本发明第一实施例提出一种记录网络(web)用户行为数据的方法,该方法包括以下步骤:

s101、获取网络(web)用户行为数据,将所述网络(web)用户行为数据写入本地缓存的阻塞式队列;

s102、通过至少一个线程异步操作将所述阻塞式队列中的所述网络(web)用户行为数据进行处理并持久化到非内存型数据库。

其中,网络(web)用户行为数据至少包括以下信息类型:

访问网站的主体,主要是指用户的ip地址等信息;

访问网站的路径,主要是用户通过哪一种方式获得网站的链接;

用户网页停留时间,用户查询了网站的哪一些网页,在每一个网页中停留的时间;

用户是否达成浏览目的,例如用户进入购物网站,是否最终完成交易;或者用户进入文件查询网站,是否最终找到并获取用户所需要的文件;

用户的请求信息,例如进入购物网站时,用户查询了哪一类型的商品,或者在浏览器界面查询了哪一些信息;

用户请求的日期和时间,特别是用户请求的频率;

用户请求的结果,如成功、失败还是网站服务器发送错误、

由于web服务器类型的多种多样,不同的web服务器产生的信息是不一样的,各个网站根据自身的需要均会产生特定的用户行为数据。

无论是基于服务器日志文件,还是基于浏览器的方法、基于网站的方法以及基于代理的方法获取网络(web)用户行为数据,均需要对网络(web)用户行为数据进行识别分类存储。

如图4所示,获取网络(web)用户行为数据的数据采集针将用户行为数据放入到本地缓存的队列中,如数据1、数据2、数据3、数据4。。,链型排列;建立至少一个线程,如线程1、线程2、线程3、线程4。。,从队列中分别消费其中的数据,并将用户行为数据存储到web服务器的非内存型数据库。

其中,根据访问网站主体不同分别建立一所述线程,所述线程异步操作处理对应的所述访问网站主体的网络(web)用户行为数据。另外,可以设置每一线程关联处理多个所述访问网站主体的网络(web)用户行为数据。

其中,根据所述网络(web)用户行为数据的信息类型分别建立一所述线程,所述线程异步操作处理对应的每一所述信息类型的网络(web)用户行为数据。

多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。甚至有些时候我们就认为多线程和异步操作是等同的概念。但是,多线程和异步操作还是有一些区别的。而这些区别造成了使用多线程和异步操作的时机的区别。

所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们有必要了解一下它的硬件基础。熟悉电脑硬件的朋友肯定对dma这个词不陌生,硬盘、光驱的技术规格中都有明确dma的模式指标,其实网卡、声卡、显卡也是有dma功能的。dma就是直接内存访问的意思,也就是说,拥有dma功能的硬件在和内存进行数据交换的时候可以不消耗cpu资源。只要cpu在发起数据传输时发送一个指令,硬件就开始自己和内存交换数据,在传输完成之后硬件会触发一个中断来通知操作完成。这些无须消耗cpu时间的i/o操作正是异步操作的硬件基础。所以即使在dos这样的单进程(而且无线程概念)系统中也同样可以发起异步的dma操作。

线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入cpu资源来运行和调度。

因为异步操作无须额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下,处理函数可以不必使用共享变量(即使无法完全不用,最起码可以减少共享变量的数量),减少了死锁的可能。

多线程的优点很明显,线程中的处理程序依然是顺序执行,符合普通人的思维习惯,所以编程简单。但是多线程的缺点也同样明显,线程的使用(滥用)会给系统带来上下文切换的额外负担。并且线程间的共享变量可能造成死锁的出现。

异步与多线程,从辩证关系上来看,异步和多线程并不时一个同等关系,异步是目的,多线程只是我们实现异步的一个手段.什么是异步:异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回.实现异步可以采用多线程技术或则交给另外的进程来处理。

其中,本地缓存是指将客户端本地的物理内存划分出一部分空间用来缓冲客户端回写到服务器的数据,因其在回写上的突出贡献,因此本地缓存一般称为本地回写。该技术将客户端回写的数据不再先写入服务器硬盘,而是将回写数据先写入本地回写缓存,当缓存空间达到一定的阀值时,再将数据回写到服务器。有了本地回写缓存功能之后,可大大降低服务器读写压力和网络负载。

其中,持久化(persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、xml数据文件中等等。持久化是将程序数据在持久状态和瞬时状态间转换的机制。jdbc就是一种持久化机制。文件io也是一种持久化机制。对象持久化可以满足对象序列化。

其中,内存数据库抛弃了磁盘数据管理的传统方式,基于全部数据都在内存中重新设计了体系结构,并且在数据缓存、快速算法、并行操作方面也进行了相应的改进,所以数据处理速度比传统数据库的数据处理速度要快很多,一般都在10倍以上常见的例子有mysql的memory存储引擎、extremedb、tt、fastdb、sqlite、microsoftsqlservercompact等。传统的数据库系统是关系型数据库,开发这种数据库的目的,是处理永久、稳定的数据。关系数据库强调维护数据的完整性、一致性,但很难顾及有关数据及其处理的定时限制,不能满足工业生产管理实时应用的需要,因为实时事务要求系统能较准确地预报事务的运行时间。

对磁盘数据库而言,由于磁盘存取、内外存的数据传递、缓冲区管理、排队等待及锁的延迟等使得事务实际平均执行时间与估算的最坏情况执行时间相差很大,如果将整个数据库或其主要的″工作″部分放入内存,使每个事务在执行过程中没有i/o,则为系统较准确估算和安排事务的运行时间,使之具有较好的动态可预报性提供了有力的支持,同时也为实现事务的定时限制打下了基础。

内存数据库所处理的数据通常是″短暂″的,即有一定的有效时间,过时则有新的数据产生,而当前的决策推导变成无效。所以,实际应用中采用内存数据库来处理实时性强的业务逻辑处理数据。而传统数据库旨在处理永久、稳定的数据,其性能目标是高的系统吞吐量和低的代价,处理数据的实时性就要考虑的相对少一些。实际应用中利用传统数据库这一特性存放相对实时性要求不高的数据。

本发明技术方案涉及的非内存型数据库包括关系型数据库以及硬盘数据库。

如图5所示,本发明的第二种记录网络(web)用户行为数据的方法,该方法包括以下步骤:

s201、在获取网络(web)用户行为数据之前,在本地缓存预设一阻塞式队列;

s202、获取网络(web)用户行为数据,将所述网络(web)用户行为数据写入本地缓存的阻塞式队列;

s203、通过至少一个线程异步操作将所述阻塞式队列中的所述网络(web)用户行为数据进行处理并持久化到非内存型数据库。

在记录web用户行为数据时,不采用传统的直接写非内存型持久化数据库,而是将数据写入一个线程安全阻塞的有界队列的本地缓存,由于本地缓存的数据写入速度极快,可以显著提高用户体验。

其中,在获取网络(web)用户行为数据之前,在本地缓存中也可以设置多个阻塞式队列,每一阻塞式队列关联接收不同的网页,或者不同区域划分的访问网站用户的网络(web)用户行为数据,从而进一步提升网络(web)用户行为数据获取的处理效率。

如图6所示,本发明的第三种记录网络(web)用户行为数据的方法,该方法包括以下步骤:

s301、在获取网络(web)用户行为数据之前,在本地缓存预设一阻塞式队列;

s302、获取网络(web)用户行为数据,将所述网络(web)用户行为数据写入本地缓存的阻塞式队列;

s303、预设一监控线程,并通过所述监控线程实时监控所述本地缓存中的阻塞式队列的长度;预设所述本地缓存中的阻塞式队列的最大长度阀值,当所述阻塞式队列的长度大于所述最大长度阀值时,增加所述线程数量;预设所述本地缓存中的阻塞式队列的最小长度阀值,当所述阻塞式队列的长度小于所述最小长度阀值时,减少所述线程数量;

s304、通过至少一个线程异步操作将所述阻塞式队列中的所述网络(web)用户行为数据进行处理并持久化到非内存型数据库。

其中,所述阻塞式队列接收网络(web)用户行为数据,所述阻塞式队列通过线程将网络(web)用户行为数据分发给服务器存储数据库,根据所述服务器存储数据库与所述本地缓存之间的数据传输率确定所述最大长度阀值和最小长度阀值。

实施例2

本发明的另一方面,为实现上述目的,本发明还提出一种记录网络用户行为数据的装置,该装置包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的数据采集程序,所述数据采集程序被所述处理器执行时实现如下的记录网络(web)用户行为数据的方法步骤:

获取网络(web)用户行为数据,将所述网络(web)用户行为数据写入本地缓存的阻塞式队列;

通过至少一个线程异步操作将所述阻塞式队列中的所述网络(web)用户行为数据进行处理并持久化到非内存型数据库。

其中,所述数据采集程序被所述处理器执行时还实现如下的记录网络(web)用户行为数据的方法步骤:

在获取网络(web)用户行为数据之前,在本地缓存预设一阻塞式队列;

以及预设一监控线程,并通过所述监控线程实时监控所述本地缓存中的阻塞式队列的长度。

其中,所述数据采集程序被所述处理器执行时还实现如下的记录网络(web)用户行为数据的方法步骤:

在所述阻塞式队列的长度大于预设的所述本地缓存中的阻塞式队列的最大长度阀值时,增加所述线程数量。

其中,所述数据采集程序被所述处理器执行时还实现如下的记录网络(web)用户行为数据的方法步骤:

在所述阻塞式队列的长度小于预设的所述本地缓存中的阻塞式队列的最小长度阀值时,减少所述线程数量。

具体地,在本地缓存中创建一个阻塞式队列linkedblockingqueue,设置队列的大小为capacity。当需要记录用户行为,将用户行为相关的数据生产写入本地缓存队列linkedblockingqueue。对用户行为生产的数据进行消费,通过一个或多个线程的异步操作将队列本地缓存队列中的数据进行消费,同时持久化到非内存型数据库。通过一个线程进行监控当前本地缓存队列的长度,如果大于设置的阈值,则开启新的线程进行消费并入库。如果队列长时间小于设置的阈值,则适当减少消费线程数。

blockingqueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。blockingqueue阻塞队列,顾名思义,首先它是一个队列,而一个队列在数据结构中所起的作用大致如下:通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出。

常用的队列主要有以下两种:(当然通过不同的实现方式,还可以延伸出很多不同类型的队列,delayqueue就是其中的一种);先进先出(fifo):先插入的队列的元素也最先出队列,类似于排队的功能。从某种程度上来说这种队列也体现了一种公平性。后进先出(lifo):后插入队列的元素最先出队列,这种队列优先处理最近发生的事件。

多线程环境中,通过队列可以很容易实现数据共享,比如经典的“生产者”和“消费者”模型中,通过队列可以很便利地实现两者之间的数据共享。假设我们有若干生产者线程,另外又有若干个消费者线程。如果生产者线程需要把准备好的数据共享给消费者线程,利用队列的方式来传递数据,就可以很方便地解决他们之间的数据共享问题。但如果生产者和消费者在某个时间段内,万一发生数据处理速度不匹配的情况呢?理想情况下,如果生产者产出数据的速度大于消费者消费的速度,并且当生产出来的数据累积到一定程度的时候,那么生产者必须暂停等待一下(阻塞生产者线程),以便等待消费者线程把累积的数据处理完毕,反之亦然。(在多线程领域:所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动被唤醒)。

blockingqueue的两个常见阻塞场景:当队列中没有数据的情况下,消费者端的所有线程都会被自动阻塞(挂起),直到有数据放入队列。当队列中填满数据的情况下,生产者端的所有线程都会被自动阻塞(挂起),直到队列中有空的位置,线程被自动唤醒。

blockingqueue的核心方法:

1.放入数据

(1)offer(anobject):表示如果可能的话,将anobject加到blockingqueue里,即如果blockingqueue可以容纳,则返回true,否则返回false。(本方法不阻塞当前执行方法的线程);

(2)offer(eo,longtimeout,timeunitunit):可以设定等待的时间,如果在指定的时间内,还不能往队列中加入blockingqueue,则返回失败。

(3)put(anobject):把anobject加到blockingqueue里,如果blockqueue没有空间,则调用此方法的线程被阻断直到blockingqueue里面有空间再继续。

2.获取数据

(1)poll(time):取走blockingqueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null;

(2)poll(longtimeout,timeunitunit):从blockingqueue取出一个队首的对象,如果在指定时间内,队列一旦有数据可取,则立即返回队列中的数据。否则知道时间

超时还没有数据可取,返回失败。

(3)take():取走blockingqueue里排在首位的对象,若blockingqueue为空,阻断进入等待状态直到blockingqueue有新的数据被加入;

(4)drainto():一次性从blockingqueue获取所有可用的数据对象(还可以指定获取数据的个数),通过该方法,可以提升获取数据效率;不需要多次分批加锁或释放锁。

常见blockingqueue如下:

1.arrayblockingqueue

基于数组的阻塞队列实现,在arrayblockingqueue内部,维护了一个定长数组,以便缓存队列中的数据对象,这是一个常用的阻塞队列,除了一个定长数组外,arrayblockingqueue内部还保存着两个整形变量,分别标识着队列的头部和尾部在数组中的位置。

arrayblockingqueue在生产者放入数据和消费者获取数据,都是共用同一个锁对象,由此也意味着两者无法真正并行运行,这点尤其不同于linkedblockingqueue;按照实现原理来分析,arrayblockingqueue完全可以采用分离锁,从而实现生产者和消费者操作的完全并行运行。douglea之所以没这样去做,也许是因为arrayblockingqueue的数据写入和获取操作已经足够轻巧,以至于引入独立的锁机制,除了给代码带来额外的复杂性外,其在性能上完全占不到任何便宜。arrayblockingqueue和linkedblockingqueue间还有一个明显的不同之处在于,前者在插入或删除元素时不会产生或销毁任何额外的对象实例,而后者则会生成一个额外的node对象。这在长时间内需要高效并发地处理大批量数据的系统中,其对于gc的影响还是存在一定的区别。而在创建arrayblockingqueue时,我们还可以控制对象的内部锁是否采用公平锁,默认采用非公平锁。

2.linkedblockingqueue

基于链表的阻塞队列,同arraylistblockingqueue类似,其内部也维持着一个数据缓冲队列(该队列由一个链表构成),当生产者往队列中放入一个数据时,队列会从生产者手中获取数据,并缓存在队列内部,而生产者立即返回;只有当队列缓冲区达到最大值缓存容量时(linkedblockingqueue可以通过构造函数指定该值),才会阻塞生产者队列,直到消费者从队列中消费掉一份数据,生产者线程会被唤醒,反之对于消费者这端的处理也基于同样的原理。而linkedblockingqueue之所以能够高效的处理并发数据,还因为其对于生产者端和消费者端分别采用了独立的锁来控制数据同步,这也意味着在高并发的情况下生产者和消费者可以并行地操作队列中的数据,以此来提高整个队列的并发性能。

作为开发者,我们需要注意的是,如果构造一个linkedblockingqueue对象,而没有指定其容量大小,linkedblockingqueue会默认一个类似无限大小的容量(integer.max_value),这样的话,如果生产者的速度一旦大于消费者的速度,也许还没有等到队列满阻塞产生,系统内存就有可能已被消耗殆尽了。

arrayblockingqueue和linkedblockingqueue是两个最普通也是最常用的阻塞队列,一般情况下,在处理多线程间的生产者消费者问题,使用这两个类足以。

3.delayqueue

delayqueue中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素。delayqueue是一个没有大小限制的队列,因此往队列中插入数据的操作(生产者)永远不会被阻塞,而只有获取数据的操作(消费者)才会被阻塞。

使用场景:delayqueue使用场景较少,但都相当巧妙,常见的例子比如使用一个delayqueue来管理一个超时未响应的连接队列。

4.priorityblockingqueue

基于优先级的阻塞队列(优先级的判断通过构造函数传入的compator对象来决定),但需要注意的是priorityblockingqueue并不会阻塞数据生产者,而只会在没有可消费的数据时,阻塞数据的消费者。因此使用的时候要特别注意,生产者生产数据的速度绝对不能快于消费者消费数据的速度,否则时间一长,会最终耗尽所有的可用堆内存空间。在实现priorityblockingqueue时,内部控制线程同步的锁采用的是公平锁。

5.synchronousqueue

一种无缓冲的等待队列,类似于无中介的直接交易,有点像原始社会中的生产者和消费者,生产者拿着产品去集市销售给产品的最终消费者,而消费者必须亲自去集市找到所要商品的直接生产者,如果一方没有找到合适的目标,那么对不起,大家都在集市等待。相对于有缓冲的blockingqueue来说,少了一个中间经销商的环节(缓冲区),如果有经销商,生产者直接把产品批发给经销商,而无需在意经销商最终会将这些产品卖给那些消费者,由于经销商可以库存一部分商品,因此相对于直接交易模式,总体来说采用中间经销商的模式会吞吐量高一些(可以批量买卖);但另一方面,又因为经销商的引入,使得产品从生产者到消费者中间增加了额外的交易环节,单个产品的及时响应性能可能会降低。

声明一个synchronousqueue有两种不同的方式,它们之间有着不太一样的行为。公平模式和非公平模式的区别:如果采用公平模式:synchronousqueue会采用公平锁,并配合一个fifo队列来阻塞多余的生产者和消费者,从而体系整体的公平策略;但如果是非公平模式(synchronousqueue默认):synchronousqueue采用非公平锁,同时配合一个lifo队列来管理多余的生产者和消费者,而后一种模式,如果生产者和消费者的处理速度有差距,则很容易出现饥渴的情况,即可能有某些生产者或者是消费者的数据永远都得不到处理。

blockingqueue不光实现了一个完整队列所具有的基本功能,同时在多线程环境下,他还自动管理了多线间的自动等待于唤醒功能,从而使得可以忽略这些细节,关注更高级的功能。

实施例3

此外,为实现上述目的,本发明还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有网络用户行为数据采集程序,所述网络用户行为数据采集被处理器执行时实现上述的记录网络(web)用户行为数据的方法的步骤:

s301、在获取网络(web)用户行为数据之前,在本地缓存预设一阻塞式队列;

s302、获取网络(web)用户行为数据,将所述网络(web)用户行为数据写入本地缓存的阻塞式队列;

s303、预设一监控线程,并通过所述监控线程实时监控所述本地缓存中的阻塞式队列的长度;预设所述本地缓存中的阻塞式队列的最大长度阀值,当所述阻塞式队列的长度大于所述最大长度阀值时,增加所述线程数量;预设所述本地缓存中的阻塞式队列的最小长度阀值,当所述阻塞式队列的长度小于所述最小长度阀值时,减少所述线程数量;

s304、通过至少一个线程异步操作将所述阻塞式队列中的所述网络(web)用户行为数据进行处理并持久化到非内存型数据库。

本发明提出的记录网络用户行为数据的方法及其装置、计算机可读介质,实现记录用户操作行为数据,通过本地缓存写数据的高效性来提高用户体验,以及通过异步线程进行对记录数据的处理及记录,同时为了防止高并发时,可能会导致用户行为数据生成数量大于处理数量,从而导致本地缓存的队列排满产生阻塞,因此加入一个监控线程能够进行智能控制,减少队列阻塞的可能性。

需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个......”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。

以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1