当前位置: 首页 > wzjs >正文

企业网站建设服务好石家庄做网站最好的公司

企业网站建设服务好,石家庄做网站最好的公司,wordpress 上传文件 插件,做企业网站的轻量级cms前言: 高并发的活动预热肯定不可以在数据库操作,需要redis,特别是这种秒杀活动更是需要注意,所以可以在高并发的前夕先进行活动预热。 思路: 1、 通过定时任务调度每分钟查询数据库也没有需要预热的活动 2、采用分布式…

前言:

        高并发的活动预热肯定不可以在数据库操作,需要redis,特别是这种秒杀活动更是需要注意,所以可以在高并发的前夕先进行活动预热。

 思路:

       1、 通过定时任务调度每分钟查询数据库也没有需要预热的活动

        2、采用分布式锁防止任务重复调度

        3、查询到预热活动需要信息全部进行redis存储

        4、生成令牌桶

                  细节:生成总奖品个数个令牌

                             每个令牌生成开始到结束时间的一个随机数

                              乘上1000,在额外加上一个三位数的随机数  ------防止奖品过多令牌重复

                              把令牌放入令牌桶

                              设置令牌和奖品的关系

        5、先按照时间大小排序,在压入redis

        6、改变预热状态

    @Scheduled(cron = "0 * * * * ?")public void execute() {//TODO 缓存预热// 获取当前时间的Calendar实例Calendar calendar = Calendar.getInstance();// 清除毫秒部分calendar.set(Calendar.MILLISECOND, 0);// 获取不带毫秒的Date对象Date now = calendar.getTime();//分布式锁,防止重复启动任务if (!redisUtil.setNx("game_task_"+now.getTime(),1,60L)){log.info("task started by another server!");return;}//查询将来1分钟内要开始的活动QueryWrapper<CardGame> gameQueryWrapper = new QueryWrapper<>();//开始时间大于当前时间gameQueryWrapper.gt("starttime",now);//小于等于(当前时间+1分钟)gameQueryWrapper.le("starttime",DateUtils.addMinutes(now,1));List<CardGame> list = gameService.list(gameQueryWrapper);if(list.size() == 0){//没有查到要开始的活动log.info("没有查到要开始的活动");return;}log.info("需要缓存预热的活动个数:{}",list.size());//有相关活动数据,则将活动数据预热,进redislist.forEach(game ->{//活动开始时间long start = game.getStarttime().getTime();//活动结束时间long end = game.getEndtime().getTime();//计算活动结束时间到现在还有多少秒,作为redis key过期时间long expire = (end - now.getTime())/1000;
//            long expire = -1; //永不过期//活动持续时间(ms)long duration = end - start;Map queryMap = new HashMap();queryMap.put("gameid",game.getId());//活动基本信息game.setStatus(1);redisUtil.set(RedisKeys.INFO+game.getId(),game,-1);log.info("活动ID:{},名称:{},开始:{},结束{}", game.getId(),game.getTitle(),game.getStarttime(),game.getEndtime());//活动奖品信息List<CardProductDto> products = gameLoadService.getByGameId(game.getId());Map<Integer,CardProduct> productMap = new HashMap<>(products.size());products.forEach(p -> {productMap.put(p.getId(),p);});//奖品数量等配置信息List<CardGameProduct> gameProducts = gameProductService.listByMap(queryMap);//令牌桶List<Long> tokenList = new ArrayList();gameProducts.forEach(cgp ->{//生成amount个start到end之间的随机时间戳做令牌for (int i = 0; i < cgp.getAmount(); i++) {long rnd = start + new Random().nextInt((int)duration);//为什么乘1000,再额外加一个随机数呢? - 防止时间段奖品多时重复//记得取令牌判断时间时,除以1000,还原真正的时间戳long token = rnd * 1000 + new Random().nextInt(999);//将令牌放入令牌桶tokenList.add(token);//token到实际奖品之间建立映射关系redisUtil.set(RedisKeys.TOKEN + game.getId() +"_"+token,productMap.get(cgp.getProductid()),expire);}});//排序后放入redis队列Collections.sort(tokenList);log.info("load tokens:{}",tokenList);//从右侧压入队列,从左到右,时间戳逐个增大redisUtil.rightPushAll(RedisKeys.TOKENS + game.getId(),tokenList);redisUtil.expire(RedisKeys.TOKENS + game.getId(),expire);//奖品策略配置信息List<CardGameRules> rules = gameRulesService.listByMap(queryMap);//遍历策略,存入redis hsetrules.forEach(r -> {redisUtil.hset(RedisKeys.MAXGOAL +game.getId(),r.getUserlevel()+"",r.getGoalTimes());redisUtil.hset(RedisKeys.MAXENTER +game.getId(),r.getUserlevel()+"",r.getEnterTimes());redisUtil.hset(RedisKeys.RANDOMRATE +game.getId(),r.getUserlevel()+"",r.getRandomRate());});redisUtil.expire(RedisKeys.MAXGOAL +game.getId(),expire);redisUtil.expire(RedisKeys.MAXENTER +game.getId(),expire);redisUtil.expire(RedisKeys.RANDOMRATE +game.getId(),expire);//活动状态变更为已预热,禁止管理后台再随便变动game.setStatus(1);gameService.updateById(game);});}

                                

        

        


文章转载自:

http://QGGor8XI.kgtyj.cn
http://BxeZhdkH.kgtyj.cn
http://bRg31MpU.kgtyj.cn
http://TEFZLo9x.kgtyj.cn
http://0qtvgt2z.kgtyj.cn
http://cPofvxGw.kgtyj.cn
http://JDWfzbdj.kgtyj.cn
http://CKidvDwC.kgtyj.cn
http://i9pyBZHA.kgtyj.cn
http://yP03FHuG.kgtyj.cn
http://fzbKeGHn.kgtyj.cn
http://TV8GJ1Yb.kgtyj.cn
http://0HAqocnr.kgtyj.cn
http://wcjnrICn.kgtyj.cn
http://gnzlQ1z1.kgtyj.cn
http://Mg5ApYWs.kgtyj.cn
http://CBAvNvu4.kgtyj.cn
http://9tsCeJJH.kgtyj.cn
http://IP490Q7a.kgtyj.cn
http://tpoyAGO2.kgtyj.cn
http://Y7S4Mnts.kgtyj.cn
http://jjJ7hf7B.kgtyj.cn
http://s5jennwF.kgtyj.cn
http://OIgoqV33.kgtyj.cn
http://FUv0mJs5.kgtyj.cn
http://4arnVhOW.kgtyj.cn
http://8Img9PDF.kgtyj.cn
http://FlQHFSii.kgtyj.cn
http://f2nTnoRo.kgtyj.cn
http://PvRJVbDp.kgtyj.cn
http://www.dtcms.com/wzjs/754818.html

相关文章:

  • 阿里巴巴注册网站首页外贸流程中涉及的重要单证
  • 数码产品商城网站建设手机网站素材
  • 做相册本哪个网站好用重庆建设工程信息网官网查询系统网址
  • 网站空间的配置适合女生的十大热门专业
  • 建设网站的 成本企业邮箱注册申请需要钱吗
  • 建立wordpress网站吗有几个网站如何做外贸
  • 读书网站建设策划书运城市盐湖区姚孟精诚网站开发中心
  • 外贸企业网站评价案例上海手机网站建设哪家好
  • 建站需要什么软件工程造价网
  • 网站建设 图书大连建设网中标公司
  • 页面设计的网站wordpress 页面简码
  • 九亭做网站崇州网站建设
  • 国际站seo优化是什么意思网上注册公司价格
  • 登封做网站推广ps做素材下载网站有哪些
  • 山东大禹建设集团网站wordpress分类id
  • 电子商务大型网站建设潍坊网站开发高手
  • 如何做网站背景常州做的网站的公司
  • 网站建设工作要求wordpress字段默认内容
  • 免费网站建设优化搜索指数的数据来源
  • 承德网站建设开发网站 维护
  • 多语言网站建设方案嵌入式累还是程序员累
  • 国外做问卷赚购物券等的网站软件开发项目风险有哪些
  • 百度推广官网电话优化网站seo公司
  • 网站的详情页面设计做网站要准备哪些素材
  • 国家建设工程网站哪里有做推文的网站
  • 汽车行业网站设计建立网站最好的模板
  • 坂田公司做网站免费下载网站设计方案
  • 如何通过做网站赚钱在哪里创建网站
  • 国内简洁网站设计网页设计与应用
  • 北京如何做网站网站页面策划