阿里巴巴网站怎么做全屏大图,学校网站开发与实现的解决思路,自己做网站怎么让字体居中,江苏省住房建设厅网站Springboot整合Redission分布式锁
引言#xff1a;实际项目中#xff0c;我们经常会遇到一些需要考虑使用分布式锁的场景#xff0c;以防止页面重复请求或者多系统之间相互重复调用的产生业务偏差的问题#xff1b; 例如#xff1a; 1.并发的场景下#xff0c;生成订单需…Springboot整合Redission分布式锁
引言实际项目中我们经常会遇到一些需要考虑使用分布式锁的场景以防止页面重复请求或者多系统之间相互重复调用的产生业务偏差的问题 例如 1.并发的场景下生成订单需要进行使用分布式锁来锁定商品库存避免出现超卖情况。 2.定时任务部署多个服务存在某些任务被同时执行的情况
一、springboot引入redission依赖 !-- redis 分布式锁 --dependencygroupIdorg.redisson/groupIdartifactIdredisson/artifactIdversion3.5.0/version/dependency二、配置redis链接信息实际各配置信息根据项目具体情况而定
##默认密码为空
redis:host: 127.0.0.1port: 6379jedis:pool:#连接池最大连接数使用负值表示没有限制max-active: 100# 连接池中的最小空闲连接max-idle: 10# 连接池最大阻塞等待时间使用负值表示没有限制max-wait: 100000timeout: 5000database: 1三、RedissonClient客户端配置单机模式
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 单机模式分布式锁配置*/Configuration
public class RedissionConfig {Value(${redis.host})private String redisHost;Value(${redis.port})private String redisPort;Value(${redis.database})private int database;Bean(destroyMethod shutdown)public RedissonClient redissonClient() {Config config new Config();config.useSingleServer().setAddress(redis:// redisHost : redisPort).setDatabase(database);return Redisson.create(config);}
}四、测试 4.1 lockTest1方法对锁进行锁定让现场睡眠1分钟模拟业务一直占用锁的场景 4.2 lockTest2 在业务1执行时候尝试去获取锁看是否能获取到锁同时等30秒后锁过期再去获取锁是否可以正常获取到锁 Resourceprivate RedissonClient redissonClient;ApiOperation(value 分布式可重入锁测试1, notes 分布式锁测试1)PostMapping(/lockTest1)Result lockTest1(RequestBody RedisRequestDto dto){RLock lock redissonClient.getLock(dto.getKey());String message ;try {// lock.lock(); 会有看门狗机制默认30秒
// lock.lock();// 此处采用手动设置过期时间不会触发看门狗机制boolean locked lock.tryLock(30, 60, TimeUnit.SECONDS);if(locked){message lockTest1 锁成功了;log.info(message);}else {message lockTest1 1锁失败了;log.info(message);}Thread.sleep(60000);} catch (InterruptedException e) {e.printStackTrace();}finally {if(Objects.nonNull(lock) lock.isHeldByCurrentThread()){log.info({}锁被释放,dto.getKey());lock.unlock();}}return Result.ok(message);}ApiOperation(value 分布式可重入锁测试2, notes 分布式锁测试2)PostMapping(/lockTest2)Result lockTest2(RequestBody RedisRequestDto dto){RLock lock redissonClient.getLock(dto.getKey());try {boolean isLocked lock.isLocked();if(isLocked){log.info({}锁被占用请稍后,dto.getKey());return Result.ok(锁占用请稍后);}else {log.info({}锁未占用继续执行,dto.getKey());return Result.ok(锁未占用继续执行);}} catch (Exception e) {e.printStackTrace();}finally {if(Objects.nonNull(lock) lock.isHeldByCurrentThread()){lock.unlock();}}return Result.ok();}测试结果 请求参数如下
1.lockTest1 执行以后我们可以看到有在db1中有一条记录同时返回锁成功 2.lockTest2 执行时候就是锁占用证明“test_lock”已经被占用无法获取 3.等待30秒以后test_lock锁自动过期再次执行lockTest2可以正常获取到锁 通过日志我们也能看出整个锁的锁定和释放的情况
2024-01-15 15:15:13.560 INFO 191576 --- [nio-1012-exec-1] c.s.house.controller.RedisController : lockTest1 锁成功了
2024-01-15 15:15:16.960 INFO 191576 --- [nio-1012-exec-3] c.s.house.controller.RedisController : test_lock锁被占用请稍后
2024-01-15 15:16:24.566 INFO 191576 --- [nio-1012-exec-5] c.s.house.controller.RedisController : test_lock锁未占用继续执行