springboot+websocket实现并发抢红包功能

概述

抢红包功能作为几大高并发场景中典型,应该如何实现?

源码地址:https://gitee.com/tech-famer/farmer-redpacket

分析

参考微信抢红包功能,将抢红包分成一下几个步骤:

  1. 发红包;主要填写红包信息,生成红包记录
  2. 红包支付回调;用户发红包支付成功后,收到微信支付付款成功的回调,生成指定数量的红包。
  3. 抢红包;用户并发抢红包。
  4. 拆红包;记录用户抢红包记录,转账抢到的红包金额。

效果展示

项目使用sessionId模拟用户,示例打开俩个浏览器窗口模拟两个用户。

在这里插入图片描述

设计开发

表结构设计

红包记录在 redpacket 表中,用户领取红包详情记录在 redpacket_detail 表中。

CREATE DATABASE  `redpacket`;

use `redpacket`;

CREATE TABLE `redpacket`.`redpacket` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `packet_no` varchar(32) NOT NULL COMMENT '订单号',
  `amount` decimal(5,2) NOT NULL COMMENT '红包金额最高10000.00元',
  `num` int(11) NOT NULL COMMENT '红包数量',
  `order_status` int(4) NOT NULL DEFAULT '0' COMMENT '订单状态:0初始、1待支付、2支付成功、3取消',
  `pay_seq` varchar(32) DEFAULT NULL COMMENT '支付流水号',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `user_id` varchar(32) NOT NULL COMMENT '用户ID',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  `pay_time` datetime DEFAULT NULL COMMENT '支付时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='红包订单表';

CREATE TABLE `redpacket`.`redpacket_detail` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `packet_id` bigint(20) NOT NULL COMMENT '红包ID',
  `amount` decimal(5,2) NOT NULL COMMENT '红包金额',
  `received` int(1) NOT NULL DEFAULT '0' COMMENT '是否领取0未领取、1已领取',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  `user_id` varchar(32) DEFAULT NULL COMMENT '领取用户',
  `packet_no` varchar(32) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='红包详情表';

发红包设计

用户需要填写红包金额、红包数量、备注信息等,生成红包记录,微信收银台下单,返回用户支付。

public RedPacket generateRedPacket(ReqSendRedPacketsVO data,String userId) {
    final BigDecimal amount = data.getAmount();
    //红包数量
    final Integer num = data.getNum();

    //初始化订单
    final RedPacket redPacket = new RedPacket();
    redPacket.setPacketNo(UUID.randomUUID().toString().replace("-", ""));
    redPacket.setAmount(amount);
    redPacket.setNum(num);
    redPacket.setUserId(userId);
    Date now = new Date();
    redPacket.setCreateTime(now);
    redPacket.setUpdateTime(now);
    int i = redPacketMapper.insertSelective(redPacket);
    if (i != 1) {
        throw new ServiceException("生成红包出错", ExceptionType.SYS_ERR);
    }

    //模拟收银台下单
    String paySeq = UUID.randomUUID().toString().replace("-", "");

    //拿到收银台下单结果,更新订单为待支付状态
    redPacket.setOrderStatus(1);//待支付
    redPacket.setPaySeq(paySeq);
    i = redPacketMapper.updateByPrimaryKeySelective(redPacket);
    if (i != 1) {
        throw new ServiceException("生成红包出错", ExceptionType.SYS_ERR);
    }
    return redPacket;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了实现Spring Boot应用程序中的自动刷新,可以使用WebSocket协议。WebSocket协议是一种在Web浏览器和服务器之间进行双向通信的协议。在Spring Boot中,可以使用Spring WebSocket模块来实现WebSocket功能。下面是一个简单的示例,演示如何使用Spring Boot和WebSocket实现自动刷新: 1.添加依赖 在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 2.创建WebSocket配置类 创建一个WebSocket配置类,用于配置WebSocket相关的参数。在这个类中,我们需要实现WebSocketMessageBrokerConfigurer接口,并重写configureMessageBroker()和registerStompEndpoints()方法。 ```java @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws").withSockJS(); } } ``` 3.创建WebSocket控制器 创建一个WebSocket控制器,用于处理WebSocket请求。在这个控制器中,我们需要使用@MessageMapping注解来处理客户端发送的消息,并使用@SendTo注解将处理结果发送给所有订阅了“/topic/greetings”主题的客户端。 ```java @Controller public class GreetingController { @MessageMapping("/hello") @SendTo("/topic/greetings") public Greeting greeting(HelloMessage message) throws Exception { Thread.sleep(1000); // simulated delay return new Greeting("Hello, " + message.getName() + "!"); } } ``` 4.创建HTML页面 创建一个HTML页面,用于测试WebSocket功能。在这个页面中,我们需要使用JavaScript代码来创建WebSocket连接,并使用STOMP协议来发送和接收消息。 ```html <!DOCTYPE html> <html> <head> <title>Hello WebSocket</title> <script src="https://cdn.jsdelivr.net/sockjs/1.1.4/sockjs.min.js"></script> <script src="https://cdn.jsdelivr.net/stomp.js/2.3.3/stomp.min.js"></script> <script> var stompClient = null; function connect() { var socket = new SockJS('/ws'); stompClient = Stomp.over(socket); stompClient.connect({}, function(frame) { console.log('Connected: ' + frame); stompClient.subscribe('/topic/greetings', function(greeting) { showGreeting(JSON.parse(greeting.body).content); }); }); } function disconnect() { if (stompClient !== null) { stompClient.disconnect(); } console.log("Disconnected"); } function sendName() { var name = document.getElementById('name').value; stompClient.send("/app/hello", {}, JSON.stringify({ 'name': name })); } function showGreeting(message) { document.getElementById('greetings').innerHTML += "<tr><td>" + message + "</td></tr>"; } </script> </head> <body> <div> <label for="name">Name:</label> <input type="text" id="name" /> <button onclick="sendName()">Send</button> <button onclick="disconnect()">Disconnect</button> </div> <table> <thead> <tr> <th>Greetings</th> </tr> </thead> <tbody id="greetings"> </tbody> </table> <script> connect(); </script> </body> </html> ``` 5.运行应用程序 运行Spring Boot应用程序,并在浏览器中打开HTML页面。在页面中输入名称并单击“Send”按钮,应该会看到一个新的问候语出现在页面上。如果您更改了控制器中的问候语消息,页面上的问候语也会相应更改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值