一起探讨学习

每天给大家提供技术干货

springboot实现高并发红包系统(全网最全)
下面的业务处理请根据你们实际的场景进行处理
1.sql设计
CREATE TABLE `red_packet_info` (
`id` int(0) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`packet_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '红包id',
`type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '红包类型(0=拼手气红包,1=普通红包,2=文字口令红包,3=语音口令红包)',
`watchword_content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '口令内容',
`user_id` int(0) NOT NULL COMMENT '用户id,哪个用户发的红包',
`total_amount` decimal(8, 2) NOT NULL COMMENT '红包总金额',
`total_packet` int(0) NOT NULL COMMENT '红包个数',
`amount_one` decimal(8, 2) NULL DEFAULT NULL COMMENT '单个红包金额',
`blessing` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '红包祝福语',
`cover` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '红包封面',
`left_amount` decimal(8, 2) NOT NULL COMMENT '剩余红包金额',
`left_packet` int(0) NOT NULL COMMENT '剩余红包个数',
`expire_time` datetime(0) NOT NULL COMMENT '红包过期时间',
`send_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '发送红包类型(0=私发,1=群发)',
`status` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '红包状态(1=已创建,-1=已失效,2=已抢完)',
`create_time` datetime(0) NOT NULL COMMENT '创建时间',
`update_time` datetime(0) NOT NULL COMMENT '更新时间',
`deleted` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '0' COMMENT '是否删除',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '更新者',
`tenant_id` bigint(0) NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `packet_id`(`packet_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 775 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '红包表' ROW_FORMAT = Dynamic;
CREATE TABLE `red_packet_records` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`user_id` int(0) NOT NULL COMMENT '用户id',
`amount` decimal(8, 2) NOT NULL COMMENT '抢到的金额',
`watchword_content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '口令内容',
`red_packet_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '红包id',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime(0) NOT NULL COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime(0) NOT NULL COMMENT '更新时间',
`deleted` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '1' COMMENT '是否删除',
`tenant_id` bigint(0) NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 223 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '红包记录表' ROW_FORMAT = Dynamic;
2.实体类
RedPacketInfoDO
package cn.inno.pala.module.packet.dal.dataobject;
import cn.inno.pala.framework.tenant.core.db.TenantBaseDO;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("red_packet_info")
public class RedPacketInfoDO extends TenantBaseDO {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String packetId;
private String type;
private String watchwordContent;
private Integer userId;
private BigDecimal totalAmount;
private Integer totalPacket;
private BigDecimal amountOne;
private String blessing;
private String cover;
private BigDecimal leftAmount;
private Integer leftPacket;
private String sendType;
private Date expireTime;
private String status;
@TableField(exist = false)
private String nickname;
@TableField(exist = false)
private String avatar;
}
RedPacketRecordsDO
package cn.inno.pala.module.packet.dal.dataobject;
import cn.inno.pala.framework.tenant.core.db.TenantBaseDO;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("red_packet_records")
public class RedPacketRecordsDO extends TenantBaseDO {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private Integer userId;
private BigDecimal amount;
private String watchwordContent;
private String redPacketId;
@TableField(exist = false)
private String nickname;
@TableField(exist = false)
private String avatar;
}
3.Mapper
RedPacketInfoMapper
package cn.inno.pala.module.packet.dal.mysql;
import cn.inno.pala.framework.mybatis.core.mapper.BaseMapperX;
import cn.inno.pala.module.packet.dal.dataobject.RedPacketInfoDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface RedPacketInfoMapper extends BaseMapperX<RedPacketInfoDO> {
RedPacketInfoDO getRedPacket(@Param("packetId") String packetId);
}
RedPacketRecordsMapper
package cn.inno.pala.module.packet.dal.mysql;
import cn.inno.pala.framework.mybatis.core.mapper.BaseMapperX;
import cn.inno.pala.module.packet.dal.dataobject.RedPacketRecordsDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface RedPacketRecordsMapper extends BaseMapperX<RedPacketRecordsDO> {
RedPacketRecordsDO getRedPacketRecord(@Param("packetId") String packetId, @Param("userId") Long userId);
List<RedPacketRecordsDO> getRedPacketRecordList(@Param("packetId") String packetId);
}
4.xml
RedPacketInfoMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.inno.pala.module.packet.dal.mysql.RedPacketInfoMapper">
<resultMap id="redPacketResultMap" type="RedPacketInfoDO">
<id column="id" property="id"></id>
<result column="packet_id" property="packetId"></result>
<result column="type" property="type"></result>
<result column="watchword_content" property="watchwordContent"></result>
<result column="user_id" property="userId"></result>
<result column="total_amount" property="totalAmount"></result>
<result column="total_packet" property="totalPacket"></result>
<result column="amount_one" property="amountOne"></result>
<result column="blessing" property="blessing"></result>
<result column="cover" property="cover"></result>
<result column="left_amount" property="leftAmount"></result>
<result column="left_packet" property="leftPacket"></result>
<result column="expire_time" property="expireTime"></result>
<result column="send_type" property="sendType"></result>
<result column="status" property="status"></result>
<result column="create_time" property="createTime"></result>
<result column="update_time" property="updateTime"></result>
<result column="deleted" property="deleted"></result>
<result column="creator" property="creator"></result>
<result column="updater" property="updater"></result>
<result column="tenant_id" property="tenantId"></result>
</resultMap>
<select id="getRedPacket" resultMap="redPacketResultMap">
SELECT r.*, m.nickname, m.avatar
FROM `red_packet_info` r
INNER JOIN member_user m ON r.user_id = m.id
WHERE r.packet_id = #{packetId}
</select>
</mapper>
RedPacketRecordsMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.inno.pala.module.packet.dal.mysql.RedPacketRecordsMapper">
<resultMap id="redPacketRecordResultMap" type="RedPacketRecordsDO">
<id column="id" property="id"></id>