具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,以下举实施例并参照附图,对本发明进一步详细说明。
图1为本发明实施例提供的一种广告投放系统的结构图,该系统包括:
广告数据库服务器AdDBServer,用于存储与广告投放相关的广告数据,包含:客户数据、合同数据、投放条件、广告素材等。
后台管理服务器MServer,用于定时从广告数据库服务器中提取广告数据,生成投放条件树数据对象,并在本地缓存所生成的投放条件树数据对象;MServer还可用于广告预定、排期、素材设置等一系列管理功能。
前端广告投放服务器CastServer,用于定时从后台管理服务器提取缓存的广告投放条件树数据对象并在本地进行缓存,在接收到用户终端发送的广告请求时,基于所述广告投放条件树查找满足投放条件的广告,并返回广告代码给请求方。
广告素材服务器IdeaServer,用于存放实际要播放的广告素材,以及在接收到用户终端发起的获取实际播放的广告素材的请求时,向用户终端返回实际播放的广告素材。
用户终端接收到前端广告投放服务器返回的广告代码后,通过解析代码获得实际需要的广告素材标识,然后向广告素材服务器发起获取实际播放的广告素材的请求,广告素材服务器依据请求返回相应的广告素材。所述广告素材可以为视频、flash、图片等。
为了应对大规模的并发的广告请求,减轻数据库服务器的负载,本发明采用两级数据缓存机制,并且在后台管理服务器MServer和前端投放服务器CastServer上使用分布式网络缓存工具(如Memcache、redis等)来进行数据的缓存。Mserver定时从广告数据库服务器AdDBServer中取得待投放的广告数据,生成投放条件树数据对象,然后通过分布式网络缓存工具提供的写入set操作功能将所生成的投放条件树数据对象写入本机的缓存中;CastServer会定时通过分布式网络缓存工具提供的获取get操作从MServer的缓存中读取缓存数据,装载到本机缓存中。
所述后台服务器和前端投放服务器对所述广告数据进行缓存时采用树形数据结构即投放条件树,来反映不同的投放条件及投放条件的优先级,投放条件树的每一层对应一级广告投放优先级,每个分支对应不同的投放条件,具体的,本发明使用哈希图HashMap来构造所述投放条件树中除叶子节点之外的每一级节点,通过HashMap键值对中的key来反映投放条件,通过HashMap键值对中的value来链接下一级HashMap,每一级HashMap对应一级广告投放优先级;
所述投放条件树的最底层叶子节点为符合上层节点所指示投放条件的广告 素材标识的集合,用于存放投放条件相同的广告素材标识,所述集合可通过列表List、数组、链表等数据类型来表达。
优选地,为了保证高效投放,前端投放服务器CastServer和用户终端之间挂接了负载均衡服务器HaproxyServer,当用户在网站上的某个行为(如打开一个视频播放页)触发了一次广告请求时,该请求会首先被HaproxyServer得到,然后HaproxyServer会通过一定的策略将该请求转发给多个CastServer中的一台,这台CastServer再到其本机的缓存中进行广告匹配,若找到合适的广告,则向请求方返回要投放的广告代码。
本发明优选实施例中,通过多级的哈希图HashMap和列表List来构造投放条件树数据对象,广告投放系统中待投放的广告数据就是以这种结构存放在缓存中,其结构以java风格可描述如下:
HashMap<String,HashMap<String,...,HashMap<String,List<String>>...>>
根据上面的描述可以看出,该数据结构并非完全固定不变的,会因广告投放系统所要求支持的投放功能而有所不同。其中省略号内表示内部有若干个嵌套的HashMap结构。HashMap是以键值对(key-value)方式来存储数据的,它以put(key,value)方法存入键值对,以get(key)方法取得value,其优点是可以在线性时间复杂度内完成数据查找,而不必在每次查找时都遍历整个集合。最内层是List对象,它则不仅提供了随机访问列表中指定位置的元素,还可以add(value)添加元素,以remove(index)方法删除指定位置的元素。
所述投放条件树的构造方法如下:
步骤1、确定广告有哪些具体的投放要求;
例如视频广告投放优先级别的要求为:
A、广告定投方式为最优先考虑:视频组定投广告优先级最高、人群定投广告次之、其它定投方式再次之,其它广告须满足长广告(目前大于7秒的广告被视为长广告,否则为短广告)只投在长视频中、短广告只投在短视频中;
B、是否N+广告为次优先考虑:N+广告优先于非N+广告进行投放;
C、客户级别为再次优先考虑:客户级别有V(VIP客户)、A、B、C、D、 E等,级别越高,投放顺序越靠前;
D、定投方式和是否N+限制、客户级别等都相同的情况下,所做具体投放限制条件越严苛,越优先投放,如:定投北京地区的电视剧的广告,要优先于仅仅定投电视剧的广告;
E、相同的投放条件下:按千人成本(Cost Per Mille,CPM)投放的广告,优先于按全流量投放的广告。
步骤2、根据广告投放系统具体的功能需求来确定投放条件树的具体结构,基本原则是:每一种广告投放条件优先级别要求占用一级HashMap,每一级的HashMap中由键值对(即key-value对)构成,通过HashMap的键值对中的key来反映不同的投放条件,通过HashMap键值对中的value来链接下一级HashMap,直到所有优先级别的HashMap创建完毕,最后一级HashMap键值对中的value则存放一个列表List数据对象,List中存放的是投放条件相同的广告素材ID的集合,广告素材ID是一个广告素材的唯一标识。
例如,基于步骤1中所给的视频广告投放优先级别的要求,应该使用“5层HashMap+1层List”来构造所述投放条件树,以java语言风格描述为:
HashMap<String,HashMap<String,HashMap<String,HashMap<String,HashMap<String,List>>>>>CondTree;
所构造的投放条件树的具体结构可参见附图2的示例。
步骤3、上述数据结构中最内层的List中存放的仅仅是广告素材的ID,实际进行广告投放的时候需要根据广告素材的ID取得具体要投放的广告的具体相关参数,如:广告素材url、曝光监测url、点击监测url等相关内容。上述具体相关参数可以被组织为一个对象,然后以HashMap方式缓存起来,其结构以java风格定义为:
HashMap<Interger,AdEntity>adEntityMap;
其中的key是广告素材ID,value是一个AdEntity对象,对象中存放广告素材url、曝光监测url、点击监测url等相关内容。实际投放时,会先在步骤2中所构造的投放条件树CondTree对象中进行广告匹配,取得一个合适的广告素 材ID,然后再根据这个ID到adEntityMap中取得具体的广告素材详细参数,这些参数与用户请求的url中的相关参数一起被组织成广告代码,然后返回给播放器,播放器负责处理后续的广告展现。
当从广告数据库中取得一个当前处于投放期的广告后,需要将该广告装载到上述投放条件树中。以下基于上述投放条件树的构造方法,举实例描述广告投放系统的投放条件树的装载过程,如图3所示:
步骤101、从广告数据库中取得一个当前在投的广告素材(idea)列表ideaList;
步骤102、判断ideaList中是否还有需要处理的广告素材,若有则从ideaList列表中取出一个广告素材,然后执行步骤103;否则结束流程;
步骤103、根据当前的广告素材的相关属性来确定所取出的广告素材的第一级关键字key1;
key1的值由idea的相关属性来确定,例如:若该广告为视频组或人群定投,则为v;否则,如果为长广告,则为l;如果为短广告,则为s;
步骤104、在投放条件树的根节点即第一级HashMap(以下简称map1)中匹配是否存在以key1为关键字的下一级HashMap(以下简称map2),若不存在则执行步骤105;否则执行步骤106;
步骤105、以key1关键字构造map2,并将键值对(key1,map2)存入map1;
执行语句形如:map2=new HashMap<String,HashMap<String,HashMap<String,HashMap<String,List<String>>>>>();
步骤106、根据当前的广告素材的相关属性来确定该广告素材的第二级关键字key2;
key2同样由idea的相关属性来确定,例如:若idea为N+广告,则key2赋值为n;否则,赋值为g;
步骤107、在map2中判断是否存在以key2为关键字的下一级HashMap(以下简称map3),若不存在则执行步骤108;否则执行步骤109;
步骤108、以key2关键字构造map3,并将键值对(key2,map3)存入map2;
执行语句形如:map3=new HashMap<String,HashMap<String,HashMap<String,List<String>>>>();
步骤109、根据当前的广告素材的相关属性来确定该广告素材的第三级关键字key3;
key3同样由广告素材的相关属性来确定,例如:其值为广告素材所对应的广告客户级别,所述客户级别的标识可通过V、A、B、C、D、E、S等字母标识;
步骤110、在map3中判断是否存在以key3为关键字的下一级HashMap(以下简称map4),若不存在则执行步骤111;否则执行步骤112;
步骤111、以key3关键字构造map4,并将键值对(key3,map4)存入map3;
执行语句形如:map4=new HashMap<String,HashMap<String,List<String>>>();
步骤112、根据当前的广告素材的相关属性来确定该广告素材的第四级关键字key4;
key4同样由广告素材的相关属性来确定,其值依赖于idea的具体定投方式,例如:av(表示地区+视频组定投)、ac(地区+人群定投)、p(分类定投)等;
步骤113、在map4中判断是否存在以key4为关键字的下一级HashMap(以下简称map5),若不存在则执行步骤114;否则执行步骤115;
步骤114、以key4关键字构造map5,并将键值对(key4,map5)存入map4;
执行语句形如:map5=new HashMap<String,List<String>>();
步骤115、根据当前的广告素材的相关属性来确定该广告素材的第五级关键字key5;
步骤116、在map5中判断是否存在以key5为关键字的下一级List对象,若不存在则执行步骤117;否则执行步骤118;
步骤117、新建List对象,并将键值对key5-List添加到map5中;
步骤118、将当前广告素材id添加到map5中key5对应的List所指向的广 告素材列表中,若所对应的广告素材列表不存在,则新建后再存入。然后再次执行步骤102。
当前端投放服务器接收到广告请求后,依据广告请求中的参数,基于投放条件树查找满足投放条件的广告,并返回广告代码给请求方。与上述广告装载步骤流程相对应的广告匹配流程的具体步骤如下:
步骤201、从所接收到的广告请求中获取请求参数;
广告请求中的一系列参数可采用下述ReqParam对象的形式进行组织:
public class ReqParam{
private String vid;//视频id
private String s;//视频所对应的节目id
private String ct;//视频所属的一级分类,如:电视剧、电影、综艺、娱乐等
private String cs;//视频所属的二级分类,它有一个唯一对应的一级分类,如:大陆剧、港台剧、韩剧,等都是一级分类电视剧下的二级分类
private String provinceId;//当前用户所在的省,可通过用户请求中的ip信息获取
private String cityId;//当前用户所在的城市,可通过用户请求中的ip信息获取
private String uid;//上传当前视频的用户的账号(用户id)
private String t;//视频的播放时长
private String keyword;//视频请求所带的关键字
private String partnerid;//合作方id
}
步骤202、从广告请求的参数中获取第一级关键字列表;
根据广告请求参数reqParam,获取已排好序的当前级别map对应的key1列表;
步骤203、从第一级关键字列表取出一个未处理的第一级关键字key1,执 行步骤204;若第一级关键字列表为空或所有的关键字都处理完毕仍未找到可投放的广告,则转到步骤218;
步骤204、在第一级HashMap中(以下简称map1)匹配key1,获得key1对应的下一级HashMap(以下简称map2);
步骤205;从广告请求参数中获取以key1为上级关键字的第二级关键字列表;
步骤206、从第二级关键字列表取出一个未处理的第二级关键字key2,执行步骤207;若第二级关键字列表为空或所有的关键字都处理完毕仍未找到可投放的广告,则返回执行步骤203;
步骤207、在map2中匹配key2,获得key2对应的下一级HashMap(以下简称map3);
步骤208;从广告请求参数中获取以key2为上级关键字的第三级关键字列表;
步骤209、从第三级关键字列表取出一个未处理的第三级关键字key3,执行步骤210;若第三级关键字列表为空或所有的关键字都处理完毕仍未找到可投放的广告,则返回执行步骤206;
步骤210、在map3中匹配key3,获得key3对应的下一级HashMap(以下简称map4);
步骤211;从广告请求参数中获取以key3为上级关键字的第四级关键字列表;
步骤212、从第四级关键字列表取出一个未处理的第四级关键字key4,执行步骤213;若第四级关键字列表为空或所有的关键字都处理完毕仍未找到可投放的广告,则返回执行步骤209;
步骤213、在map4中匹配key4,获得key4对应的下一级HashMap(以下简称map5);
步骤214;从广告请求参数中获取以key4为上级关键字的第五级关键字列表;
步骤215、从第五级关键字列表取出一个未处理的第五级关键字key5,执行步骤216;若第五级关键字列表为空或所有的关键字都处理完毕仍未找到可投放的广告,则返回执行步骤212;
步骤216、在map5中匹配关键字key5,获得key5对应的广告素材列表adList;
步骤217、从adList的尾部依次向前查找可投放的广告,若查到可投放的广告,则返回对应的广告素材标识;若adList中的某个广告已投放完毕,则从adList中删除该广告的广告素材标识;若在adList中没有找到可投放的广告,则执行步骤215(即退回到上一级map)。
步骤218、返回空字符串,结束流程。
以附图2所示的投放条件树为例,按照上述规则进行遍历,其过程为:
(1)先从根节点向下查找,顺序依次为:k1v、k2n、k3o、k4s、k5s1;
(2)到达第五层后,取得第一个列表,然后从列表末尾开始向前访问,依次为:idm、id(m-1)、...、id1;
(3)到达第一个列表的最前端后,如果仍然未找到可投放的广告,则退回到上一层的k5s2;
(4)然后从k5s2再找到第二个列表,然后再从列表末尾开始向前访问,依次为:idn、id(n-1)、...、id(m+1)。
按上述规则,最终可完成对整个投放条件树的遍历。
实施实例一:
比如某视频网站,对其前贴广告(即视频播放之前播放的视频广告)投放的要求如下:
(1)要求能够提供视频组定投、人群定投、用户定投、关键字定投、地区定投+分类(频道)定投、分类定投等定投方式;
(2)要求能够提供对广告的N+限制功能;
(3)能够根据客户的重要性将客户划分为若干个等级,高等级客户的广告应该保证优先于低等级客户的广告投放,但是视频组定投和人群定投类的广告则不必根据客户等级来决定投放顺序;
(4)为提高用户体验,短视频(5分钟以内的视频)中,只能投放短前贴(时长不超过7秒钟),长视频(5分钟以上的视频)中,只能投放长前贴(时长大于7秒钟),但是视频组定投和人群定投类的广告则不受此限制;
根据上述要求,可以采用“5级HashMap+1级List”的组合数据结构来完成广告数据的缓存。下面对每一级的key的组成进行说明。
其中第一级的key作如下设置:
v:用于视频组(videogroup)定投、人群定投类广告,由于这类定投方式没有长广告只投长视频、短广告只投在短视频,以及没有根据客户级别决定投放顺序的,所以它们归为一类。
l:用于只投在长视频中的长广告。
s:用于只投在短视频中的短广告。
第二级key含义:
n:N+广告
f:非N+广告
第三级key含义:
a、b、c、d、e:分别表示A、B、C、D、E级客户的广告,级别依次降低
第四级key含义:
s:视频组定投的广告
c:人群定投广告
u:用户定投广告(广告只投放在指定的用户的视频中)
k:关键字定投广告
p:分类定投广告
第五级key含义:
由第四级key名称+key值组成,如:
c3:指定投放在白领女性(人群id为3)人群中的广告。
a11pd:指定投放在北京地区(省份id:11)且在电视剧分类(分类id:d)下的广告。
比如,某次广告请求,对应的参数值分别为:
遍历过程如下:
(1)先对五层的Map进行深度优先查找:key1=v->key2=n->key3=a->key4=s->key5=s13339;
(2)根据key5对应的value得到List,然后对List从列表尾部开始向前查找,如果找到一个满足投放条件(投放量未耗尽、且满足广告投放频次N+限制)的广告,就投放;否则退回到上一层的map中,再继续深度优先向下查找。
实施实例二:
如某网站对页面广告(即网页上除视频播放器内的视频广告之外的广告)的投放需求有:
(1)要求能够提供地区定投、用户定投、广告位(即网页上的某个指定位置)定投、关键字定投等四种定投方式,以及四种定投方式中的多个互相组合投放的方式;
(2)广告必须投放在网页上的某个广告位上,所以广告位是组合中的必选项。
根据上述要求,可以采用“2级HashMap+1级List”的组合数据结构来完 成广告数据的缓存。下面对每一级的key的组成进行说明:
其中第一级的key作如下设置:
aupk:地区+用户+分类+关键字定投广告
upk:用户+分类+关键字定投广告
apk:地区+分类+关键字定投广告
aup:地区+用户+分类定投广告
pk:分类+关键字定投广告
up:用户+分类定投广告
ap:地区+分类定投广告
p:分类定投广告
第二级key由第一级key名称+key值组成,如:
a11p47k新水浒:表示在apk(地区+广告位+关键字)定投方式中,指定投放在北京(省份ID为11)、投放位置为“首屏-顶部通栏”(广告位为:47),网页关键字含有:新水浒的页面的广告。
第三级的List中存放的内容仍然是广告素材ID,与实例一相同。
基于本发明实施例可知,本发明采用了树型数据结构来存储广告数据,相比于其它存储方式,大大节约了存储空间。常见的广告系统在进行广告投放时,往往是分别以不同的定向条件依次到广告队列中进行广告匹配,每次匹配都相当于对广告列表作了一次遍历,而本发明中,由于将所有待投放的广告根据优先级和投放条件分层组织起来形成一个树型的结构,匹配的过程即为对树的深度遍历的过程,其时间复杂度为线性时间复杂度,最多只需进行一次完整的对树的深度遍历即可完成全部广告匹配工作,因此,广告的匹配效率和投放效率更高,节省了大量服务器运算量。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。