Java中的高并发秒杀场景下我们可以使用redisson来实现高并发秒杀功能, 以下就是一个可用于生产环境的高并发秒杀示例代码:
pom依赖
XML
<!-- https://mavenlibs.com/maven/dependency/org.redisson/redisson -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.23.3</version>
</dependency>
<dependency>
<groupId>de.ruedigermoeller</groupId>
<artifactId>fst</artifactId>
<version>2.57</version>
</dependency>
生产可用高并发秒杀代码示例:
java
package ws.yunnan.demo.service;
import org.redisson.api.RReadWriteLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service // 这个注解的作用是将当前类标识为spring服务加入到spring容器中
public class UserService {
@Autowired
private RedissonClient redisson;
public String addStock(int stock){
if (stock<1) stock=1000;
redisson.getBucket("product:123").set(stock);
return redisson.getBucket("product:123").get().toString();
}
public String deductStock(){
String redisKey = "product:123";
// 注意 新版本getReadWriteLock 这里的锁名称不能是已有的rediskey
final RReadWriteLock lock = redisson.getReadWriteLock("plock");
lock.writeLock().lock(); // 加锁
String msg="";
try {
// 从redis中获取当前剩余的库存数量
int stock = Integer.parseInt(redisson.getBucket(redisKey).get().toString());
if (stock > 0) {
int realStock = stock - 1;
// 更新库存数量
redisson.getBucket(redisKey).set(realStock);
msg=String.format("当前剩余库存: %d ",realStock);
} else {
msg="当前库存为空";
}
}finally {
lock.writeLock().unlock(); // 释放锁
}
System.out.println(msg);
return msg;
}
}
完整示例项目见:
Github: GitHub - tekintian/myspringboot-app: 自己动手实现的 SpringbootApplication 启动器项目, 用于学习springboot的启动原理和自动配置原理