首页 > 数据库 >java——redis随笔——实战——优惠券秒杀——分布式锁——基于redisson

java——redis随笔——实战——优惠券秒杀——分布式锁——基于redisson

时间:2023-10-29 13:22:06浏览次数:34  
标签:redisson return seckillVoucher redis 优惠券 org java import

 

 

 

 

 

 

 

 

Redisson入门

  1. 导入依赖
XML
1
2
3
4
5
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.13.6</version>
</dependency>
  1. 配置Redisson客户端,在config包下新建RedissonConfig
JAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RedissonConfig {
@Bean
public RedissonClient redissonClient() {
Config config = new Config();
config.useSingleServer()
.setAddress("redis://101.XXX.XXX.160:6379")
.setPassword("root");
return Redisson.create(config);
}
}
  1. 使用Redisson的分布式锁
JAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Resource
private RedissonClient redissonClient;

@Test
void testRedisson() throws InterruptedException {
//获取可重入锁
RLock lock = redissonClient.getLock("anyLock");
//尝试获取锁,三个参数分别是:获取锁的最大等待时间(期间会重试),锁的自动释放时间,时间单位
boolean success = lock.tryLock(1,10, TimeUnit.SECONDS);
//判断获取锁成功
if (success) {
try {
System.out.println("执行业务");
} finally {
//释放锁
lock.unlock();
}
}
}
  1. 替换我们之前自己写的分布式锁
JAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@Resource
private RedissonClient redissonClient;
@Override
public Result seckillVoucher(Long voucherId) {
LambdaQueryWrapper<SeckillVoucher> queryWrapper = new LambdaQueryWrapper<>();
//1. 查询优惠券
queryWrapper.eq(SeckillVoucher::getVoucherId, voucherId);
SeckillVoucher seckillVoucher = seckillVoucherService.getOne(queryWrapper);
//2. 判断秒杀时间是否开始
if (LocalDateTime.now().isBefore(seckillVoucher.getBeginTime())) {
return Result.fail("秒杀还未开始,请耐心等待");
}
//3. 判断秒杀时间是否结束
if (LocalDateTime.now().isAfter(seckillVoucher.getEndTime())) {
return Result.fail("秒杀已经结束!");
}
//4. 判断库存是否充足
if (seckillVoucher.getStock() < 1) {
return Result.fail("优惠券已被抢光了哦,下次记得手速快点");
}
Long userId = UserHolder.getUser().getId();
RLock redisLock = redissonClient.getLock("order:" + userId);
boolean isLock = redisLock.tryLock();
if (!isLock) {
return Result.fail("不允许抢多张优惠券");
}
try {
IVoucherOrderService proxy = (IVoucherOrderService) AopContext.currentProxy();
return proxy.createVoucherOrder(voucherId);
} finally {
redisLock.unlock();
}
}
  • 使用Jmeter进行压力测试,依旧是只能抢到一张优惠券,满足我们的需求

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

1

1

标签:redisson,return,seckillVoucher,redis,优惠券,org,java,import
From: https://www.cnblogs.com/xiaobaibailongma/p/17795790.html

相关文章

  • Java 中的 Default 关键字
    default关键字:是在Java8中引入的新概念,也可称为Virtualextensionmethods——虚拟扩展方法与public、private等都属于修饰符关键字,与其它两个关键字不同之处在于default关键字大部分都用于修饰接口。default修饰方法时只能在接口类中使用,在接口中被default标记的方法可以......
  • 收藏从未停止,练习从未开始——MYSQL游标存储过程IDEA快捷键配置SpringBoot入门到入土G
    “收藏从未停止,练习从未开始”,或许有那么一些好题好方法,在被你选中收藏后却遗忘在收藏夹里积起了灰?今天请务必打开你沉甸甸的收藏重新回顾,分享一下那些曾让你拍案叫绝的好东西吧!本人详解:(提醒:随笔)本人详解作者:王文峰,参加过2020年度博客之星,《Java王大师王天师》作者采购供应链共享......
  • Java 静态代码块、代码块、构造方法和多态继承的代码执行顺序
    测试代码importlombok.Getter;publicclassExecutionOrder{{System.out.println("ExecutionOrdercode0");}static{System.out.println("ExecutionOrderstaticcode");}{System.out.println(&......
  • Java 基础篇day02
    数据在计算机底层都是采用二进制进行储存二进制,使用0和1,按照逢二进一的规则来表示数据列如:6=1102=10等计算机中表示数据的单元:字节(byte,简称B,是使用8个二进制位组成的);字节中的每个二进制位就称为位(bit,简称b),1B=8b;那么其他数据形式是如何存储的呢?中文文本,image图......
  • [Java]Java初学之多线程05--Lock锁
    Intro除了synchronized关键字,从JDK5.0开始,Java提供了更强大的线程同步机制--通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当。本文简单讲一下Lock锁的概念以及简单应用。正文其实理解了synchronized关键字后,Lock锁的理解就会变得简单起来。Lock锁实际上是使用了j......
  • 无代码平台的表单平台 JAVA开源项目 毕业设计
    https://gf.bilibili.com/item/detail/1104045029为了帮助小白入门Java,博主录制了本项目配套的《项目手把手启动教程》,希望能给同学们带来帮助。一、摘要基于Vue+SpringBoot+MySQL的无代码平台的表单平台,包括了系统数据中心模块,用来存放管理系统通用的模块,另外分别设计了动态类型......
  • 高校大学生创业管理系统 JAVA开源项目 毕业设计
    https://gf.bilibili.com/item/detail/1104046029为了帮助小白入门Java,博主录制了本项目配套的《项目手把手启动教程》,希望能给同学们带来帮助。一、摘要基于Vue+SpirngBoot+MySQL的高校大学生创业管理系统,拥有系统公告、创业项目、创业社团、创业政策模块,以Vue.js为前端,Spring......
  • 大学计算机课程管理平台 JAVA开源项目 毕业设计
    https://gf.bilibili.com/item/detail/1104047029为了帮助小白入门Java,博主录制了本项目配套的《项目手把手启动教程》,希望能给同学们带来帮助。一、摘要1.1项目介绍大学计算机课程管理平台包含实验课程模块、实验资源模块、学生实验模块,前端采用Vue.js,采用ViewUI组件库美化界面......
  • 高校学生管理系统 JAVA开源项目 毕业设计
    https://gf.bilibili.com/item/detail/1104089029为了帮助小白入门Java,博主录制了本项目配套的《项目手把手启动教程》,希望能给同学们带来帮助。一、摘要基于Vue+SpringBoot+MySQL的高校学生管理系统包含学院课程模块、学生选课模块、课程补考模块,还包含系统自带的用户管理、部门......
  • 厦门旅游电子商务预订系统 JAVA开源项目 毕业设计
    https://gf.bilibili.com/item/detail/1104090029为了帮助小白入门Java,博主录制了本项目配套的《项目手把手启动教程》,希望能给同学们带来帮助。一、摘要基于Vue+SpringBoot+MySQL的厦门旅游电子商务预订系统包含景点类型模块、景点档案模块、景点评分模块、景点收藏模块、酒店模......