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

推进网站集约化建设如何把自己做的网站连上网

推进网站集约化建设,如何把自己做的网站连上网,奈曼旗华水建设工程公司网站,小视频解析网站怎么做#xff08;以下内容全部来自上述课程#xff09;优惠券秒杀 1. 全局唯一ID 每个店铺都可以发布优惠券:当用户抢购时#xff0c;就会生成订单并保存到tb voucher order这张表中#xff0c;而订单表如果使用数据库自增ID就存在一些问题: id的规律性太明显受单表数据量的限制… 以下内容全部来自上述课程优惠券秒杀 1. 全局唯一ID 每个店铺都可以发布优惠券:当用户抢购时就会生成订单并保存到tb voucher order这张表中而订单表如果使用数据库自增ID就存在一些问题: id的规律性太明显受单表数据量的限制 全局ID生成器 全局ID生成器是一种在分布式系统下用来生成全局唯一ID的工具一般要满足下列特性为了增加ID的安全性我们可以不直接使用Redis自增的数值而是拼接一些其他信息ID的组成部分 符号位:1bit永远为0时间戳:31bit以秒为单位可以使用69年序列号:32bit秒内的计数器支持每秒产生2^32个不同ID 2. Redis实现全局唯一ID RedisIdWorker.java package com.hmdp.utils;import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component;import java.time.LocalDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter;Component public class RedisIdWorker {/*** 开始时间戳*/private static final long BEGIN_TIMESTAMP 1640995200L;/*** 序列号的位数*/private static final int COUNT_BITS 32;private StringRedisTemplate stringRedisTemplate;public RedisIdWorker(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate stringRedisTemplate;}public long nextId(String keyPrefix) {// 1.生成时间戳LocalDateTime now LocalDateTime.now();long nowSecond now.toEpochSecond(ZoneOffset.UTC);long timestamp nowSecond - BEGIN_TIMESTAMP;// 2.生成序列号// 2.1.获取当前日期精确到天String date now.format(DateTimeFormatter.ofPattern(yyyy:MM:dd));// 2.2.自增长long count stringRedisTemplate.opsForValue().increment(icr: keyPrefix : date);// 3.拼接并返回return timestamp COUNT_BITS | count;} } 3. 添加优惠券 每个店铺都可以发布优惠券分为平价券和特价券。平价券可以任意购买而特价券需要秒杀抢购表关系如下: tb_voucher:优惠券的基本信息优惠金额、使用规则等tb_seckill_voucher:优惠券的库存、开始抢购时间结束抢购时间。特价优惠券才需要填写这些信息 在VoucherController中提供了一个接口可以添加秒杀优惠券: package com.hmdp.controller;import com.hmdp.dto.Result; import com.hmdp.entity.Voucher; import com.hmdp.service.IVoucherService; import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;/*** p* 前端控制器* /p** author 虎哥* since 2021-12-22*/ RestController RequestMapping(/voucher) public class VoucherController {Resourceprivate IVoucherService voucherService;/*** 新增普通券* param voucher 优惠券信息* return 优惠券id*/PostMappingpublic Result addVoucher(RequestBody Voucher voucher) {voucherService.save(voucher);return Result.ok(voucher.getId());}/*** 新增秒杀券* param voucher 优惠券信息包含秒杀信息* return 优惠券id*/PostMapping(seckill)public Result addSeckillVoucher(RequestBody Voucher voucher) {voucherService.addSeckillVoucher(voucher);return Result.ok(voucher.getId());}/*** 查询店铺的优惠券列表* param shopId 店铺id* return 优惠券列表*/GetMapping(/list/{shopId})public Result queryVoucherOfShop(PathVariable(shopId) Long shopId) {return voucherService.queryVoucherOfShop(shopId);} }4. 实现秒杀 下单时需要判断两点 秒杀是否开始或结束如果尚未开始或已经结束则无法下单库存是否充足不足则无法下单VoucherOrderController.java package com.hmdp.controller;import com.hmdp.dto.Result; import com.hmdp.service.IVoucherOrderService; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/*** p* 前端控制器* /p** author 虎哥* since 2021-12-22*/ RestController RequestMapping(/voucher-order) public class VoucherOrderController {Resourceprivate IVoucherOrderService voucherOrderService;PostMapping(seckill/{id})public Result seckillVoucher(PathVariable(id) Long voucherId) {return voucherOrderService.seckillVoucher(voucherId);} } IVoucherOrderService.java package com.hmdp.service;import com.baomidou.mybatisplus.extension.service.IService; import com.hmdp.dto.Result; import com.hmdp.entity.VoucherOrder;public interface IVoucherOrderService extends IServiceVoucherOrder {Result seckillVoucher(Long voucherId); } VoucherOrderServiceImpl.java package com.hmdp.service.impl;import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.hmdp.dto.Result; import com.hmdp.entity.SeckillVoucher; import com.hmdp.entity.VoucherOrder; import com.hmdp.mapper.VoucherOrderMapper; import com.hmdp.service.ISeckillVoucherService; import com.hmdp.service.IVoucherOrderService; import com.hmdp.utils.RedisIdWorker; import com.hmdp.utils.UserHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource; import java.time.LocalDateTime;Service public class VoucherOrderServiceImpl extends ServiceImplVoucherOrderMapper, VoucherOrder implements IVoucherOrderService {Resourceprivate ISeckillVoucherService seckillVoucherService;Resourceprivate RedisIdWorker redisIdWorker;OverrideTransactionalpublic Result seckillVoucher(Long voucherId) {//1. 查询优惠券SeckillVoucher voucher seckillVoucherService.getById(voucherId);//2. 判断秒杀是否开始if (voucher.getBeginTime().isAfter(LocalDateTime.now())){//尚未开始return Result.fail(秒杀尚未开始);}//3. 判断秒杀是否结束if (voucher.getEndTime().isBefore(LocalDateTime.now())){//已经结束return Result.fail(秒杀已经结束);}//4. 判断库存是否充足if (voucher.getStock() 1){//库存不足return Result.fail(库存不足);}//5. 扣减库存boolean success seckillVoucherService.update().setSql(stock stock - 1).eq(voucher_id,voucherId).update();if (!success){//扣减失败return Result.fail(库存不足);}//6. 创建订单VoucherOrder voucherOrder new VoucherOrder();//6.1 订单idlong orderId redisIdWorker.nextId(order);voucherOrder.setId(orderId);//6.2 用户idLong userId UserHolder.getUser().getId();voucherOrder.setUserId(userId);//6.3 代金券idvoucherOrder.setVoucherId(voucherId);save(voucherOrder);//7. 返回订单idreturn Result.ok(orderId);}} 5. 库存超卖问题分析超卖问题是典型的多线程安全问题针对这一问题的常见解决方案就是加锁悲观锁添加同步锁让线程串行执行 优点简单粗暴缺点性能一般 乐观锁不加锁在更新时判断是否有其他线程在修改 优点性能好缺点存在成功率低的问题 乐观锁 乐观锁的关键是判断之前查询得到的数据是否有被修改过常见的方式有两种 版本号法 CAS法用库存代替版本6. 乐观锁解决超卖问题 //5. 扣减库存boolean success seckillVoucherService.update().setSql(stock stock - 1) //set stock stock - 1 .eq(voucher_id,voucherId).gt(stock,0) //where id ? and stock 0 .update();if (!success){//扣减失败return Result.fail(库存不足);}7. 实现一人一单 需求修改秒杀业务要求同一个优惠券一个用户只能下一单目前完整代码VoucherOrderServiceImpl.java package com.hmdp.service.impl;import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.hmdp.dto.Result; import com.hmdp.entity.SeckillVoucher; import com.hmdp.entity.VoucherOrder; import com.hmdp.mapper.VoucherOrderMapper; import com.hmdp.service.ISeckillVoucherService; import com.hmdp.service.IVoucherOrderService; import com.hmdp.utils.RedisIdWorker; import com.hmdp.utils.UserHolder; import lombok.val; import org.springframework.aop.framework.AopContext; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource; import java.time.LocalDateTime;Service public class VoucherOrderServiceImpl extends ServiceImplVoucherOrderMapper, VoucherOrder implements IVoucherOrderService {Resourceprivate ISeckillVoucherService seckillVoucherService;Resourceprivate RedisIdWorker redisIdWorker;Overridepublic Result seckillVoucher(Long voucherId) {//1. 查询优惠券SeckillVoucher voucher seckillVoucherService.getById(voucherId);//2. 判断秒杀是否开始if (voucher.getBeginTime().isAfter(LocalDateTime.now())){//尚未开始return Result.fail(秒杀尚未开始);}//3. 判断秒杀是否结束if (voucher.getEndTime().isBefore(LocalDateTime.now())){//已经结束return Result.fail(秒杀已经结束);}//4. 判断库存是否充足if (voucher.getStock() 1){//库存不足return Result.fail(库存不足);}Long userId UserHolder.getUser().getId();synchronized (userId.toString().intern()) {//获取代理对象事务IVoucherOrderService proxy (IVoucherOrderService) AopContext.currentProxy();return proxy.createVoucherOrder(voucherId);}}Transactionalpublic synchronized Result createVoucherOrder(Long voucherId) {//5. 一人一单Long userId UserHolder.getUser().getId();//5.1 查询订单int count query().eq(user_id, userId).eq(voucher_id, voucherId).count();//5.2 判断是否存在if (count 0) {//用户已经购买过了return Result.fail(用户已经购买过一次);}//6. 扣减库存boolean success seckillVoucherService.update().setSql(stock stock - 1) //set stock stock - 1.eq(voucher_id, voucherId).gt(stock, 0) //where id ? and stock 0.update();if (!success) {//扣减失败return Result.fail(库存不足);}//7. 创建订单VoucherOrder voucherOrder new VoucherOrder();//7.1 订单idlong orderId redisIdWorker.nextId(order);voucherOrder.setId(orderId);//7.2 用户idvoucherOrder.setUserId(userId);//7.3 代金券idvoucherOrder.setVoucherId(voucherId);save(voucherOrder);//8. 返回订单idreturn Result.ok(orderId);} } 8. 集群下的线程并发安全问题 一人一单的并发安全问题 通过加锁可以解决在单机情况下的一人一单安全问题但是在集群模式下就不行了。 我们将服务启动两份端口分别为8081和8082: 然后修改nqinx的conf目录下的nginx.conf文件配置反向代理和负载均衡:现在用户请求会在这两个节点上负载均衡再次测试下是否存在线程安全问题。
http://www.zqtcl.cn/news/138352/

