分布式锁redission
This commit is contained in:
parent
2ed23fc89f
commit
200d6e5068
5
pom.xml
5
pom.xml
@ -63,6 +63,11 @@
|
|||||||
<artifactId>aspectjweaver</artifactId>
|
<artifactId>aspectjweaver</artifactId>
|
||||||
<version>1.9.7</version>
|
<version>1.9.7</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.redisson</groupId>
|
||||||
|
<artifactId>redisson</artifactId>
|
||||||
|
<version>3.22.1</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<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;
|
package com.hmdp.service.impl;
|
||||||
|
|
||||||
import cn.hutool.db.handler.RsHandler;
|
import cn.hutool.db.handler.RsHandler;
|
||||||
|
import com.hmdp.config.RedissonConfig;
|
||||||
import com.hmdp.dto.Result;
|
import com.hmdp.dto.Result;
|
||||||
import com.hmdp.entity.SeckillVoucher;
|
import com.hmdp.entity.SeckillVoucher;
|
||||||
import com.hmdp.entity.Voucher;
|
import com.hmdp.entity.Voucher;
|
||||||
@ -13,6 +14,8 @@ import com.hmdp.service.IVoucherService;
|
|||||||
import com.hmdp.utils.RedisIdWorker;
|
import com.hmdp.utils.RedisIdWorker;
|
||||||
import com.hmdp.utils.SimpleRedisLock;
|
import com.hmdp.utils.SimpleRedisLock;
|
||||||
import com.hmdp.utils.UserHolder;
|
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.AopContext;
|
||||||
import org.springframework.aop.framework.AopProxy;
|
import org.springframework.aop.framework.AopProxy;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -39,6 +42,8 @@ public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, Vou
|
|||||||
private RedisIdWorker redisIdWorker;
|
private RedisIdWorker redisIdWorker;
|
||||||
@Resource
|
@Resource
|
||||||
private StringRedisTemplate stringRedisTemplate;
|
private StringRedisTemplate stringRedisTemplate;
|
||||||
|
@Resource
|
||||||
|
private RedissonClient redissonClient;
|
||||||
@Override
|
@Override
|
||||||
public Result seckillVoucher(Long voucherId) {
|
public Result seckillVoucher(Long voucherId) {
|
||||||
|
|
||||||
@ -62,8 +67,12 @@ public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, Vou
|
|||||||
// IVoucherOrderService proxy = (IVoucherOrderService) AopContext.currentProxy();
|
// IVoucherOrderService proxy = (IVoucherOrderService) AopContext.currentProxy();
|
||||||
// return proxy.creatVoucheOrder(voucherId);
|
// 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){
|
if(!isLock){
|
||||||
return Result.fail("请勿重复下单");
|
return Result.fail("请勿重复下单");
|
||||||
}
|
}
|
||||||
@ -73,7 +82,7 @@ public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, Vou
|
|||||||
return proxy.creatVoucheOrder(voucherId);
|
return proxy.creatVoucheOrder(voucherId);
|
||||||
} finally {
|
} finally {
|
||||||
// 释放锁
|
// 释放锁
|
||||||
simpleRedisLock.unLock();
|
lock.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package com.hmdp.service.impl;
|
package com.hmdp.service.impl;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.hmdp.config.RedissonConfig;
|
||||||
import com.hmdp.dto.Result;
|
import com.hmdp.dto.Result;
|
||||||
import com.hmdp.entity.Voucher;
|
import com.hmdp.entity.Voucher;
|
||||||
import com.hmdp.mapper.VoucherMapper;
|
import com.hmdp.mapper.VoucherMapper;
|
||||||
@ -23,7 +24,6 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
public class VoucherServiceImpl extends ServiceImpl<VoucherMapper, Voucher> implements IVoucherService {
|
public class VoucherServiceImpl extends ServiceImpl<VoucherMapper, Voucher> implements IVoucherService {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private ISeckillVoucherService seckillVoucherService;
|
private ISeckillVoucherService seckillVoucherService;
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user