SpringBoot使用Redisson实现分布式锁(秒杀系统)
前面讲完了Redis的分布式锁的实现,接下来讲Redisson的分布式锁的实现,一般提及到Redis的分布式锁我们更多的使用的是Redisson的分布式锁,Redis的官方也是建议我们这样去做的。Redisson点我可以直接跳转到Redisson的官方文档。
1.1、引入Maven依赖
org.redisson redisson-spring-boot-starter 3.10.6
注意:我这里引入的是redisson和springboot的集成包,网上一些教程可能是引入如下配置
org.redisson redisson 3.6.1
如果你引入的就是redisson的依赖包,如果该依赖包的版本低于3.5会需要你再引入
io.netty netty-all 4.1.25.Final com.fasterxml.jackson.core jackson-core 2.9.0 com.fasterxml.jackson.core jackson-databind 2.9.0
这样的一些依赖。
1.2、配置redis信息
spring:
application:
name:spring-cloud-product
redis:
port:6379
host:127.0.0.1
password:
database:0
timeout:2000
1.3、配置redisson
新建一个redisson-single.yml的配置文件 下面是单机配置
singleServerConfig: idleConnectionTimeout:10000 pingTimeout:1000 connectTimeout:10000 timeout:3000 retryAttempts:3 retryInterval:1500 reconnectionTimeout:3000 failedAttempts:3 password:null subscriptionsPerConnection:5 clientName:null address:"redis://127.0.0.1:6379" subscriptionConnectionMinimumIdleSize:1 subscriptionConnectionPoolSize:50 connectionMinimumIdleSize:32 connectionPoolSize:64 database:0 #在最新版本中dns的检查操作会直接报错所以我直接注释掉了 #dnsMonitoring:false dnsMonitoringInterval:5000 threads:0 nettyThreads:0 codec:!{} transportMode:"NIO"
1.4、写一个RedissonConfig配置类 来配置你的redisson
/** *@Description//TODO *@Date$$ *@Authorhuangwb **/ @Configuration publicclassRedssonConfig{ @Bean(destroyMethod="shutdown") publicRedissonClientredisson()throwsIOException{ RedissonClientredisson=Redisson.create( Config.fromYAML(newClassPathResource("redisson-single.yml").getInputStream())); returnredisson; } }
1.5、编写一个秒杀接口
@Autowired privateRedissonClientredissonClient; @Override publicbooleandecrementProductStore(LongproductId,IntegerproductQuantity){ Stringkey="dec_store_lock_"+productId; RLocklock=redissonClient.getLock(key); try{ //加锁操作很类似Java的ReentrantLock机制 lock.lock(); ProductInfoproductInfo=productInfoMapper.selectByPrimaryKey(productId); //如果库存为空 if(productInfo.getProductStock()==0){ returnfalse; } //简单减库存操作没有重新写其他接口了 productInfo.setProductStock(productInfo.getProductStock()-1); productInfoMapper.updateByPrimaryKey(productInfo); }catch(Exceptione){ System.out.println(e.getMessage()); }finally{ //解锁 lock.unlock(); } returntrue; }
1.6、写一个简单的测试请求
@GetMapping("test") publicStringcreateOrderTest(){ if(!productInfoService.decrementProductStore(1L,1)){ return"库存不足"; } OrderMasterorderMaster=newOrderMaster(); //未支付 orderMaster.setOrderStatus(0); //未支付 orderMaster.setPayStatus(0); orderMaster.setBuyerName(name); orderMaster.setBuyerAddress("湖南长沙"); orderMaster.setBuyerPhone("18692794847"); orderMaster.setOrderAmount(BigDecimal.ZERO); orderMaster.setCreateTime(DateUtils.getCurrentDate()); orderMaster.setOrderId(UUID.randomUUID().toString().replaceAll("-","")); orderMasterService.insert(orderMaster); return"创建订单成功"; }
1.7、使用ab做接口测试
ab-n300-c300 请求地址
-n 的含义就是你做多少个请求
-c 的含义就是多少个用户并发请求
数据库中的商品已经全部被秒杀完 并未出现超库存的情况。
如果对ab不是太了解可以看看这篇文章:使用Apacheab进行http性能测试
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。