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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。