赞
踩
Java中的高并发秒杀场景下我们可以使用redisson来实现高并发秒杀功能, 以下就是一个可用于生产环境的高并发秒杀示例代码:
pom依赖
- <!-- 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>
生产可用高并发秒杀代码示例:
-
- 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的启动原理和自动配置原理
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。