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

海门城乡建设管理局网站艺术培训学校招生方案

海门城乡建设管理局网站,艺术培训学校招生方案,seo培训学什么,模具 东莞网站建设1. 为什么要引入令牌大闸#xff1f; 场景1#xff1a;分布式锁和限流都不能解决机器人刷票的问题#xff0c;1000个请求抢票#xff0c;900个限流快速失败#xff0c;另外100个有可能是同一个在刷库。 引入令牌#xff0c;令牌中记录用户信息#xff0c;会进行校验用户…1. 为什么要引入令牌大闸 场景1分布式锁和限流都不能解决机器人刷票的问题1000个请求抢票900个限流快速失败另外100个有可能是同一个在刷库。 引入令牌令牌中记录用户信息会进行校验用户是否拿过令牌如果拿过令牌那么几秒内不允许再获得令牌 场景2没有余票时需要查库存才能知道没票会影响性能不如查询令牌余票来的快 令牌的数量是和票数是相关的令牌可以和票数相等那么通过查询令牌就可以知道是否还有余票会减少查询数据库减少IO压力 2. 增加秒杀令牌表来维护令牌信息 增加一张表表的创建SQL代码如下所示 drop table if exists sk_token; create table sk_token ( id bigint not null comment id, date date not null comment 日期, train_code varchar(20) not null comment 车次编号, count int not null comment 令牌余量, create_time datetime(3) comment 新增时间, update_time datetime(3) comment 修改时间, primary key (id), unique key date_train_code_unique (date, train_code) ) engineinnodb default charsetutf8mb4 comment秒杀令牌;利用代码生成器生成相应的文件 3. 初始化车次信息时初始化令牌信息 在SkTokenService中实现genDaily方法 /** * 初始化 */ public void genDaily(Date date, String trainCode) { LOG.info(删除日期【{}】车次【{}】的令牌记录, DateUtil.formatDate(date), trainCode); SkTokenExample skTokenExample new SkTokenExample(); skTokenExample.createCriteria().andDateEqualTo(date).andTrainCodeEqualTo(trainCode); skTokenMapper.deleteByExample(skTokenExample); DateTime now DateTime.now(); SkToken skToken new SkToken(); skToken.setDate(date); skToken.setTrainCode(trainCode); skToken.setId(SnowUtil.getSnowflakeNextId()); skToken.setCreateTime(now); skToken.setUpdateTime(now); //计算该车次共有多少个座位int seatCount dailyTrainSeatService.countSeat(date, trainCode); LOG.info(车次【{}】座位数{}, trainCode, seatCount); //查询该车次共有多少个车站long stationCount dailyTrainStationService.countByTrainCode(date, trainCode); LOG.info(车次【{}】到站数{}, trainCode, stationCount); // 3/4需要根据实际卖票比例来定一趟火车最多可以卖seatCount * stationCount张火车票 int count (int) (seatCount * stationCount); // * 3/4); LOG.info(车次【{}】初始生成令牌数{}, trainCode, count); skToken.setCount(count); skTokenMapper.insert(skToken); }然后在生成每日数据时加入该方法即可 //生成该车次的车站数据 dailyTrainStationService.genDaily(date,train.getCode()); //生成该车次的车厢数据 dailyTrainCarriageService.genDaily(date,train.getCode()); //生成该车次的座位数据 dailyTrainSeatService.genDaily(date,train.getCode()); //生成该车次的余票数据 dailyTrainTicketService.genDaily(dailyTrain,date,train.getCode()); LOG.info(生成日期【{}】车次【{}】的信息结束, DateUtil.formatDate(date), train.getCode()); //生成令牌余量数据 skTokenService.genDaily(date,train.getCode());4. 增加校验秒杀令牌功能 在执行核心业务之前加上下面代码 //校验令牌容量 boolean validSkTokenskTokenService.validSkToken(req.getDate(),req.getTrainCode(), req.getMemberId()); if(validSkToken){ LOG.info(令牌校验通过); }else{ LOG.info(令牌校验不通过); throw new BusinessException(BusinessExceptionEnum.CONFIRM_ORDER_SK_TOKEN_FAIL); }其对应逻辑先从redis缓存中查询令牌余量如果存在缓存60s过期则直接从缓存中查询令牌余量 如果余量大于0则获取令牌同时更新缓存中令牌余量 如果不存在缓存则从数据库中查询 /** * 校验令牌 */ public boolean validSkToken(Date date, String trainCode, Long memberId) { LOG.info(会员【{}】获取日期【{}】车次【{}】的令牌开始, memberId, DateUtil.formatDate(date), trainCode); // 需要去掉这段否则发布生产后体验多人排队功能时会因拿不到锁而返回等待5秒加入20人时只有第1次循环能拿到锁 // if (!env.equals(dev)) { // // 先获取令牌锁再校验令牌余量防止机器人抢票lockKey就是令牌用来表示【谁能做什么】的一个凭证 // String lockKey RedisKeyPreEnum.SK_TOKEN - DateUtil.formatDate(date) - trainCode - memberId; // Boolean setIfAbsent redisTemplate.opsForValue().setIfAbsent(lockKey, lockKey, 5, TimeUnit.SECONDS); // if (Boolean.TRUE.equals(setIfAbsent)) { // LOG.info(恭喜抢到令牌锁了lockKey{}, lockKey); // } else { // LOG.info(很遗憾没抢到令牌锁lockKey{}, lockKey); // return false; // } // } String skTokenCountKey RedisKeyPreEnum.SK_TOKEN_COUNT - DateUtil.formatDate(date) - trainCode; Object skTokenCount redisTemplate.opsForValue().get(skTokenCountKey); if (skTokenCount ! null) { LOG.info(缓存中有该车次令牌大闸的key{}, skTokenCountKey); Long count redisTemplate.opsForValue().decrement(skTokenCountKey, 1); if (count 0L) { LOG.error(获取令牌失败{}, skTokenCountKey); return false; } else { LOG.info(获取令牌后令牌余数{}, count); redisTemplate.expire(skTokenCountKey, 60, TimeUnit.SECONDS); // 每获取5个令牌更新一次数据库 if (count % 5 0) { skTokenMapperCust.decrease(date, trainCode, 5); } return true; } } else { LOG.info(缓存中没有该车次令牌大闸的key{}, skTokenCountKey); // 检查是否还有令牌 SkTokenExample skTokenExample new SkTokenExample(); skTokenExample.createCriteria().andDateEqualTo(date).andTrainCodeEqualTo(trainCode); ListSkToken tokenCountList skTokenMapper.selectByExample(skTokenExample); if (CollUtil.isEmpty(tokenCountList)) { LOG.info(找不到日期【{}】车次【{}】的令牌记录, DateUtil.formatDate(date), trainCode); return false; } SkToken skToken tokenCountList.get(0); if (skToken.getCount() 0) { LOG.info(日期【{}】车次【{}】的令牌余量为0, DateUtil.formatDate(date), trainCode); return false; } // 令牌还有余量 // 令牌余数-1 Integer count skToken.getCount() - 1; skToken.setCount(count); LOG.info(将该车次令牌大闸放入缓存中key: {} count: {}, skTokenCountKey, count); // 不需要更新数据库只要放缓存即可 redisTemplate.opsForValue().set(skTokenCountKey, String.valueOf(count), 60, TimeUnit.SECONDS); skTokenMapper.updateByPrimaryKey(skToken); return true; } // 令牌约等于库存令牌没有了就不再卖票不需要再进入购票主流程去判断库存判断令牌肯定比判断库存效率高 // int updateCount skTokenMapperCust.decrease(date, trainCode, 1); // if (updateCount 0) { // return true; // } else { // return false; // }}
http://www.pierceye.com/news/571382/

