扁平化风格的网站,成都旅游住哪里最方便,wordpress搜索框插件,免费的公司起名网接着上一节#xff0c;我们遇到了超卖的问题#xff0c;并通过Redis实现分布式锁#xff0c;进行了解决。本节 我将换一种方式实现分布式锁。 前提#xff1a; nginx、redis、nacos 模块1#xff1a; provider-and-consumer 端口 8023 模块2 rabbitmq-consumer 端口 8021 … 接着上一节我们遇到了超卖的问题并通过Redis实现分布式锁进行了解决。本节 我将换一种方式实现分布式锁。 前提 nginx、redis、nacos 模块1 provider-and-consumer 端口 8023 模块2 rabbitmq-consumer 端口 8021
添加依赖
dependencygroupIdorg.redisson/groupIdartifactIdredisson/artifactIdversion3.15.6/version
/dependency业务代码
模块1代码 RedisTestController.java
package com.atguigu.gulimall.providerconsumer.controller;import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.UUID;
import java.util.concurrent.TimeUnit;/*** author: jd* create: 2024-07-08*/
RestController
RequestMapping(/test)
Slf4j
public class RedisTestController {Autowiredprivate StringRedisTemplate stringRedisTemplate;Autowiredprivate RedissonClient redissonClient;GetMapping(/RedissonLock)public String deductStockByRedisson(){//写死一个固定商品ID作为我们被秒杀的商品String lockKeylock:product:102;//获取锁对象RLock lock redissonClient.getLock(lockKey);//加锁使用lock方法锁将会自动续命lock.lock();try{//获取当前库存String stock1 stringRedisTemplate.opsForValue().get(stock);if(stock1null){System.out.println(秒杀未开始,请等开始后操作下单);return end;}int stock Integer.parseInt(stringRedisTemplate.opsForValue().get(stock));if(stock0){// 扣减库存int realStock stock - 1;// 更新库存stringRedisTemplate.opsForValue().set(stock, realStock );System.out.println(扣减成功剩余的库存为 realStock);}else {System.out.println(扣减库存失败库存不足);}}finally {if(lock.isLocked()lock.isHeldByCurrentThread()){//释放分布式锁lock.unlock();System.out.println(分布式锁释放); //解锁}}return end;}}
模块2代码 RedisTestController.java
package com.atguigu.gulimall.rabbitmqconsumer.controller;import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.UUID;
import java.util.concurrent.TimeUnit;/**** 和provider-and-consumer 这两个服务中都有这个RedisTestController用来模拟两个不同的服务* author: jd* create: 2024-07-08*/
RestController
RequestMapping(/test)
Slf4j
public class RedisTestController {Autowiredprivate StringRedisTemplate stringRedisTemplate;Autowiredprivate RedissonClient redissonClient;GetMapping(/RedissonLock)public String deductStockByRedisson(){//写死一个固定商品ID作为我们被秒杀的商品String lockKeylock:product:102;//获取锁对象RLock lock redissonClient.getLock(lockKey);//加锁使用lock方法锁将会自动续命lock.lock();try{//获取当前库存String stock1 stringRedisTemplate.opsForValue().get(stock);if(stock1null){System.out.println(秒杀未开始,请等开始后操作下单);return end;}int stock Integer.parseInt(stringRedisTemplate.opsForValue().get(stock));if(stock0){// 扣减库存int realStock stock - 1;// 更新库存stringRedisTemplate.opsForValue().set(stock, realStock );System.out.println(扣减成功剩余的库存为 realStock);}else {System.out.println(扣减库存失败库存不足);}}finally {if(lock.isLocked()lock.isHeldByCurrentThread()){//释放分布式锁lock.unlock();System.out.println(分布式锁释放); //解锁}}return end;}}
测试结果 单次请求我发送两次结果 第二次 成功扣减。
并发情况模拟 当前库存数 压测 并发压测结果 8023模块
扣减成功剩余的库存为83
分布式锁释放
扣减成功剩余的库存为81
分布式锁释放
扣减成功剩余的库存为80
分布式锁释放
扣减成功剩余的库存为78
分布式锁释放
扣减成功剩余的库存为76
分布式锁释放
扣减成功剩余的库存为75
分布式锁释放
扣减成功剩余的库存为72
分布式锁释放
扣减成功剩余的库存为68
分布式锁释放
扣减成功剩余的库存为66
分布式锁释放
扣减成功剩余的库存为64
分布式锁释放
扣减成功剩余的库存为62
分布式锁释放
扣减成功剩余的库存为60
分布式锁释放
扣减成功剩余的库存为58
分布式锁释放
扣减成功剩余的库存为56
分布式锁释放
扣减成功剩余的库存为54
分布式锁释放
扣减成功剩余的库存为52
分布式锁释放
扣减成功剩余的库存为50
分布式锁释放
扣减成功剩余的库存为48
分布式锁释放
扣减成功剩余的库存为46
分布式锁释放
扣减成功剩余的库存为44
分布式锁释放
扣减成功剩余的库存为42
分布式锁释放
扣减成功剩余的库存为40
分布式锁释放
扣减成功剩余的库存为38
分布式锁释放
扣减成功剩余的库存为36
分布式锁释放
扣减成功剩余的库存为34
分布式锁释放
扣减成功剩余的库存为32
分布式锁释放
扣减成功剩余的库存为30
分布式锁释放
扣减成功剩余的库存为28
分布式锁释放
扣减成功剩余的库存为26
分布式锁释放
扣减成功剩余的库存为24
分布式锁释放
扣减成功剩余的库存为22
分布式锁释放
扣减成功剩余的库存为20
分布式锁释放
扣减成功剩余的库存为18
分布式锁释放
扣减成功剩余的库存为16
分布式锁释放
扣减成功剩余的库存为14
分布式锁释放
扣减成功剩余的库存为12
分布式锁释放
扣减成功剩余的库存为10
分布式锁释放
扣减成功剩余的库存为8
分布式锁释放
扣减成功剩余的库存为6
分布式锁释放
扣减成功剩余的库存为4
分布式锁释放
扣减成功剩余的库存为2
分布式锁释放
扣减库存失败库存不足
分布式锁释放
扣减库存失败库存不足
分布式锁释放
扣减库存失败库存不足
分布式锁释放
扣减库存失败库存不足
分布式锁释放
扣减库存失败库存不足
分布式锁释放
扣减库存失败库存不足
分布式锁释放
扣减库存失败库存不足
分布式锁释放
扣减库存失败库存不足
分布式锁释放
扣减库存失败库存不足
分布式锁释放8021模块日志
扣减成功剩余的库存为82
分布式锁释放
扣减成功剩余的库存为79
分布式锁释放
扣减成功剩余的库存为77
分布式锁释放
扣减成功剩余的库存为74
分布式锁释放
扣减成功剩余的库存为73
分布式锁释放
扣减成功剩余的库存为71
分布式锁释放
扣减成功剩余的库存为70
分布式锁释放
扣减成功剩余的库存为69
分布式锁释放
扣减成功剩余的库存为67
分布式锁释放
扣减成功剩余的库存为65
分布式锁释放
扣减成功剩余的库存为63
分布式锁释放
扣减成功剩余的库存为61
分布式锁释放
扣减成功剩余的库存为59
分布式锁释放
扣减成功剩余的库存为57
分布式锁释放
扣减成功剩余的库存为55
分布式锁释放
扣减成功剩余的库存为53
分布式锁释放
扣减成功剩余的库存为51
分布式锁释放
扣减成功剩余的库存为49
分布式锁释放
扣减成功剩余的库存为47
分布式锁释放
扣减成功剩余的库存为45
分布式锁释放
扣减成功剩余的库存为43
分布式锁释放
扣减成功剩余的库存为41
分布式锁释放
扣减成功剩余的库存为39
分布式锁释放
扣减成功剩余的库存为37
分布式锁释放
扣减成功剩余的库存为35
分布式锁释放
扣减成功剩余的库存为33
分布式锁释放
扣减成功剩余的库存为31
分布式锁释放
扣减成功剩余的库存为29
分布式锁释放
扣减成功剩余的库存为27
分布式锁释放
扣减成功剩余的库存为25
分布式锁释放
扣减成功剩余的库存为23
分布式锁释放
扣减成功剩余的库存为21
分布式锁释放
扣减成功剩余的库存为19
分布式锁释放
扣减成功剩余的库存为17
分布式锁释放
扣减成功剩余的库存为15
分布式锁释放
扣减成功剩余的库存为13
分布式锁释放
扣减成功剩余的库存为11
分布式锁释放
扣减成功剩余的库存为9
分布式锁释放
扣减成功剩余的库存为7
分布式锁释放
扣减成功剩余的库存为5
分布式锁释放
扣减成功剩余的库存为3
分布式锁释放
扣减成功剩余的库存为1
分布式锁释放
扣减成功剩余的库存为0
分布式锁释放
扣减库存失败库存不足
分布式锁释放
扣减库存失败库存不足
分布式锁释放
扣减库存失败库存不足
分布式锁释放
扣减库存失败库存不足
分布式锁释放
扣减库存失败库存不足
分布式锁释放
扣减库存失败库存不足
分布式锁释放
扣减库存失败库存不足
分布式锁释放
可以看到没有超卖现象。至此Redission实现分布式锁已经OK。 redis实现分布式锁 可见博文【分布式锁】Redis实现分布式锁