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

php在网站制作中的运行机制网络推广理实一体化软件

php在网站制作中的运行机制,网络推广理实一体化软件,wordpress扫码支付后才能看到图片,上海加强旅游住宿业与商业场所什么是超卖问题? 想象一个场景: 黑马点评搞秒杀活动,某商品库存 100 件。活动开始后,15 个用户同时下单,最后系统显示卖出了 101 件,库存变成了 - 1 —— 这就是超卖。超卖本质:多线程环境下&am…

什么是超卖问题?

想象一个场景:
黑马点评搞秒杀活动,某商品库存 100 件。活动开始后,15 个用户同时下单,最后系统显示卖出了 101 件,库存变成了 - 1 —— 这就是超卖。
在这里插入图片描述
超卖本质多线程环境下,库存扣减操作未正确同步,导致 实际销量 > 库存量的严重业务错误。针对这一问题常见解决方案就是加锁

为什么会超卖?
用代码模拟一下问题:

// 错误的扣减库存方式
public boolean seckill(Long voucherId) {// 1. 查询库存SeckillVoucher voucher = seckillVoucherService.getById(voucherId);int stock = voucher.getStock();// 2. 判断库存是否充足if (stock > 0) {// 3. 扣减库存(stock=stock-1)voucher.setStock(stock - 1);seckillVoucherService.updateById(voucher);}
}

问题出在 “查询→判断→扣减” 这三步不是原子操作:

  • 线程 1 查询到库存 = 1,还没扣减;
  • 线程 2 也查询到库存 = 1,也进入扣减逻辑;
  • 最后库存变成 - 1,超卖了。

解决方案

解决方案对比:悲观锁 vs 乐观锁