相关文章:

  • 给素材网站做签约设计不想做了网络规划设计师教程第2版pdf
  • 新做的网站怎样推广html代码加密
  • 织梦淘宝客网站嘉兴网站开发公司
  • 宁波网站推广营销网上购物软件哪个好
  • 网站 风格做网站都可以做什么
  • 网站的建设公司简介现在建站好么
  • 简述电子商务网站建设流程wordpress极速优化
  • 移动网站怎么做万维设计
  • 建设网站我们重中之重-用户体验企业网站模板 首页大图
  • 怎么在本地做网站wordpress 建表
  • wordpress整站数据网站设计公司排名
  • 常州建设局网站海南网站建设报价方案
  • 做网站流量怎么解决广州热点新闻
  • 浙江省网站icp备案网页设计大赛海报
  • 做传奇开服一条龙网站哪个好学计算机网站建设
  • 商城网站素材wordpress影视解析插件
  • 昆明市住房和城乡建设局门户网站如何做自己官方网站
  • 微网站官网室内设计平面图素材
  • 国外做袜靴的网站wordpress在后台文章自定义表单
  • 网站商城建设实训心得优质校建设网站
  • 皖icp网站建设专业建设存在问题及改进建议
  • 建设网银登录网站wordpress怎么删除目录下
  • 网站建设帖子微信附近人推广引流
  • 苏州建网站要多少钱龙岩推广公司
  • 网站二次开发做外贸网站策划
  • 珠海建网站公司wordpress 关闭访问
  • 建设跳转公积金网站网站建设太金手指六六二五
  • 怎样做办公用品销售网站网站开发与维护 专业
  • 大气的网站设计wordpress顶栏
  • 网站开发用到哪些技术中国建设集团官网