相关文章:

  • 站长工具星空传媒怎么做游戏网站编辑
  • 大兴手机网站建设深圳小程序开发公司
  • c 大型网站开发案例电销系统线路
  • 鸿扬家装网站建设谈谈对seo的理解
  • 七米网站建设做网站也分内存大小的吗
  • 丝足网站的建设南宁关键词排名公司
  • 上饶商城网站建设亚马逊海外购官方网
  • 做网站代理商好赚吗高端品牌男鞋有哪些
  • 农产品网站建设及优化项目商务网站建设 视频
  • 北京兼职做网站建设百度app平台
  • 网站建设头部代码网站怎么做咨询
  • 网站运营 网站建设北京公司网站制作要多少钱
  • 郑州看妇科最好的医院是哪里南宁百度seo软件
  • 深圳市住房与建设局实名制网站手机网站打不开被拦截怎么办
  • 公司做网站的价格几千元wordpress 修改页脚
  • 专业网站建设公司在线咨询宁波网站推广公司价格
  • 网站搭建系统都有哪些丽水网站开发
  • 网站设计包含哪些技术外行怎么做网站
  • 网站建设运营知识推广软文平台
  • 营销型网站建设用途网站 文件夹结构
  • 制作网站建设策划方案cosy主题wordpress
  • 网站建设服务联享科技net和cn哪个做网站好
  • 深圳网站制作公司哪家好艺考培训学校
  • 潍坊网站的公司电话html网站开发基础
  • 网站模板样式做地图特效的网站
  • 商标查询官方网站有没有免费找客户的软件
  • 网站开发及服务合同行业网站名称
  • 网站建设费包括什么建筑设计领域
  • 网站建设 信科网络建行网站会员注册用户名
  • 网站建设的什么是开发实施注意什么网站开发实用技术pdf