方案实现原理适用场景性能影响实现复杂度
悲观锁“先锁定再操作”(如synchronized高冲突场景,数据强一致性要求高较高(串行执行)
乐观锁“先操作再验证”(版本号/条件判断)低冲突场景,读多写少低(并行执行)
分布式锁Redis/ZooKeeper,全局锁控制分布式系统,高并发秒杀中(网络开销)

悲观锁实战

public synchronized boolean seckill(Long voucherId)  {// 同上:查询→判断→扣减
}

优点:简单,绝对不会超卖。
缺点:并发高时,大家都在等锁,响应慢,像排队结账排成长龙。

乐观锁实战:黑马点评解决方案

核心代码实现

public boolean seckill(Long voucherId) {// 1. 查询优惠券库存SeckillVoucher voucher = seckillVoucherService.getById(voucherId);// 2. 判断秒杀是否开始/结束if (voucher.getBeginTime().isAfter(LocalDateTime.now())) {throw new RuntimeException("秒杀尚未开始!");}if (voucher.getEndTime().isBefore(LocalDateTime.now())) {throw new RuntimeException("秒杀已结束!");}// 3. 库存不足直接返回if (voucher.getStock() < 1) {return false;}// 4. 乐观锁扣减库存boolean success = seckillVoucherService.update().setSql("stock = stock - 1")  // SET stock = stock - 1.eq("voucher_id", voucherId)  // WHERE voucher_id = #{voucherId}.gt("stock", 0)               // AND stock > 0.update();return success;
}

方案优势

  • 无锁竞争:避免线程阻塞,提高并发能力
  • 轻量级:数据库级别实现,无需额外组件
  • 简单有效:SQL条件天然保证库存安全

潜在问题:高并发下的低成功率
当100线程同时抢10个商品时:

  • 乐观锁成功率 ≈ 10%
  • 90%请求失败需重试或放弃

进阶方案:Redis分布式锁

实现原理
在这里插入图片描述
核心代码:

public boolean seckillWithRedisLock(Long voucherId) {// 1. 获取分布式锁String lockKey = "lock:voucher:" + voucherId;String clientId = UUID.randomUUID().toString();try {// 尝试获取锁(设置10秒超时)Boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 10, TimeUnit.SECONDS);if (!Boolean.TRUE.equals(locked)) {return false; // 获取锁失败}// 2. 执行库存扣减return doSeckill(voucherId);} finally {// 3. 释放锁(Lua脚本保证原子性)String script = "if redis.call('get', KEYS[1]) == ARGV[1] " +"then return redis.call('del', KEYS[1]) " +"else return 0 end";redisTemplate.execute(new DefaultRedisScript<>(script, Long.class),Collections.singletonList(lockKey),clientId);}
}

性能优化:库存预减方案

架构设计
在这里插入图片描述

实现步骤
1. 预热库存到Redis:

redisTemplate.opsForValue().set("stock:voucher:"+voucherId, 100);

2. 预减库存:

Long stock = redisTemplate.opsForValue().decrement("stock:voucher:"+voucherId);
if (stock < 0) {// 库存不足,回滚redisTemplate.opsForValue().increment("stock:voucher:"+voucherId);return false;
}

3. 异步落库:

@Async
public void asyncUpdateStock(Long voucherId) {seckillVoucherService.update().setSql("stock = stock - 1").eq("voucher_id", voucherId).update();
}

方案选型指南

场景推荐方案QPS支持注意事项
低并发(<1000QPS)乐观锁1k-5k控制重试次数
中并发(5k-10kQPS)Redis分布式锁5k-10k设置锁超时
高并发(>10kQPS)库存预减+异步10k+保证最终一致性
超高并发Redis+Lua脚本50k+监控Redis负载

最佳实践总结
1. 多层防护:

  • 前端:按钮防重、验证码
  • 网关:请求限流
  • 服务:库存预减
  • 数据库:最终一致性
    2. 监控指标:
// 监控关键指标
meterRegistry.counter("seckill.requests").increment();
meterRegistry.counter("seckill.success").increment();
meterRegistry.counter("seckill.failures").increment();

3. 回退机制:

// 库存回补
if (updateFailed) {redisTemplate.opsForValue().increment("stock:voucher:"+voucherId);
}

超卖问题本质是并发控制的艺术,选择合适方案需平衡性能、一致性和复杂度。建议从乐观锁起步,随业务增长逐步升级到分布式方案!

http://www.dtcms.com/a/506442.html

相关文章:

  • 现在网站要怎么做才有人wordpress怎么增加菜单
  • a站全称wordpress网站秒开
  • 获取网站的路径iis 子网站
  • 咸阳网站开发哪家好东莞公司注册地址变更流程
  • 做网站的公司为什么人少了wordpress整合主题
  • 企业网站的基本要素品牌推广公司排名
  • 网站成立查询12380网站开发
  • 网站建设ppt下载二级域名免费申请
  • 海淀网站开发公司网站设计模板旅游景点11页
  • 网站开发字体的引用17网一起做网店下载
  • 德国网站建设佛山市建网站做网站费用
  • 如何防止网站被攻击网站做系统
  • 如何用域名做邮箱 网站手机版网站有必要吗
  • iis 添加网站 win7免费做会计试题网站
  • 提高网站目标流量前端不会wordpress
  • 素材网站都有哪些深圳福田区网站建设
  • 大连微信网站wordpress 机制
  • 重庆永川网站建设公司昆明seo关键字推广
  • 做做网站已更新免费私人直播间 哔哩哔哩
  • 上海网站制作哪家奿找人做网站大概多少钱
  • 宁波在线制作网站自己怎么健网站视频下载
  • 别人做的网站不能用了银川网站设计怎么样
  • 影视网站ps做阿里网站分辨率设置
  • 唐山展望网站建设南和网站建设公司太原网站建设
  • 顶呱呱代理建设网站专业网页设计模板
  • 文山网站建设代理别人帮自己做网站有后门吗
  • 网站关键词排名下降网站建设推广兼职
  • 网站建设公司初心广东近期新闻
  • 广州奕联网站开发wordpress wp_list_categories
  • 云建站哪家好黄山网站建设黄山