关于某彩票活动的总结
具体需求,每个用户进活动页面,领取一个号码,1000中的一个;
活动要求
1,随机性,一定要有随机性;
2,最少中奖概率,如果注数为3200注,则最多中4注
3,效率问题,(不能每个人来都产生一个随机数,这样效率不高);
4,支持断电(仍然从下一个开始),重启服务;(存数据库有点大材小用,因此不能存放在数据库)
解决方案
1,事先产生随机数1000个,并打乱数据(initHaoPool)
2,算法采用,计数,从1开始,领到1000个,又重新从1开始
3,不能存放数据库,
第一想法,那就存放在action里;action在struts2中不是安全的,有多个实例,否定
第二想法,放在service里,由于service是单例,可以保证线程安全;
(因此我以service的领号顺序为主,memcahe中的当备份使用,当主站重启时,memcahe还可以获取)
后来第二个方法也出问题了,3G站的领号不按顺序,为什么呢
原来我们的服务器采用双IP,2套代码服务,通过切换IP达到临时换包的效果;
假设线上服务器为A,由于3G站的HOST指到了B上,因此2套代码中的service都是独立的;
第三想法,放在memcache中,以memcache为主,service的为备份,这样就保证了代码的正确性;
但是后来又出问题了,早上10点13分,领号的数据又重复了,原因是当时同事切换了服务器,2台服务器代码都是不一致的,又导致了错误。
总结一下;在分布式环境下,要保持数据的一致性,放代码实在不可靠,
第一选择 是数据库
第二选择 是cache
最后才是 action,但这个保存不住,实在有问题;
下面是代码
/**
* 初始化号码池
*
* @return
*/
public void initHaoPool() {
//如果action中的结果集和缓存中的结果集都为空,则初始化;
if(hl==null&&CacheDataService.getCacheObject("<webactivityList>hl")==null){
hl = new ArrayList<String>();
//生成1000个号码
for (int i = 0; i < 1000; i++)
{
String randomNo="";
if (i < 10) {
randomNo= "00" + i;
}
else if (i < 100 && i >= 10) {
randomNo= "0" + i;
}else{
randomNo=Integer.valueOf(i).toString();
}
hl.add(randomNo);
}
//打乱顺序
Collections.shuffle(hl);
//初始lhkey为0;
lhkey=0;
CacheDataService.setCacheObject("<webactivityList>hl", hl, 60*60*24);
CacheDataService.setCacheObject("<webactivityInteger>lhkey", lhkey, 60*60*24);
}
}
/**
* 清除号码池和缓存
*
* @return
*/
public void clearPoolCache() {
hl=null;
lhkey=0;
//清除缓存;
CacheDataService.deleteCacheObject("<webactivityList>hl");
CacheDataService.deleteCacheObject("<webactivityInteger>lhkey");
}
/**
* 随机领取号码
*
* @return
*/
public synchronized String getMyNumber(){
String myno="";
// 如果丢失,从cache中取;
// if(hl==null){
// hl= (List)CacheDataService.getCacheObject("<webactivityList>hl");
// lhkey= (Integer)CacheDataService.getCacheObject("<webactivityInteger>lhkey");
// }
//如果丢失,从memcache中取;
if((List)CacheDataService.getCacheObject("<webactivityList>hl")!=null){
hl= (List)CacheDataService.getCacheObject("<webactivityList>hl");
lhkey= (Integer)CacheDataService.getCacheObject("<webactivityInteger>lhkey");
}
if(lhkey<1000){
myno=(String)hl.get(lhkey);
lhkey=lhkey+1;
}else{
//System.out.println("从0开始循环--------------");
myno=(String)hl.get(0);
lhkey=1;
}
//更新缓存信息
CacheDataService.setCacheObject("<webactivityList>hl", hl, 60*60*24);
CacheDataService.setCacheObject("<webactivityInteger>lhkey", lhkey, 60*60*24);
return myno;
}
分享到:
相关推荐
游戏新手卡领号程序管理系统是蓝色... 游戏新手卡领号程序 2.5 更新内容:2011-09-20 1、修正了前台部分js错误 2、添加伪静态功能 3、商业版添加批量导入功能 4、商业版添加淘卡中心 系统简介: 1、系统包括卡号管理、
游戏新手卡领号程序管理系统是蓝色动力网络自主开发的一套用于游戏推广的领号程序,采用php mysql,后台使用了ExtJs,让操作更简单,界面更漂亮! 该程序适合做个人博客,实现了伪静态功能,更利于seo。 游戏新手卡...
京东多账号批量领券.py
这是业余做的淘宝多帐号全自动领淘金币,易写的,需要的就下吧,由于是免费用,请在软件里点设下主页作为支持,如报毒属误报,放心用。
游戏新手卡领号程序管理系统是蓝色动力网络自主开发的一套用于游戏推广的领号程序,采用php+mysql,后台使用了ExtJs,让操作更简单,界面更漂亮! 该程序适合做个人博客,实现了伪静态功能,更利于seo。 游戏...
商务礼仪(领带和丝巾)1121.pptx
游戏新手卡领号程序.zip
实现效果: HTML5手机验证抽奖领券代码,这个要先输入手机号码,才能够进行抽奖,这样也会知道是谁中了什么奖,个人觉的这样的效果是非常不错的,php中文网推荐下载!
新一代智能间接蒸发冷却解决方案白皮书(“智领DC计划”401号).pdf
php 游戏新手卡领号程序管理系统.zip
活动策划 -领克汽车上市发布会活动策划方案.pptx
领旗录音电话
基于PHP的游戏新手卡领号程序管理系统.zip
html5端午节领卷输入手机号验证代码
西服领结图片创意封面,飞机云朵、手机、热咖啡、灯泡、世界地图、奖杯、漏斗、灯泡拼图等商务创意卡通风素材,扁平化卡通风设计,适合工作总结、工作汇报的西服领结图片创意封面精美卡通风商务ppt模板。
领红包邀请好友活动手机页面
生产补料单一般是在生产过程中,因为生产损耗过多或其他原因造成生产...开具生产补料单时,应该保证生产领料已经领完应领数量。但是U8系统没有限制到该点,所以创建触发器卡控生产补料单在保存的时候检查领料的状态。
在工会带领下的教学大讨论工作总结范文.doc
基于PHP的游戏新手卡领号程序管理系统源码.zip
活动领导致欢迎词精选.doc