SpringBoot使用Redisson实现分布式锁秒杀系统
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了SpringBoot使用Redisson实现分布式锁秒杀系统,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3639字,纯文字阅读大概需要6分钟。
内容图文
![SpringBoot使用Redisson实现分布式锁秒杀系统](/upload/InfoBanner/zyjiaocheng/1127/e2ea4388037e42179463414c75c8bd2f.jpg)
前面讲完了Redis的分布式锁的实现,接下来讲Redisson的分布式锁的实现,一般提及到Redis的分布式锁我们更多的使用的是Redisson的分布式锁,Redis的官方也是建议我们这样去做的。Redisson点我可以直接跳转到Redisson的官方文档。
1.1、引入Maven依赖
<dependency> <groupId>org.redissongroupId> <artifactId>redisson-spring-boot-starterartifactId> <version>3.10.6version> dependency>
注意:我这里引入的是redisson和springboot的集成包,网上一些教程可能是引入如下配置
<dependency> <groupId>org.redissongroupId> <artifactId>redissonartifactId> <version>3.6.1version> dependency>
如果你引入的就是redisson的依赖包,如果该依赖包的版本低于3.5会需要你再引入
<dependency> <groupId>io.nettygroupId> <artifactId>netty-allartifactId> <version>4.1.25.Finalversion> dependency> <dependency> <groupId>com.fasterxml.jackson.coregroupId> <artifactId>jackson-coreartifactId> <version>2.9.0version> dependency> <dependency> <groupId>com.fasterxml.jackson.coregroupId> <artifactId>jackson-databindartifactId> <version>2.9.0version> dependency>
这样的一些依赖。
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?$?$ *?@Author?huangwb **/ @Configuration public?class?RedssonConfig?{ @Bean(destroyMethod="shutdown") public?RedissonClient?redisson()?throws?IOException?{ ??RedissonClient?redisson?=?Redisson.create( ????Config.fromYAML(new?ClassPathResource("redisson-single.yml").getInputStream())); return?redisson; ?} }
1.5、编写一个秒杀接口
@Autowired private?RedissonClient?redissonClient; @Override public?boolean?decrementProductStore(Long?productId,?Integer?productQuantity)?{ ?String?key?=?"dec_store_lock_"?+?productId; ?RLock?lock?=?redissonClient.getLock(key); try?{ //加锁?操作很类似Java的ReentrantLock机制 lock.lock(); ??ProductInfo?productInfo?=?productInfoMapper.selectByPrimaryKey(productId); //如果库存为空 if?(productInfo.getProductStock()?==?0)?{ return?false; ??} //简单减库存操作?没有重新写其他接口了 ??productInfo.setProductStock(productInfo.getProductStock()?-?1); ??productInfoMapper.updateByPrimaryKey(productInfo); ?}?catch?(Exception?e)?{ ??System.out.println(e.getMessage()); ?}?finally?{ //解锁 lock.unlock(); ?} return?true; }
1.6、写一个简单的测试请求
@GetMapping("test") public?String?createOrderTest()?{ if?(!productInfoService.decrementProductStore(1L,?1))?{ return?"库存不足"; ?} ?OrderMaster?orderMaster?=?new?OrderMaster(); //未支付 ?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 -n 300 -c 300 请求地址
-n 的含义就是你做多少个请求
-c 的含义就是多少个用户并发请求
数据库中的商品已经全部被秒杀完 并未出现超库存的情况。
原文:https://blog.51cto.com/u_14783151/2831861
内容总结
以上是互联网集市为您收集整理的SpringBoot使用Redisson实现分布式锁秒杀系统全部内容,希望文章能够帮你解决SpringBoot使用Redisson实现分布式锁秒杀系统所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。