当前位置: 首页 > news >正文

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

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 {@Autowiredprivate 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 这里的锁名称不能是已有的rediskeyfinal 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的启动原理和自动配置原理

相关文章:

  • Alma Linux - Primavera P6 EPPM 安装及分享
  • C++程序设计-练手题集合【期末复习|考研复习】
  • PHP 服务实现监控可观测性最佳实践
  • 性能测试 —— 数据准备与基准场景设计!
  • LAMP架构部署--yum安装方式
  • node核心模块之Process
  • GPT能复制人类的决策和直觉吗?
  • C语言---指针的两个运算符:点和箭头
  • 价值学习和策略学习的区别
  • 15届蓝桥杯备赛(2)
  • mongoDB7.0.6版安装与使用(最新版踩坑记录)
  • 蓝桥杯--全球气温变暖
  • unraid docker.img扩容
  • Oracle中的commit与rollback
  • 微信小程序小白易入门基础教程1
  • 345-反转字符串中的元音字母
  • Cumulo 的 ClojureScript 模块已经成型
  • iOS 颜色设置看我就够了
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JavaScript实现分页效果
  • js数组之filter
  • MySQL QA
  • MySQL主从复制读写分离及奇怪的问题
  • nodejs:开发并发布一个nodejs包
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Python进阶细节
  • Redis中的lru算法实现
  • Redux系列x:源码分析
  • Spring核心 Bean的高级装配
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 前端性能优化--懒加载和预加载
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 算法系列——算法入门之递归分而治之思想的实现
  • 微服务框架lagom
  • 小试R空间处理新库sf
  • 写代码的正确姿势
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • Nginx实现动静分离
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • #pragma预处理命令
  • $.ajax中的eval及dataType
  • (+4)2.2UML建模图
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (笔试题)合法字符串
  • (一)Thymeleaf用法——Thymeleaf简介
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)linux下的时间函数使用
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .gitignore文件设置了忽略但不生效
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET 事件模型教程(二)