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

百度网站是什么wordpress 留言墙插件

百度网站是什么,wordpress 留言墙插件,WordPress苏醒模板免费,wordpress产品展示页面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.zqtcl.cn/news/881407/

相关文章:

  • 微网站菜单商品详情页面模板html
  • 免费word模板网站WordPress用户聊天功能
  • 网站显示图片标记wordpress文章分类div布局
  • 专业网站建设公司哪家专业阿里云二级域名建设网站
  • 返利网站怎么做手机网页前端开发
  • 做家教去什么网站人际网络网络营销是什么
  • 潮州外贸网站建设网站qq在线状态
  • 旅游网站开发背景及意义湖南城市建设网站
  • 西安网站开发托管代运营wordpress给外部链接加上跳转
  • 网站设计深圳企业为什么做网站素材
  • 网站顶部地图代码怎么做的家居装修
  • 网站后台不能修改网站哪家公司做的
  • 360网站建设官网致远oa办公系统官网
  • 南宁 做网站网站建立计划书
  • 兰亭集势网站模板宿迁房产
  • 网站建设开源苏州做网站优化哪家好
  • 自己的电脑做网站空间视屏互联网站备案管理工作方案 工信部
  • 移动网站设计尺寸在什么网站做外贸
  • 中外网站建设区别绵阳市城市建设档案馆网站
  • php电子商务网站源码凉山彝族自治州网站建站
  • 网站建设当前位置图标移动网站登录入口
  • 个人网站备案 淘宝客wordpress 面包屑导航修改
  • 网站建设 总体思路企业网站建设费是无形资产吗
  • 专业外贸网站开发上海外包公司网站建设
  • iis网站伪静态为什么要网站备案
  • 什么是网站东莞常平律师事务所
  • 网站落地页制作最简单的网站
  • 长兴县建设管理网站抖音小程序注册
  • 做网站容易挣钱吗厦门网页制作厦门小程序app
  • 大型网站开发前端准备北京网站建设V芯ee8888e