分布式锁redission
This commit is contained in:
parent
2ed23fc89f
commit
200d6e5068
5
pom.xml
5
pom.xml
@ -63,6 +63,11 @@
|
||||
<artifactId>aspectjweaver</artifactId>
|
||||
<version>1.9.7</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.redisson</groupId>
|
||||
<artifactId>redisson</artifactId>
|
||||
<version>3.22.1</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
||||
19
src/main/java/com/hmdp/config/RedissonConfig.java
Normal file
19
src/main/java/com/hmdp/config/RedissonConfig.java
Normal file
@ -0,0 +1,19 @@
|
||||
package com.hmdp.config;
|
||||
|
||||
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() {
|
||||
//1.创建配置
|
||||
Config config = new Config();
|
||||
config.useSingleServer().setAddress("redis://192.168.56.10:6379").setPassword("123456");
|
||||
//2.根据 Config 创建出 RedissonClient 实例
|
||||
return Redisson.create(config);
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,7 @@
|
||||
package com.hmdp.service.impl;
|
||||
|
||||
import cn.hutool.db.handler.RsHandler;
|
||||
import com.hmdp.config.RedissonConfig;
|
||||
import com.hmdp.dto.Result;
|
||||
import com.hmdp.entity.SeckillVoucher;
|
||||
import com.hmdp.entity.Voucher;
|
||||
@ -13,6 +14,8 @@ import com.hmdp.service.IVoucherService;
|
||||
import com.hmdp.utils.RedisIdWorker;
|
||||
import com.hmdp.utils.SimpleRedisLock;
|
||||
import com.hmdp.utils.UserHolder;
|
||||
import org.redisson.api.RLock;
|
||||
import org.redisson.api.RedissonClient;
|
||||
import org.springframework.aop.framework.AopContext;
|
||||
import org.springframework.aop.framework.AopProxy;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@ -39,6 +42,8 @@ public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, Vou
|
||||
private RedisIdWorker redisIdWorker;
|
||||
@Resource
|
||||
private StringRedisTemplate stringRedisTemplate;
|
||||
@Resource
|
||||
private RedissonClient redissonClient;
|
||||
@Override
|
||||
public Result seckillVoucher(Long voucherId) {
|
||||
|
||||
@ -62,8 +67,12 @@ public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, Vou
|
||||
// IVoucherOrderService proxy = (IVoucherOrderService) AopContext.currentProxy();
|
||||
// return proxy.creatVoucheOrder(voucherId);
|
||||
// }
|
||||
SimpleRedisLock simpleRedisLock = new SimpleRedisLock("oreder:" + userID, stringRedisTemplate);
|
||||
boolean isLock = simpleRedisLock.tryLock(1200L);
|
||||
// 不再用自己实现的分布式锁了,因为它存在不可重入,不可重试,超时释放,主从一致的问题
|
||||
// SimpleRedisLock simpleRedisLock = new SimpleRedisLock("oreder:" + userID, stringRedisTemplate);
|
||||
// boolean isLock = simpleRedisLock.tryLock(1200L);
|
||||
// 利用redission 的分布式锁可以解决上述问题
|
||||
RLock lock = redissonClient.getLock("lock:oreder:" + userID);
|
||||
boolean isLock = lock.tryLock();
|
||||
if(!isLock){
|
||||
return Result.fail("请勿重复下单");
|
||||
}
|
||||
@ -73,7 +82,7 @@ public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, Vou
|
||||
return proxy.creatVoucheOrder(voucherId);
|
||||
} finally {
|
||||
// 释放锁
|
||||
simpleRedisLock.unLock();
|
||||
lock.unlock();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package com.hmdp.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.hmdp.config.RedissonConfig;
|
||||
import com.hmdp.dto.Result;
|
||||
import com.hmdp.entity.Voucher;
|
||||
import com.hmdp.mapper.VoucherMapper;
|
||||
@ -23,7 +24,6 @@ import java.util.List;
|
||||
*/
|
||||
@Service
|
||||
public class VoucherServiceImpl extends ServiceImpl<VoucherMapper, Voucher> implements IVoucherService {
|
||||
|
||||
@Resource
|
||||
private ISeckillVoucherService seckillVoucherService;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user