分布式锁redission

This commit is contained in:
fang 2025-03-24 20:19:52 +08:00
parent 2ed23fc89f
commit 200d6e5068
4 changed files with 37 additions and 4 deletions

View File

@ -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>

View 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);
}
}

View File

@ -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();
} }
} }

View File

@ -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;