秒杀场景_多线程异步抢单队列分析与实现_02

在这里插入图片描述

文章目录

            • 1. 实体
            • 2. Service改造
            • 3. 启动类

1. 实体
package com.gblfy.entity;import java.io.Serializable;/*** 用户排队抢单信息实体*/@Data
public class SkillEntity implements Serializable {private Long productId;private String userId;
}
2. Service改造

SkillGoodService

package com.gblfy.service;import com.gblfy.dao.SkillOrderRepository;
import com.gblfy.entity.SkillEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import javax.transaction.Transactional;@Service
public class SkillGoodService {public static final String SKILL_GOODS_PHONE = "SKILL_GOODS_PHONE";public static final String SKILL_GOODS_LIST = "SKILL_GOODS_LIST";@Autowiredprivate RedisTemplate redisTemplate;@Autowiredprivate SkillOrderRepository skillOrderRepository;@Autowiredprivate ProductService productService;@Autowiredprivate MutilThreadOrder mutilThreadOrder;@Transactionalpublic void add(Long productId, String userId) throws Exception {// 先封装对象 并且放入redis 队列SkillEntity skillEntity=new SkillEntity();skillEntity.setProductId(productId);skillEntity.setUserId(userId);redisTemplate.boundListOps(SKILL_GOODS_LIST).leftPush(skillEntity);mutilThreadOrder.createOrder();}
}

新增MutilThreadOrder

package com.gblfy.service;import com.gblfy.dao.SkillOrderRepository;
import com.gblfy.entity.SkillEntity;
import com.gblfy.entity.SkillGood;
import com.gblfy.entity.SkillOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;@Component
public class MutilThreadOrder {@Autowiredprivate ProductService productService;@Autowiredprivate SkillOrderRepository skillOrderRepository;@Autowiredprivate RedisTemplate redisTemplate;@Asyncpublic void createOrder() throws Exception {System.out.println("开始异步抢单");SkillEntity skillEntity = (SkillEntity) redisTemplate.boundListOps(SkillGoodService.SKILL_GOODS_LIST).rightPop();if (skillEntity == null) {return;}Long productId = skillEntity.getProductId();String userId = skillEntity.getUserId();Thread.sleep(10000);SkillGood skillGood = productService.getGoodById(productId);if (skillGood == null) {throw new Exception("商品已经被抢光拉");}if (skillGood.getStockCount() > 0) {SkillOrder skillOrder = new SkillOrder();skillOrder.setMoney(skillGood.getCostPrice());skillOrder.setPayTime(new Date());skillOrder.setStatus("0");skillOrder.setUserId(userId);skillOrder.setCreateTime(new Date());skillOrder.setSkillId(productId);skillOrderRepository.save(skillOrder);skillGood.setStockCount(skillGood.getStockCount() - 1);redisTemplate.boundHashOps(SkillGoodService.SKILL_GOODS_PHONE).put(skillGood.getId(), skillGood);System.out.println("成功秒杀 剩余库存:" + skillGood.getStockCount());}if (skillGood.getStockCount() <= 0) {System.out.println("库存已经是负数了:" + skillGood.getStockCount());redisTemplate.boundHashOps(SkillGoodService.SKILL_GOODS_PHONE).delete(skillGood.getId());productService.update(skillGood);}System.out.println("结束异步抢单");}
}
3. 启动类
package com.gblfy;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.web.client.RestTemplate;@SpringBootApplication
@EnableDiscoveryClient
@EnableAsync
public class SkillServApplication {public static void main(String[] args) {SpringApplication.run(SkillServApplication.class, args);}@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);//采用普通的key 为 字符串template.setKeySerializer(new StringRedisSerializer());return template;}@Bean@LoadBalancedpublic RestTemplate create() {return new RestTemplate();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI赋能DevOps:数据驱动的全栈工程师实践

DevOps是什么&#xff1f; 对于传统的软件研发而言&#xff0c;开发&#xff0c;测试&#xff0c;运维&#xff0c;运营&#xff0c;有不同的岗位进行分工协作&#xff0c;以保证质量和专业度&#xff0c;同一件事情&#xff0c;依赖不同岗位的排期、沟通、协调&#xff0c;效率…

阿里HBase高可用8年“抗战”回忆录

2017年开始阿里HBase走向公有云&#xff0c;我们有计划的在逐步将阿里内部的高可用技术提供给外部客户&#xff0c;目前已经上线了同城主备&#xff0c;将作为我们后续高可用能力发展的一个基础平台。本文分四个部分回顾阿里HBase在高可用方面的发展&#xff1a;大集群、MTTF&a…

使用apache POI把list集合里面的实体写入Excel(java)

一、导入maven依赖包 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId>&…

一文带你了解混淆矩阵!

来源 | 数据科学CLUB封图 | CSDN 下载自视觉中国混淆矩阵是一个表&#xff0c;经常用来描述分类模型(或“分类器”)在已知真实值的一组测试数据上的性能。混淆矩阵本身比较容易理解&#xff0c;但是相关术语可能会令人混淆。让我们从一个二进制分类器的混淆矩阵示例开始(尽管它…

从0到千万DAU,这5年闲鱼架构如何演进?

阿里妹导读&#xff1a;闲鱼品牌创立于14年阿里的某个茶水间&#xff0c;从0开始到现在千万DAU&#xff0c;5年时间里闲鱼见证了闲置物品从线下到线上交易的转移。而线上交易的繁荣&#xff0c;则需要业务架构做相应的调整、演进才能支撑业务的快速发展。本文主要通过介绍闲鱼从…

初创公司5大Java服务困局,阿里工程师如何打破?

阿里妹导读&#xff1a;初创公司遇到的每一个问题都可能攸关生死。创业之初更应该总结行业的常见问题&#xff0c;对比方案寻找最优解。阿里巴巴地图技术专家常意在技术圈摸爬滚打数年&#xff0c;接触了各式各样的Java服务端架构。服务端问题见得多了&#xff0c;也就更能分辨…

Navicat for MySQL连接MySQL数据库时各种错误解决

一 、2058错误 通过命令行进入MySQL&#xff0c;执行如下命令&#xff1a; ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY root截图&#xff1a; 二、1251错误 通过命令行进入MySQL&#xff0c;执行如下命令&#xff1a; ALTER USER rootlocalhost I…

构建灵活工作方式 戴尔最智能商用客户端产品线全面上市

戴尔Latitude、Precision和OptiPlex产品组合再次全面升级&#xff0c;带来更高水平生产力 2020年6月12日&#xff0c;随着“新基建”首次被写入《政府工作报告》&#xff0c;数字经济将成为释放经济新动能的最重要途径。在企业加速数字化转型的过程中&#xff0c;生产力转型是…

秒杀场景_解决秒杀超卖问题_04

文章目录一、商品微服务改造二、秒杀微服务改造2.1. SkillGoodService 改造2.2. MutilThreadOrder 改造一、商品微服务改造 SkillGoodService改造 package com.gblfy.service;import com.gblfy.dao.SkillGoodRepository; import com.gblfy.entity.SkillGood; import lombok.R…

初识 Knative: 跨平台的 Serverless 编排框架

Knative 是什么 Knative 是 Google 在 2018 的 Google Cloud Next 大会上发布的一款基于 Kubernetes 的 Serverless 框架。Knative 一个很重要的目标就是制定云原生、跨平台的 Serverless 编排标准。Knative 是通过整合容器构建(或者函数)、工作负载管理(和动态扩缩)以及事件模…

python使用PyMysql连接MySQL实现增删改查

文章目录一、安装PyMysql&#xff1a;1.方式一&#xff1a;使用命令行2.方式二&#xff1a;通过PyCharm编译器二、操作MySQL数据库步骤1. 使用import导入相应的类2.获得数据库的连接3.创建游标对象4.执行SQL语句5.关闭数据库连接三、案例1. 查询单条数据2. 查询多条数据3.创建数…

一分钟解决 Github 访问慢

文章目录1. 获取域名对应的ip2. 复制ip3. 配置hostsgithub.com对应的ip有多个选一个响应快的即可&#xff0c;但是一直在变&#xff0c;用的时候&#xff0c;设置一次即可 1. 获取域名对应的ip https://tool.chinaz.com/dns/?type1&hostgithub.com&ip 2. 复制ip 3. …

做一个高一致性、高性能的Flutter动态渲染,真的很难么?

Flutter动态模板渲染架构升级 ​ 最近小组在尝试使用集团DinamicX的DSL&#xff0c;通过下发DSL模板&#xff0c;实现Flutter端的动态化模板渲染。我们解决了性能方面的问题后&#xff0c;又面临了一个新的挑战——渲染一致性。我们该如何在不降低渲染性能的前提下&#xff0c…

数据科学产业中哪些架构最热门?本文为你盘点了 5 款!

作者 | Sai Krishna译者 | 火火酱&#xff0c;责编 | Carol封图 | CSDN 付费下载自视觉中国地球上的数据量每分每秒都在增加&#xff0c;海量的数据源源不断地从四面八方涌入各种机构组织&#xff0c;而这些数据最终或许会成为能够指引我们做出战略决策的宝贵财富。这就是数据科…

面向云原生的混沌工程工具-ChaosBlade

作者 | 肖长军&#xff08;穹谷&#xff09;阿里云智能事业群技术专家 导读&#xff1a;随着云原生系统的演进&#xff0c;如何保障系统的稳定性受到很大的挑战&#xff0c;混沌工程通过反脆弱思想&#xff0c;对系统注入故障&#xff0c;提前发现系统问题&#xff0c;提升系…

centOS docker容器的安装

文章目录一、docker安装步骤1.卸载旧版本2.安装依赖3.添加镜像源4.查看仓库中的所有docker版本5.安装docker6.启动docker7.设置开机自启动docker8.查看docker是否安装成功9.卸载docker一、docker安装步骤 提示&#xff1a;安装之前可以使用命令&#xff1a;yum check-update检查…

泡着枸杞写bug的三流程序员凭什么逆袭到一线大厂?

大多数互联网的从业者都有一个梦想&#xff1a;进大厂。因为不仅可以享受较好的福利待遇&#xff0c;也能与更优秀的人一起共事&#xff0c;获得更专业、更快速的成长。最近经常有朋友提及想要入门编程学习&#xff0c;该如何学习&#xff1f;关于编程学习&#xff0c;各种语言…

哪种人是软件设计中的稀缺型人才?

阿里妹导读&#xff1a;好的系统架构离不开好的接口设计&#xff0c;因此&#xff0c;真正懂接口设计的人往往是软件设计队伍中的稀缺型人才。 为什么在接口制定标准中说&#xff1a;一流的企业做标准&#xff0c;二流的企业做品牌&#xff0c;三流的企业做产品&#xff1f;依赖…

快速Ubuntu的配置(以ubuntu 20.04桌面版为例)

文章目录一、&#x1f496;更换镜像源二、&#x1f496;安装VMware Tools工具三、&#x1f496;安装Google浏览器四、&#x1f496;安装搜狗输入法五、&#x1f496;安装C/C开发工具Clion&#x1f340;1.安装编译环境&#x1f340;2.安装开发环境一、&#x1f496;更换镜像源 …

阿里工程师太凶残了,竟把服务器泡在“水里”!

万众瞩目的第11个双11要来了&#xff01;这次天猫说要帮大家省500亿&#xff0c;身边加购物车、组队盖楼的同学数不胜数&#xff0c;热闹非凡。 但在阿里&#xff0c;有一位低调的“高冷男”&#xff0c;丝毫不为红红火火的双11所动&#xff0c;依然稳如磐石、淡定自若。 他的…