一种网络投票方法和装置
技术领域
本发明涉及网络应用技术领域,特别涉及一种网络投票方法和装置。
背景技术
投票作为一种征集群众意向的方法,历来为人们所广泛使用。而借助于互联网技术实现的网络投票,也为投票这种常见的社会行为提供了一种全新的操作模式。网络投票解决了人们足不出户就可以投票的问题,票务统计方面计算机也代替了人们原始的手工算票,给投票带来了便利。
现有技术中,服务器端设置投票活动系统,投票活动系统中的投票活动数据存储在数据库中,投票活动数据包括投票活动名称、投票活动选项、参与投票的投票人、投票人所投票数等,数据库里的数据根据投票活动需求实时写入。
在实现本发明的过程中,发明人发现现有技术至少存在以下问题:
在多场次的大规模网络投票活动中,由于所需实时写入的数据量大,且数据库写入操作的速度有限制,服务器端难以支持投票活动的实时需求,造成了投票操作迟缓的现象。
发明内容
为了解决现有技术中网络投票技术中数据库的写入操作速度难以满足同时进行多场次的大规模网络投票活动的实时需求的问题,本发明实施例提供了一种网络投票方法和装置。所述技术方案如下:
一方面,本发明实施例提供了一种网络投票方法,所述方法包括:
根据投票配置总表确定当前正在进行的投票活动,所述投票活动总表包括投票活动ID和与所述投票活动ID对应的起始时间;
在投票活动与选项映射表中查找当前正在进行的投票活动的投票活动ID对应的记录并加载到内存中,所述投票活动ID对应的记录包括投票选项ID和投票选项;
接收投票人发送的投票信息,并从所述投票信息中解析出四元组记录或四元组记录的集合,所述四元组记录包括投票活动ID、投票人ID、投票选项ID和票数;
判断所述内存中是否存在所述四元组记录或四元组记录的集合中的投票活动ID、投票选项ID;
如果所述内存中存在所述四元组记录或四元组记录的集合中的投票活动ID、投票选项ID,则判断投票选项票数表中是否存在所述投票活动ID和投票选项ID对应的记录,所述投票选项票数表包括投票活动ID、投票选项ID以及票数;
如果所述投票选项票数表中不存在所述投票活动ID和投票选项ID对应的记录,则将所述四元组记录或四元组记录的集合中的投票活动ID、投票选项ID和票数插入所述投票选项票数表中;
如果投票选项票数表中存在所述投票活动ID和投票选项ID对应的记录,则将所述四元组记录或四元组记录的集合中的票数累加到所述投票选项票数表中的票数上;
定期将内存中的所述投票选项票数表写入到数据库中。
具体地,所述根据投票配置总表确定当前正在进行的投票活动,包括:
比较当前时间与所述投票活动配置总表中各个所述投票活动ID对应的起止时间;
如果所述当前时间处于所述投票活动配置总表中一个或多个起止时间内,则输出所述投票活动配置总表中一个或多个起止时间对应的所述投票活动ID。
具体地,所述方法还包括:
将所述投票选项票数表中的票数从高到低排序,并输出排序结果。
进一步地,所述将所述投票选项票数表中的票数从高到低排序,包括:
接收定时线程发送的信号;
当所述定时线程的信号指示达到预定时间间隔时,将所述投票选项票数表中的票数从高到低排序;或者,
当所述投票选项票数表中任一所述投票选项的票数改变时,将所述投票选项票数表中的票数从高到低排序。
具体地,所述方法还包括:
每秒将所述内存中的所述投票选项票数表写入非关系型的数据库中进行备份。
另一方面,本发明实施例还提供了一种网络投票装置,所述装置包括:
确定模块,用于根据投票配置总表确定当前正在进行的投票活动,所述投票活动总表包括投票活动ID和与所述投票活动ID对应的起始时间;
第一处理模块,用于在投票活动与选项映射表中查找当前正在进行的投票活动的投票活动ID对应的记录并加载到内存中,所述投票活动ID对应的记录包括投票选项ID和投票选项;
第二处理模块,用于接收投票人发送的投票信息,并从所述投票信息中解析出四元组记录或四元组记录的集合,所述四元组记录包括投票活动ID、投票人ID、投票选项ID和票数;
第一判断模块,用于判断所述内存中是否存在所述四元组记录或四元组记录的集合中的投票活动ID、投票选项ID;
第二判断模块,用于在所述内存中存在所述四元组记录或四元组记录的集合中的投票活动ID、投票选项ID时,判断投票选项票数表中是否存在所述投票活动ID和投票选项ID对应的记录,所述投票选项票数表包括投票活动ID、投票选项ID以及票数;
第三处理模块,用于在所述投票选项票数表中不存在所述投票活动ID和投票选项ID对应的记录时,将所述四元组记录或四元组记录的集合中的投票活动ID、投票选项ID和票数插入所述投票选项票数表中;
在投票选项票数表中存在所述投票活动ID和投票选项ID对应的记录时,将所述四元组记录或四元组记录的集合中的票数累加到所述投票选项票数表中的票数上;
第四处理模块,用于定期将内存中的所述投票选项票数表写入到数据库中。
具体地,所述确定模块包括:
比较单元,用于比较当前时间与所述投票活动配置总表中各个所述投票活动ID对应的起止时间;
输出单元,用于当所述当前时间处于所述投票活动配置总表中一个或多个起止时间内时,输出所述投票活动配置总表中一个或多个起止时间对应的所述投票活动ID。
具体地,所述装置还包括:
第五处理模块,用于将所述至少一个投票活动中的所述投票选项所获得的票数从高到低排序,并输出排序结果。
进一步地,所述第五处理模块包括:
接收单元,用于接收定时线程发送的信号;
处理单元,用于当所述定时线程的信号指示达到预定时间间隔时,将所述投票选项票数表中的票数从高到低排序;或者,
当所述投票选项票数表中任一所述投票选项的票数改变时,将所述投票选项票数表中的票数从高到低排序。
具体地,所述装置还包括:
第六处理模块,用于每秒将所述内存中的所述投票选项票数表写入非关系型的数据库中进行备份。
本发明实施例提供的技术方案带来的有益效果是:
通过先根据投票配置总表确定当前正在进行的投票活动;在投票活动与选项映射表中查找当前正在进行的投票活动的投票活动ID对应的记录并加载到内存中;然后接收投票人发送的投票信息,并从投票信息中解析出四元组记录或四元组记录的集合;其次,判断内存中是否存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID,若存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID,则判断投票选项票数表中是否存在投票活动ID和投票选项ID对应的记录,若存在,则将四元组记录或四元组记录的集合中的票数累加到投票选项票数表中的票数上,若不存在,则将四元组记录或四元组记录的集合中的投票活动ID、投票选项ID和票数插入投票选项票数表中;通过设置投票配置总表、投票活动与选项映射表和投票选项票数表以及之间的对应关系,可以方便对于投票活动数据的读写,从而可以满足多场次多类别的大规模网络投票活动的读写要求;另外,将投票活动ID对应的记录加载到内存,这种内存缓存的方法能有效缓解数据库的实时写入操作压力,同时避免了数据库造成的系统瓶颈,进而满足同时进行多场次多类别的大规模网络投票活动的实时需求;最后定期将内存中的投票选项票数表写入到数据库中,避免了因程序崩溃或断电等异常情况造成的内存数据丢失,保证了数据安全。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的应用场景图;
图2是本发明实施例一提供的一种网络投票方法流程图;
图3是本发明实施例二提供的一种网络投票方法流程图;
图4是本发明实施例三提供的一种网络投票装置的结构示意图;
图5是本发明实施例四提供的一种网络投票装置的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
为了便于实施例的描述,下面先简单介绍一下本发明中实施例的应用场景。参见图1,该场景中包括客户端101,客户端101可以是个人电脑、移动终端等设备。客户端101中设有可以进行网络投票的应用,用户可以采用该应用进行网络投票。客户端101与服务器102通过网络连接。服务器102接收用户通过客户端101发送的投票信息,并进行验票统计等功能。
需要说明的是,以上所述的设备种类及连接方式仅为举例,本发明对此不作限制。
实施例一
本发明实施例提供了一种网络投票方法,适用于网络投票服务器,参见图2,该方法流程包括:
步骤S11,根据投票配置总表确定当前正在进行的投票活动,该投票活动总表包括投票活动ID和与投票活动ID对应的起始时间。
具体地,每个投票活动对应有唯一的投票活动ID,投票配置总表存储在服务器中。
步骤S12,在投票活动与选项映射表中查找当前正在进行的投票活动的投票活动ID对应的记录并加载到内存中,该投票活动ID对应的记录包括投票选项ID和投票选项。
具体地,投票活动ID和投票选项ID唯一确定一个投票选项。对于不同的投票活动而言,投票选项可以是人,例如,在选秀投票活动中参与者可以对他所喜爱的选秀选手进行投票;也可以是纯粹的问题,例如,在意见征集投票活动中参与者可以对他所关注的问题进行投票。
具体地,投票活动与选项映射表用于存储投票活动与该投票活动选项的对应关系(即映射关系),该投票活动与选项映射表存储在服务器中。
具体地,投票活动ID对应的记录加载到内存中,采用了内存缓存的方法。将数据先存储在内存中,然后定期直接写入数据库,能有效缓解因频繁写入数据库操作给数据库带来的压力。
进一步地,投票活动ID对应的记录还可以包括投票活动类型,该投票活动类型包括单选型和多选型,单选型是投票人在参与的投票活动中只能选择一个投票选项进行投票;多选型是投票人在参与的投票活动中可以选择至少一个投票选项进行投票。
步骤S13,接收投票人发送的投票信息,并从投票信息中解析出四元组记录或四元组记录的集合,该四元组记录包括投票活动ID、投票人ID、投票选项ID和票数。
具体地,投票人ID包括用户身份标识和客户端地址中的至少一个。
在一种实现方式中,投票人可以在投票系统中进行注册,登陆投票系统参与投票活动,投票人以自身的用户名标识自己,投票人根据投票活动的信息中的投票活动ID,选择要参与的投票活动。在另一种实现方式中,投票人还可以采用匿名方式完成投票,投票人以自身的IP地址或MAC地址标识自己。服务器端可以通过设置实现,注册投票人和匿名投票人可以参与的投票活动的等级不同,注册投票人可以参与的投票活动的等级高于匿名投票人,即注册投票人相较于匿名投票人可以参与更多的投票活动。
对于注册的投票人来说,投票人注册用户后会有一个唯一的用户名,投票人凭借这个用户名参与投票活动,投票系统对每个用户名的投票活动都有相应的规定限制(例如,每个用户身份在同一个投票活动中只能投出规定数量的选票),防止投票人的刷票行为。
另外,在默认情况下,投票人对于所选择的投票选项只能投一票。因此,在这种默认情况下,投票信息中也可以不携带票数选项。
具体地,根据投票信息,在网络投票服务器中设置投票选项票数表和投票人票数表,通过投票选项票数表和投票人票数表统计投票选项票数和投票人票数。由于参与网络投票的投票人数可能会很多,可以在投票人票数表上进行分表操作。例如,一般的数据库单表可以高效支撑百万以上的数据集,分十张表,就可以支持千万级的投票人规模。
步骤S14,判断内存中是否存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID。
如果内存中存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID,则执行步骤S15。如果内存中不存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID,则四元组记录或四元组记录的集合为无效数据,相应的将此无效数据删除。
步骤S15,判断投票选项票数表中是否存在投票活动ID和投票选项ID对应的记录,投票选项票数表包括投票活动ID、投票选项ID以及票数。
如果投票选项票数表中存在投票活动ID和投票选项ID对应的记录,则执行步骤S16;如果投票选项票数表中不存在投票活动ID和投票选项ID对应的记录,则执行步骤S17。
步骤S16,将四元组记录或四元组记录的集合中的票数累加到投票选项票数表中的票数上。
步骤S17,将四元组记录或四元组记录的集合中的投票活动ID、投票选项ID和票数插入投票选项票数表中。
步骤S18,定期将内存中的投票选项票数表写入到数据库中。
具体地,这里将存储在内存里的投票选项票数表定期写入数据库中,可以采用成组提交技术,再配合步骤S12中采用的内存缓存技术,能更有效减缓因频繁写入数据库操作给数据库带来的压力,使得数据库操作不成为投票系统的瓶颈。
此外,为防止程序崩溃造成内存缓存丢失,可以采用非关系型的数据库(NotOnly SQL,简称“NoSQL”),作为内存数据备份。另外,将数据写入内存时,可以使用mmap技术进行数据持久化,减少故障的几率。
本发明实施例通过先根据投票配置总表确定当前正在进行的投票活动;在投票活动与选项映射表中查找当前正在进行的投票活动的投票活动ID对应的记录并加载到内存中;然后接收投票人发送的投票信息,并从投票信息中解析出四元组记录或四元组记录的集合;其次,判断内存中是否存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID,若存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID,则判断投票选项票数表中是否存在投票活动ID和投票选项ID对应的记录,若存在,则将四元组记录或四元组记录的集合中的票数累加到投票选项票数表中的票数上,若不存在,则将四元组记录或四元组记录的集合中的投票活动ID、投票选项ID和票数插入投票选项票数表中;通过设置投票配置总表、投票活动与选项映射表和投票选项票数表以及之间的对应关系,可以方便对于投票活动数据的读写,从而可以满足多场次多类别的大规模网络投票活动的读写要求;另外,将投票活动ID对应的记录加载到内存,这种内存缓存的方法能有效缓解数据库的实时写入操作压力,同时避免了数据库造成的系统瓶颈,进而满足同时进行多场次多类别的大规模网络投票活动的实时需求;最后定期将内存中的投票选项票数表写入到数据库中,避免了因程序崩溃或断电等异常情况造成的内存数据丢失,保证了数据安全。
实施例二
本发明实施例提供了一种网络投票方法,适用于网络投票服务器,参见图3,该方法流程包括:
步骤S21,根据投票配置总表确定当前正在进行的投票活动,该投票活动总表包括投票活动ID和与投票活动ID对应的起始时间。
具体地,每个投票活动对应有唯一的投票活动ID,投票配置总表存储在服务器中。
优选的,网络投票装置所使用的服务器采用Linux下多路复用I/O接口select/poll的增强版本epoll,以及C++高性能服务器编程技术,硬件配置多核CPU,这样能加大服务器接入层的吞吐量,提高服务器应对大规模投票的能力。
具体地,步骤S21可以通过以下方式实现:
步骤一,比较当前时间与投票活动配置总表中各个投票活动ID对应的起止时间。
具体地,当前时间可以是根据服务器中的时钟模块获得的系统时间,也可以是根据服务器中的网络模块获得的网络时间。
步骤二,如果该当前时间处于投票活动配置总表中一个或多个起止时间内,则输出该投票活动配置总表中一个或多个起止时间对应的投票活动ID。
例如,当前时间为2013年2月11日12时整,活动配置总表中的一个投票活动的起始时间为2013年2月10日0时至2013年2月16日24时,此时就能确定当前时间处于该起止时间内,进而输出该起始时间对应的投票活动的信息。通过上述步骤,可以避免输出过期的投票活动或者未开启的投票活动。
步骤S22,在投票活动与选项映射表中查找当前正在进行的投票活动的投票活动ID对应的记录并加载到内存中,该投票活动ID对应的记录包括投票选项ID和投票选项。
具体地,投票活动ID和投票选项ID唯一确定一个投票选项。对于不同的投票活动而言,投票选项可以是人,例如,在选秀投票活动中参与者可以对他所喜爱的选秀选手进行投票;也可以是纯粹的问题,例如,在意见征集投票活动中参与者可以对他所关注的问题进行投票。
具体地,投票活动与选项映射表用于存储投票活动与该投票活动选项的对应关系(即映射关系),该投票活动与选项映射表存储在服务器中。
具体地,投票活动ID对应的记录加载到内存中,采用了内存缓存的方法。将数据先存储在内存中,然后定期写入数据库,能有效缓解因频繁读写数据库操作给数据库带来的压力。
进一步地,投票活动ID对应的记录还可以包括投票活动类型,该投票活动类型包括单选型和多选型,单选型是投票人在参与的投票活动中只能选择一个投票选项进行投票;多选型是投票人在参与的投票活动中可以选择至少一个投票选项进行投票。
步骤S23,接收投票人发送的投票信息,并从投票信息中解析出四元组记录或四元组记录的集合,该四元组记录包括投票活动ID、投票人ID、投票选项ID和票数。
具体地,投票人ID包括用户身份标识和客户端地址中的至少一个。
在一种实现方式中,投票人可以在投票系统中进行注册,登陆投票系统参与投票活动,投票人以自身的用户名标识自己,投票人根据投票活动的信息中的投票活动ID,选择要参与的投票活动。在另一种实现方式中,投票人还可以采用匿名方式完成投票,投票人以自身的IP地址或MAC地址标识自己。服务器端可以通过设置实现,注册投票人和匿名投票人可以参与的投票活动的等级不同,注册投票人可以参与的投票活动的等级高于匿名投票人,即注册投票人相较于匿名投票人可以参与更多的投票活动。
对于注册的投票人来说,投票人注册用户后会有一个唯一的用户名,投票人凭借这个用户名参与投票活动,投票系统对每个用户名的投票活动都有相应的规定限制(例如,每个用户身份在同一个投票活动中只能投出规定数量的选票),防止投票人的刷票行为。
另外,在默认情况下,投票人对于所选择的投票选项只能投一票。因此,在这种默认情况下,投票信息中也可以不携带票数选项。
具体地,根据投票信息,在网络投票服务器中设置投票选项票数表和投票人票数表,通过投票选项票数表和投票人票数表统计投票选项票数和投票人票数。由于参与网络投票的投票人数可能会很多,可以在投票人票数表上进行分表操作。例如,一般的数据库单表可以高效支撑百万以上的数据集,分十张表,就可以支持千万级的投票人规模。
步骤S24,判断内存中是否存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID。
如果内存中存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID,则执行步骤S25。如果内存中不存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID,则四元组记录或四元组记录的集合为无效数据,相应的将此无效数据删除。
步骤S25,判断投票选项票数表中是否存在投票活动ID和投票选项ID对应的记录,投票选项票数表包括投票活动ID、投票选项ID以及票数。
如果投票选项票数表中存在投票活动ID和投票选项ID对应的记录,则执行步骤S26;如果投票选项票数表中不存在投票活动ID和投票选项ID对应的记录,则执行步骤S27。
步骤S26,将四元组记录或四元组记录的集合中的票数累加到投票选项票数表中的票数上。
步骤S27,将四元组记录或四元组记录的集合中的投票活动ID、投票选项ID和票数插入投票选项票数表中。
步骤S28,将投票选项票数表中的票数从高到低排序,并输出排序结果。
具体地,步骤S28可以通过以下方式实现:
接收定时线程发送的信号。
当定时线程的信号指示达到预定时间间隔时,将投票选项票数表中的票数从高到低排序;或者,
当投票选项票数表中任一投票选项的票数改变时,将投票选项票数表中的票数从高到低排序。
其中,第二种实现方式中,一旦投票活动票数改变就会进行排序,保证了排序的实时性,通过发布实时的投票结果来吸引投票人关注投票活动,增加投票活动的关注度。
此外,在实际应用中,还可以统计参与一个投票活动的每个投票人所投的票数,并将各个投票人参与该投票活动所投的票数从高到低排序,可以生成投票人投票数的“土豪榜”,通过“土豪榜”来吸引投票人的关注,并参与到投票活动中来。另外,有些投票活动需要限制每个投票人的投票总数,避免刷票行为,统计投票人的投票总数可以防止超过该限制。
步骤S29,每秒将内存中的投票选项票数表写入非关系型的数据库中进行备份。
具体地,为防止程序崩溃造成内存缓存丢失,可以采用NoSQL作为内存数据备份。另外,将数据写入内存时,可以使用mmap技术进行数据持久化,减少故障的几率。
步骤S30,定期将内存中的投票选项票数表写入到数据库中。
具体地,这里将存储在内存里的投票选项票数表定期写入数据库中,可以采用成组提交技术,再配合步骤S22中采用的内存缓存技术,能更有效减缓因频繁写入数据库操作给数据库带来的压力,使得数据库操作不成为投票系统的瓶颈。
本发明实施例通过先根据投票配置总表确定当前正在进行的投票活动;在投票活动与选项映射表中查找当前正在进行的投票活动的投票活动ID对应的记录并加载到内存中;然后接收投票人发送的投票信息,并从投票信息中解析出四元组记录或四元组记录的集合;其次,判断内存中是否存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID,若存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID,则判断投票选项票数表中是否存在投票活动ID和投票选项ID对应的记录,若存在,则将四元组记录或四元组记录的集合中的票数累加到投票选项票数表中的票数上,若不存在,则将四元组记录或四元组记录的集合中的投票活动ID、投票选项ID和票数插入投票选项票数表中;通过设置投票配置总表、投票活动与选项映射表和投票选项票数表以及之间的对应关系,可以方便对于投票活动数据的读写,从而可以满足多场次多类别的大规模网络投票活动的读写要求;另外,将投票活动ID对应的记录加载到内存,这种内存缓存的方法能有效缓解数据库的实时写入操作压力,同时避免了数据库造成的系统瓶颈,进而满足同时进行多场次多类别的大规模网络投票活动的实时需求;最后定期将内存中的投票选项票数表写入到数据库中,避免了因程序崩溃或断电等异常情况造成的内存数据丢失,保证了数据安全。
实施例三
本发明实施例提供了一种网络投票装置,该装置可以与投票服务器连接,也可以设置在投票服务器上,参见图4,该装置包括:
确定模块301,用于根据投票配置总表确定当前正在进行的投票活动,该投票活动总表包括投票活动ID和与投票活动ID对应的起始时间。
具体地,每个投票活动对应有唯一的投票活动ID,投票配置总表存储在服务器中。
优选的,网络投票装置所使用的服务器采用Linux下多路复用I/O接口select/poll的增强版本epoll,以及C++高性能服务器编程技术,硬件配置多核CPU,这样能加大服务器接入层的吞吐量,提高服务器应对大规模投票的能力。
第一处理模块302,用于在投票活动与选项映射表中查找当前正在进行的投票活动的投票活动ID对应的记录并加载到内存中,该投票活动ID对应的记录包括投票选项ID和投票选项。
具体地,投票活动ID和投票选项ID唯一确定一个投票选项。对于不同的投票活动而言,投票选项可以是人,例如,在选秀投票活动中参与者可以对他所喜爱的选秀选手进行投票;也可以是纯粹的问题,例如,在意见征集投票活动中参与者可以对他所关注的问题进行投票。
具体地,投票活动与选项映射表用于存储投票活动与该投票活动选项的对应关系(即映射关系),该投票活动与选项映射表存储在服务器中。
具体地,投票活动ID对应的记录加载到内存中,采用了内存缓存的方法。将数据先存储在内存中,然后定期直接写入数据库,能有效缓解因频繁写入数据库操作给数据库带来的压力。
进一步地,投票活动ID对应的记录还可以包括投票活动类型,该投票活动类型包括单选型和多选型,单选型是投票人在参与的投票活动中只能选择一个投票选项进行投票;多选型是投票人在参与的投票活动中可以选择至少一个投票选项进行投票。
第二处理模块303,用于接收投票人发送的投票信息,并从投票信息中解析出四元组记录或四元组记录的集合,该四元组记录包括投票活动ID、投票人ID、投票选项ID和票数。
具体地,投票人ID包括用户身份标识和客户端地址中的至少一个。
在一种实现方式中,投票人可以在投票系统中进行注册,登陆投票系统参与投票活动,投票人以自身的用户名标识自己,投票人根据投票活动的信息中的投票活动ID,选择要参与的投票活动。在另一种实现方式中,投票人还可以采用匿名方式完成投票,投票人以自身的IP地址或MAC地址标识自己。服务器端可以通过设置实现,注册投票人和匿名投票人可以参与的投票活动的等级不同,注册投票人可以参与的投票活动的等级高于匿名投票人,即注册投票人相较于匿名投票人可以参与更多的投票活动。
对于注册的投票人来说,投票人注册用户后会有一个唯一的用户名,投票人凭借这个用户名参与投票活动,投票系统对每个用户名的投票活动都有相应的规定限制(例如,每个用户身份在同一个投票活动中只能投出规定数量的选票),防止投票人的刷票行为。
另外,在默认情况下,投票人对于所选择的投票选项只能投一票。因此,在这种默认情况下,投票信息中也可以不携带票数选项。
具体地,根据投票信息,在网络投票服务器中设置投票选项票数表和投票人票数表,通过投票选项票数表和投票人票数表统计投票选项票数和投票人票数。由于参与网络投票的投票人数可能会很多,可以在投票人票数表上进行分表操作。例如,一般的数据库单表可以高效支撑百万以上的数据集,分十张表,就可以支持千万级的投票人规模。
第一判断模块304,用于判断内存中是否存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID。
第二判断模块305,用于在内存中存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID时,判断投票选项票数表中是否存在投票活动ID和投票选项ID对应的记录,投票选项票数表包括投票活动ID、投票选项ID以及票数。
此外,如果内存中不存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID,则四元组记录或四元组记录的集合为无效数据,相应的将此无效数据删除。
第三处理模块306,用于投票选项票数表中不存在投票活动ID和投票选项ID对应的记录时,将四元组记录或四元组记录的集合中的投票活动ID、投票选项ID和票数插入投票选项票数表中;
在投票选项票数表中存在投票活动ID和投票选项ID对应的记录时,将四元组记录或四元组记录的集合中的票数累加到投票选项票数表中的票数上。
第四处理模块307,用于定期将内存中的投票选项票数表写入到数据库中。
具体地,这里将存储在内存里的投票选项票数表定期写入数据库中,可以采用成组提交技术,再配合内存缓存技术,能更有效减缓因频繁写入数据库操作给数据库带来的压力,使得数据库操作不成为投票系统的瓶颈。
此外,为防止程序崩溃造成内存缓存丢失,可以采用NoSQL作为内存数据备份。另外,将数据写入内存时,可以使用mmap技术进行数据持久化,减少故障的几率。
本发明实施例通过先根据投票配置总表确定当前正在进行的投票活动;在投票活动与选项映射表中查找当前正在进行的投票活动的投票活动ID对应的记录并加载到内存中;然后接收投票人发送的投票信息,并从投票信息中解析出四元组记录或四元组记录的集合;其次,判断内存中是否存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID,若存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID,则判断投票选项票数表中是否存在投票活动ID和投票选项ID对应的记录,若存在,则将四元组记录或四元组记录的集合中的票数累加到投票选项票数表中的票数上,若不存在,则将四元组记录或四元组记录的集合中的投票活动ID、投票选项ID和票数插入投票选项票数表中;通过设置投票配置总表、投票活动与选项映射表和投票选项票数表以及之间的对应关系,可以方便对于投票活动数据的读写,从而可以满足多场次多类别的大规模网络投票活动的读写要求;另外,将投票活动ID对应的记录加载到内存,这种内存缓存的方法能有效缓解数据库的实时写入操作压力,同时避免了数据库造成的系统瓶颈,进而满足同时进行多场次多类别的大规模网络投票活动的实时需求;最后定期将内存中的投票选项票数表写入到数据库中,避免了因程序崩溃或断电等异常情况造成的内存数据丢失,保证了数据安全。
实施例四
本发明实施例提供了一种网络投票装置,该装置可以与投票服务器连接,也可以设置在投票服务器上,参见图5,该装置包括:
确定模块401,用于根据投票配置总表确定当前正在进行的投票活动,该投票活动总表包括投票活动ID和与投票活动ID对应的起始时间。
具体地,每个投票活动对应有唯一的投票活动ID,投票配置总表存储在服务器中。
优选的,网络投票装置所使用的服务器采用Linux下多路复用I/O接口select/poll的增强版本epoll,以及C++高性能服务器编程技术,硬件配置多核CPU,这样能加大服务器接入层的吞吐量,提高服务器应对大规模投票的能力。
具体地,确定模块401包括:
比较单元411,用于比较当前时间与投票活动配置总表中各个投票活动ID对应的起止时间。
具体地,当前时间可以是根据服务器中的时钟模块获得的系统时间,也可以是根据服务器中的网络模块获得的网络时间。
输出单元421,用于当该当前时间处于投票活动配置总表中一个或多个起止时间内时,则输出该投票活动配置总表中一个或多个起止时间对应的投票活动ID。
例如,当前时间为2013年2月11日12时整,活动配置总表中的一个投票活动的起始时间为2013年2月10日0时至2013年2月16日24时,此时就能确定当前时间处于该起止时间内,进而输出该起始时间对应的投票活动的信息。通过上述步骤,可以避免输出过期的投票活动或者未开启的投票活动。
第一处理模块402,用于在投票活动与选项映射表中查找当前正在进行的投票活动的投票活动ID对应的记录并加载到内存中,该投票活动ID对应的记录包括投票选项ID和投票选项。
具体地,投票活动ID和投票选项ID唯一确定一个投票选项。对于不同的投票活动而言,投票选项可以是人,例如,在选秀投票活动中参与者可以对他所喜爱的选秀选手进行投票;也可以是纯粹的问题,例如,在意见征集投票活动中参与者可以对他所关注的问题进行投票。
具体地,投票活动与选项映射表用于存储投票活动与该投票活动选项的对应关系(即映射关系),该投票活动与选项映射表存储在服务器中。
具体地,投票活动ID对应的记录加载到内存中,采用了内存缓存的方法。将数据先存储在内存中,然后定期直接写入数据库,能有效缓解因频繁写入数据库操作给数据库带来的压力。
进一步地,投票活动ID对应的记录还可以包括投票活动类型,该投票活动类型包括单选型和多选型,单选型是投票人在参与的投票活动中只能选择一个投票选项进行投票;多选型是投票人在参与的投票活动中可以选择至少一个投票选项进行投票。
第二处理模块403,用于接收投票人发送的投票信息,并从投票信息中解析出四元组记录或四元组记录的集合,该四元组记录包括投票活动ID、投票人ID、投票选项ID和票数。
具体地,投票人ID包括用户身份标识和客户端地址中的至少一个。
在一种实现方式中,投票人可以在投票系统中进行注册,登陆投票系统参与投票活动,投票人以自身的用户名标识自己,投票人根据投票活动的信息中的投票活动ID,选择要参与的投票活动。在另一种实现方式中,投票人还可以采用匿名方式完成投票,投票人以自身的IP地址或MAC地址标识自己。服务器端可以通过设置实现,注册投票人和匿名投票人可以参与的投票活动的等级不同,注册投票人可以参与的投票活动的等级高于匿名投票人,即注册投票人相较于匿名投票人可以参与更多的投票活动。
对于注册的投票人来说,投票人注册用户后会有一个唯一的用户名,投票人凭借这个用户名参与投票活动,投票系统对每个用户名的投票活动都有相应的规定限制(例如,每个用户身份在同一个投票活动中只能投出规定数量的选票),防止投票人的刷票行为。
另外,在默认情况下,投票人对于所选择的投票选项只能投一票。因此,在这种默认情况下,投票信息中也可以不携带票数选项。
具体地,根据投票信息,在网络投票服务器中设置投票选项票数表和投票人票数表,通过投票选项票数表和投票人票数表统计投票选项票数和投票人票数。由于参与网络投票的投票人数可能会很多,可以在投票人票数表上进行分表操作。例如,一般的数据库单表可以高效支撑百万以上的数据集,分十张表,就可以支持千万级的投票人规模。
第一判断模块404,用于判断内存中是否存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID。
第二判断模块405,用于在内存中存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID时,判断投票选项票数表中是否存在投票活动ID和投票选项ID对应的记录,投票选项票数表包括投票活动ID、投票选项ID以及票数。
此外,如果内存中不存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID,则四元组记录或四元组记录的集合为无效数据,相应的将此无效数据删除。
第三处理模块406,用于投票选项票数表中不存在投票活动ID和投票选项ID对应的记录时,将四元组记录或四元组记录的集合中的投票活动ID、投票选项ID和票数插入投票选项票数表中;
在投票选项票数表中存在投票活动ID和投票选项ID对应的记录时,将四元组记录或四元组记录的集合中的票数累加到投票选项票数表中的票数上。
第五处理模块407,用于将投票选项票数表中的票数从高到低排序,并输出排序结果。
具体地,第五处理模块407包括:
接收单元417,用于接收定时线程发送的信号。
处理单元427,用于当定时线程的信号指示达到预定时间间隔时,将投票选项票数表中的票数从高到低排序;或者,
当投票选项票数表中任一投票选项的票数改变时,将投票选项票数表中的票数从高到低排序。
其中,第二种实现方式中,一旦投票活动票数改变就会进行排序,保证了排序的实时性,通过发布实时的投票结果来吸引投票人关注投票活动,增加投票活动的关注度。
此外,在实际应用中,还可以统计参与一个投票活动的每个投票人所投的票数,并将各个投票人参与该投票活动所投的票数从高到低排序,可以生成投票人投票数的“土豪榜”,通过“土豪榜”来吸引投票人的关注,并参与到投票活动中来。另外,有些投票活动需要限制每个投票人的投票总数,避免刷票行为,统计投票人的投票总数可以防止超过该限制。
第六处理模块408,用于每秒将内存中的投票选项票数表写入非关系型的数据库中进行备份。
具体地,为防止程序崩溃造成内存缓存丢失,可以采用NoSQL作为内存数据备份。另外,将数据写入内存时,可以使用mmap技术进行数据持久化,减少故障的几率。
第四处理模块409,用于定期将内存中的投票选项票数表写入到数据库中。
具体地,这里将存储在内存里的投票选项票数表定期写入数据库中,可以采用成组提交技术,再配合内存缓存技术,能更有效减缓因频繁写入数据库操作给数据库带来的压力,使得数据库操作不成为投票系统的瓶颈。
本发明实施例通过先根据投票配置总表确定当前正在进行的投票活动;在投票活动与选项映射表中查找当前正在进行的投票活动的投票活动ID对应的记录并加载到内存中;然后接收投票人发送的投票信息,并从投票信息中解析出四元组记录或四元组记录的集合;其次,判断内存中是否存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID,若存在四元组记录或四元组记录的集合中的投票活动ID、投票选项ID,则判断投票选项票数表中是否存在投票活动ID和投票选项ID对应的记录,若存在,则将四元组记录或四元组记录的集合中的票数累加到投票选项票数表中的票数上,若不存在,则将四元组记录或四元组记录的集合中的投票活动ID、投票选项ID和票数插入投票选项票数表中;通过设置投票配置总表、投票活动与选项映射表和投票选项票数表以及之间的对应关系,可以方便对于投票活动数据的读写,从而可以满足多场次多类别的大规模网络投票活动的读写要求;另外,将投票活动ID对应的记录加载到内存,这种内存缓存的方法能有效缓解数据库的实时写入操作压力,同时避免了数据库造成的系统瓶颈,进而满足同时进行多场次多类别的大规模网络投票活动的实时需求;最后定期将内存中的投票选项票数表写入到数据库中,避免了因程序崩溃或断电等异常情况造成的内存数据丢失,保证了数据安全。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。