Java项目利用Redisson实现真正生产可用高并发秒杀功能 支持分布式高并发秒杀

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;
    }
}

完整示例项目见:

Gitee: myspringboot-app: 自己动手实现的 SpringbootApplication 启动器项目, 用于学习springboot的启动原理和自动配置原理. 主要用于理解学习springboot的启动, 自动配置原理, 虽然很简单,但是对于新手来说还是很有参考学习价值的!

Github: GitHub - tekintian/myspringboot-app: 自己动手实现的 SpringbootApplication 启动器项目, 用于学习springboot的启动原理和自动配置原理

相关推荐
⑩-4 分钟前
SpringCloud-Feign客户端实战
后端·spring·spring cloud
wniuniu_6 分钟前
ceph中的rbd的稀疏写入
java·服务器·数据库
2201_7578308714 分钟前
条件分页查询
java·开发语言
重生之我是Java开发战士18 分钟前
【数据结构】Java对象的比较
java·jvm·数据结构
橘子1325 分钟前
Linux线程——一些概念(七)
java·redis·缓存
magic_kid_201029 分钟前
IDEA 复制到 Windows 远程桌面失败的原因与解决方案
java·ide·intellij-idea
风月歌30 分钟前
基于微信小程序的学习资料销售平台源代码(源码+文档+数据库)
java·数据库·mysql·微信小程序·小程序·毕业设计·源码
巴拉巴拉~~33 分钟前
KMP 算法通用步进器组件:KmpStepperWidget 横向 / 纵向 + 匹配进度 + 全样式自定义
java·服务器·开发语言
贺今宵35 分钟前
使用idea启动一个springboot项目
java·ide·intellij-idea
AAA简单玩转程序设计41 分钟前
Java传参还在瞎传?这3个进阶基础技巧少走1年弯路
java