java 请求队列_javaweb把请求保存到队列里。高并发

本文介绍了在高并发抢购场景下,如何使用Java和Redis构建请求队列来处理订单请求,以确保数据一致性。在用户下单时,先将商品剩余数量存入Redis,然后将请求放入线程安全的LinkedBlockingQueue中,由后台线程异步处理,从而避免超发问题。同时,还提出了轮询订单的状态以确认购买是否成功的解决方案。
摘要由CSDN通过智能技术生成

一、背景

在移动互联网高速发展的时代,各种电商平台的抢购业务变得越来越火爆,抢购业务所带来的高并发问题值得我们去探索,主要涉及的方面包括处理和响应速度、数据的一致性等。抢购开放的一瞬间,可能有成千上万的下订单请求发送到服务器去处理,如果只是简单的请求处理响应方式,不做任何处理,导致的结果很可能是很多客户很长时间得不到响应,根本不知道自己是否下订单成功,或者下订单的数量已经超过了商品的数量,这就导致了超发的问题。

二、设计思路

1、用户在下订单之前当然是先查询到这个商品,在这个查询的时候,将数据库中商品的剩余数量存到redis中;

2、服务器在一瞬间接到成千上万的下订单请求,在控制层没有直接处理请求数据,而是先根据redis中商品的剩余数量来判断,如果>0,就将请求放到请求队列中,否则直接响

应客户端“卖完了”;

3、考虑到数据的一致性,队列的容量就是商品的剩余数量,队列采用的是线程安全的队列LinkedBlockingQueue(单台服务器),然后通过新的线程异步处理这些请求,多台服务器的话,可以考虑使用消息队列MQ,单独用一台服务器去处理消息队列中的请求;

4、客户端发送订单请求之后,会收到响应,要么是剩余数量不足(卖完了),要么是请求已经被放到队列中,为下一步的轮询订单做准备;

5、如果响应状态是卖完了,直接提示客户,如果请求已经放入队列中,就可以根据用户id和商品id去轮询订单了;

三、实现步骤

说明:用java语言,springmvc框架+redis实现

1、准备工作,查询商品信息,将剩余数量同步到redis中

Jedis jedis = jedisPool.getResource();

BuyGood good=buyGoodService.getById(good_id);

jedis.set("residue"+good_id, good.getResidue()+"");

jedisPool.returnResource(jedis);

2、下订单的方法,下面直接展示代码,包括请求对象,控制层方法,请求处理线程类的具体实现

2.1 请求封装对象

public class BuyRequest {

private int good_id;//商品id

private int user_id;//用户ID

private int order_id;//订单id

private BuyOrders buyOrders;//订单信息

private int respo

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值