1、pom文件依赖 文章来源:https://www.toymoban.com/news/detail-667956.html
<!--引入Redis操作依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、具体实现文章来源地址https://www.toymoban.com/news/detail-667956.html
package com.xch;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/**
* 扣减库存实现Redis分布式锁测试
* 实际演示:需要在多个服务器部署/启动多个端口该项目,使用Nginx部署负载均衡,再使用JMeter压测
*
* @author XuChenghe
* @date 2023/8/18 14:03
*/
public class DeductStockTest {
/**
* 以String操作Redis
*/
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* 以对象操作Redis
*/
@Autowired
private RedisTemplate redisTemplate;
@RequestMapping("/deduct_stock")
public String deductStock() {
String lockKey = "product_1001";
String clientId = UUID.randomUUID().toString();
Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 30, TimeUnit.SECONDS);
if (!result) {
return "请稍等,前方阻塞!";
}
try {
int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock")); // jedis.get("stock");
if (stock > 0) {
stringRedisTemplate.opsForValue().set("stock", stock - 1 + ""); // jedis.set("stock", stock - 1 + "");
System.out.println("扣减成功,剩余库存:" + (stock - 1));
} else {
System.out.println("扣减失败,库存不足");
}
} finally {
// 确保删除的是自己设置的锁,以下两行代码需要原子性
if (clientId.equals(stringRedisTemplate.opsForValue().get(lockKey))) {
stringRedisTemplate.delete(lockKey);
}
}
return "扣减库存函数处理结束";
}
/**
* 以上该经典案例,均由Redisson实现了现成的方案
*/
}
到了这里,关于Redis手动实现分布式锁-Demo的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!