mysql乐观锁 秒杀_高并发编程之高并发场景:秒杀(无锁、排他锁、乐观锁、redis缓存的逐步演变)...

高并发编程之高并发场景:秒杀(无锁、排他锁、乐观锁、redis缓存的逐步演变)

发布时间:2018-10-19 14:46,

浏览次数:1472

, 标签:

redis

环境:

jdk1.8;spring boot2.0.2;Maven3.3

<>摘要说明:

在实际开发过程中往往会出现许多高并发场场景,秒杀,强红包,抢优惠卷等;

其中:

秒杀场景的特点就是单位时间涌入用户量极大,商品数少,且要保证不可超量销售;

秒杀产品的本质就是减库存;

秒杀场景常用的解决方案有限流、削峰、拓展等

本篇以秒杀场景为依据来主要从代码开发的角度阐述从无锁——》排他锁——》共享锁——》缓存中间件的一步步升级来不断完善及优化;同时也针对整体架构提出一些优化方案;

<>步骤:

<>1.准备高并发测试工具类

引入高并发编程的工具类:java.util.concurrent.CountDownLatch(发令枪)来进行模拟大批量用户高并发测试;

java.util.concurrent.CountDownLatch(发令枪)

:一个同步辅助类,控制一组线程的启动,当一组线程未完全准备好之前控制准备好一个或多个线程一直等待。犹如倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当计数到达0时,则意味着这组线程完全准备好。此时通知所有等待者即整组线程同时开始执行。

package com.example.demo_20180925; import java.util.Map; import

java.util.concurrent.CountDownLatch; import org.junit.Before; import

org.junit.Test; import org.junit.runner.RunWith; import

org.springframework.beans.factory.annotation.Autowired; import

org.springframework.boot.test.context.SpringBootTest; import

org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import

org.springframework.test.context.junit4.SpringRunner; import

com.example.demo_20180925.pojo.ProductInfo; import

com.example.demo_20180925.service.ProductInfoService;

@RunWith(SpringRunner.class) // 引入SpringBootTest并生成随机接口

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class

Demo20180925ApplicationTests { // 商品代码 private static final String CODE =

"IPONE XR"; // 商品总数 private static final Long PRODUCTCOUNT = (long) 1000; //

并发人数 private static final int USER_NUM = 1000; // 发令枪;用于模拟高并发 private static

CountDownLatch countDownLatch = new CountDownLatch(USER_NUM); //

计数器,用于记录成功购买客户人数 private static int successPerson = 0; // 计数器,用于记录卖出去对的商品个数

private static int saleOutNum = 0; // 计数器,用于记录处理总时间 private static long doTime

= 0; // 计数器,用于记录处理最长时间 private static long maxTime = 0; @Autowired

ProductInfoService productInfoService; @Before public void init() { // 初始化库存

ProductInfo productInfo = new ProductInfo(); productInfo.setProductCode(CODE);

productInfo.setProductCount(PRODUCTCOUNT);

this.productInfoService.updateFirst(productInfo); } @Test public void

testSeckill() throws InterruptedException { // 循环初始换USER_NUM个请求实例 for (int i =

0; i < USER_NUM; i++) { new Thread(new BuyProduct(CODE, (long) 3)).start(); if

(i == USER_NUM) { Thread.currentThread().sleep(2000);//

最后一个子线程时休眠两秒等待所有子线程全部准备好 } countDownLatch.countDown();// 发令枪减1,到0时启动发令枪 }

Thread.currentThread().sleep(30 * 1000);// 主线程休眠10秒等待结果 //

Thread.currentThread().join(); System.out.println("购买成功人数:" + successPerson);

System.out.println("销售成功个数:" + saleOutNum); System.out.println("剩余个数:"

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值