`

使用mysql数据库实现抢红包

阅读更多
使用mysql数据库实现抢红包的功能
1.建表
红包表
create table red_packet
(
   id                   int(12)     auto_increment COMMENT '红包编号',
   user_id              int(12)                        COMMENT '发红包的用户id',
   amount               decimal(16,2)                  COMMENT '红包金额',
   send_date            timestamp                      DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '发红包日期',
   total                int(12)                        COMMENT '红包总数',
   unit_amount          decimal(12)                    COMMENT '单个红包的金额',
   stock                int(12)                        COMMENT '红包剩余个数',
   version              int(12) default 0              COMMENT '版本号',
   primary key(id)
);
用户抢红包表
create table red_packet_user
(
   id                   int(12)                        auto_increment COMMENT '用户抢到的红包id',
   red_packet_id        int(12)                        COMMENT '红包id',
   user_id              int(12)                        COMMENT '抢红包用户的id',
   amount               decimal(16,2)                  COMMENT '抢到的红包金额',
   grab_time            timestamp                      DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '抢红包时间',
   note                 varchar(256)                   null COMMENT '备注',
   primary key(id)
);

insert into red_packet(user_id, amount, send_date, total, unit_amount, stock)
values(1, 10000, now(), 2000, 5, 2000);

2.测试:性能1万元2000人抢

3.代码
@Service
public class RedPacketServiceImpl implements IRedPacketService {

@Resource
private RedPacketMapper redPacketMapper;

public RedPacketPO getRedPacket(Integer id) {
return redPacketMapper.getRedPacket(id);
}

public int decreaseRedPacket(Integer id) {
return redPacketMapper.updateRedPacketStock(id);
}

@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
public int grapRedPacket(Integer redPacketId, Integer userId) {
// 获取红包信息
    RedPacketPO redPacket = redPacketMapper.getRedPacket(redPacketId);
    int leftRedPacket = redPacket.getStock();
    // 当前小红包库存大于0
    if (leftRedPacket > 0) {
      redPacketMapper.updateRedPacketStock(redPacketId);
      // 生成抢红包信息
      RedPacketUserPO userRedPacket = new RedPacketUserPO();
      userRedPacket.setRedPacketId(redPacketId);
      userRedPacket.setUserId(userId);
      userRedPacket.setAmount(5);
      // 插入抢红包信息
      int result = redPacketMapper.insertRedPacketUser(userRedPacket);
      return result;
    }
    //没有红包啦.....剩余Stock数量
    return -1;
}

public int grapRedPacketProc(Integer redPacketId, Integer userId) {
int num = -1;
Map<string> map = new HashMap<string integer>();
map.put("v_red_packet_id", redPacketId);
map.put("v_user_id", userId);
redPacketMapper.grabRedPacketProcedure(map);
if(map.containsKey("num")) {
num = map.get("num");
}
return num;
}
}

<mapper namespace="cn.web.mapper.RedPacketMapper"><resultmap type="cn.web.po.RedPacketPO" id="redPacketMap"><result property="id" column="id"></result><result property="userId" column="user_id"></result><result property="amount" column="amount"></result><result property="sendDate" column="send_date"></result><result property="total" column="total"></result><result property="unitAmount" column="unit_amount"></result><result property="stock" column="stock"></result><result property="version" column="version"></result></resultmap><select id="getRedPacket" resultmap="redPacketMap" parametertype="int">
select * from red_packet where id = #{id}
</select><insert id="insertRedPacketUser" usegeneratedkeys="true" parametertype="cn.web.po.RedPacketUserPO">
        insert into red_packet_user (red_packet_id,user_id,amount) values (#{redPacketId},#{userId},#{amount})
    </insert><update id="updateRedPacketStock" parametertype="int">
    update red_packet set stock=stock-1 where id = #{id}
    </update><select id="grabRedPacketProcedure" parametermap="paramMap" resulttype="map" statementtype="CALLABLE">
    {call grabRedPacketProcedure(?,?,?)}
    </select><parametermap type="java.util.Map" id="paramMap"><parameter property="v_red_packet_id" mode="IN" javatype="INTEGER" jdbctype="INTEGER"></parameter><parameter property="v_user_id" mode="IN" javatype="INTEGER" jdbctype="INTEGER"></parameter><parameter property="num" mode="OUT" javatype="INTEGER" jdbctype="INTEGER"></parameter></parametermap></mapper>
4.说明:
使用mysql来抢红包,2000人抢完红包大概花20多秒;使用存储过程也差不多20多秒
优化:
(1)使用存储过程
delimiter //
DROP PROCEDURE IF EXISTS grabRedPacketProcedure
//
create PROCEDURE grabRedPacketProcedure(IN v_red_packet_id INTEGER,IN v_user_id INTEGER,OUT num INTEGER)
begin
set num:= -1;
select @total:=stock from red_packet where id = v_red_packet_id;
if @total > 0 then
begin
start transaction;
update red_packet set stock=stock-1 where id = v_red_packet_id;
insert into red_packet_user(red_packet_id,user_id,amount) values (v_red_packet_id,v_user_id,5);
commit;
set num:= 1;
end;
end if;
end
//
DELIMITER ;

存储过程测试:
DELIMITER //
set @num=0;
call grabRedPacketProcedure(1,1,@num);
select @num;
//
DELIMITER ;

</string></string>
分享到:
评论

相关推荐

    PHP MYSQL抢钱派对抢红包商业版程序源码【修正后最新VIP版】

    综上所述,"PHP MYSQL抢钱派对抢红包商业版程序源码【修正后最新VIP版】"涵盖了PHP编程、MYSQL数据库操作、并发处理、安全性等多个关键IT知识点,对于想要深入学习这些技术的开发者来说,这是一个很好的实践案例。...

    基于springboot+redis+mysql实现抢红包功能项目-源码

    该项目是使用Spring Boot、Redis和MySQL数据库来实现的抢红包功能。这个系统设计的主要目标是创建一个高效且实时的红包分配系统,适用于线上活动或社交应用。以下将详细阐述涉及的技术点及其作用。 1. **Spring ...

    ThinkPHP微信独立精彩交换抢红包体系源码开源版

    微信付出 10 块,随机抢红包到账 1-100 块,这便是精彩交换抢红包方式,招引了不计其数用户参加抢红包,全新吸粉方式,这种娱乐性的红包方式很受欢迎,现在许多商家都喜爱玩这种方式圈钱! •运行环境:php+mysql ...

    攒红包抢红包源代码

    在IT行业中,开发一款“攒红包抢红包”应用涉及到许多技术层面的知识,这些技术涵盖了后端服务器开发、数据库设计、前端交互以及网络通信等多个领域。接下来,我们将详细探讨这些关键知识点。 1. **后端开发**:...

    django实现的模拟实现发红包小程序

    在这个模拟发红包的小程序中,我们可以深入学习如何使用Django框架来设计RESTful API,处理HTTP请求,与数据库交互(如SQLite或MySQL),实现并发控制(防止同一用户重复抢红包),以及如何利用模板语言(如Django...

    php实现发红包

    普通红包会将总金额随机分配给抢红包的用户,而定额红包则确保每个用户领取到的金额是固定的。 **1. 红包算法设计** 在PHP中实现红包算法,首先需要设定红包的总额、红包个数以及最大和最小金额限制。普通红包的...

    java抢红包源码-RedPacket:抢红包基础实现v1.0

    高并发业务实现——抢红包 ProjectGoal:模拟20万元的红包,共分2万可抢的小红包,有3万人抢夺的场景 ProjectLink: 1.MySql数据库建表 (1)红包表t_red_packet 字段 参数范围 字段释义 id int(12) 红包编号pk user_id ...

    微信公众号裂变红包PHP源码

    第二步:把根目录sql后缀名的数据库文件,通过mysql数据库管理工具(比如:NavicatforMySQL)导入mysql数据库。 第三步:对照修改includes文件夹里的config.php文件数据库信息,用记事本可以打开。

    多种微信红包前端 后台源码含配置文档

    2. **数据库管理**:存储用户信息、红包记录、口令等数据,可能使用MySQL、MongoDB等数据库。 3. **微信支付接口**:与微信支付接口对接,处理红包资金的充值、发放、退款等操作,需要熟悉微信支付的文档和协议。 ...

    基于白鹭引擎的H5电玩城全套设计源码,包含数据库修复与多模式游戏体验

    源码集成了丰富的游戏体验,包括俱乐部、多模式比赛和活动功能,如万人抢红包、水果狂欢、欢乐农场等,并支持捕鱼游戏的寻宝活动。客户端支持编译为Android和iOS APP及H5版本。源码包含服务器端Java、客户端白鹭引擎...

    抖音互关源码 E4A源码含数据库后台程序搭建可用

    2. **数据库管理**:源码包含数据库后台,可能使用SQLite或MySQL等轻量级数据库系统。数据库用于存储用户信息、关注状态、交互记录等。开发者需要理解如何在E4A中进行数据库操作,包括创建表、插入数据、查询和更新...

    java抢红包源码-rest-api:基于spring-boot的rest风格的基础框架,整合mysql,oracle,redis,mongo

    java抢红包源码 MobileApp 2016-12-29 升级到spring-boot1.4 neo4j 使用自带的rest 进行图数据库的维护与引擎的调度; 2016-12-27 增加druid监控; 2016-12-20 菜单调整 2016-11-29 完成java 动态脚本调用groovy ...

    JAVA完整的操作系统(通讯录)

    这可能涉及到数据库的使用,如SQLite或者MySQL,通过JDBC(Java Database Connectivity)接口进行连接和操作。开发者可能创建了数据访问对象(DAO,Data Access Object)来封装这些数据库操作,使得业务逻辑与数据...

    包你shuo红包小程序源码

    这款小程序不仅具备基本的发红包、抢红包的功能,还可能包括一些定制化的互动元素,如特定主题的红包、文字互动等,从而提升了用户在社交场景中的互动体验。 首先,我们要了解的是微信小程序的基本概念。微信小程序...

    red_java_

    2. **红包分配**:实现红包的公平分配,可能需要使用多线程或并发技术,比如 `java.util.concurrent` 包中的 `ExecutorService` 和 `Semaphore` 等工具,确保多个用户能同时进行抢红包操作而不发生冲突。 3. **用户...

    即时通讯系统源码 支持红包转账 朋友圈 群聊和群聊红包 收藏功能 语音相册 视频通话.zip

    H5聊天系统即时通讯,IM聊天APP、聊天、交友、客服、微信 带安卓、苹果端APP源码/视频教程项目是...数据库方面:要用到多个数据库联合,mysql 用作写,mongodb 用作读,实现读写分离,数据库合理设计,数据库水平切分。

    RedPacket:QQ,微信抢红包原始码(允许学习交流使用,禁止使用商业目的)

    3. **数据库操作**:为了存储用户信息、红包记录等数据,项目可能采用了关系型数据库如MySQL,或者非关系型数据库如MongoDB。这涉及到SQL查询优化和事务处理,以及ORM(Object-Relational Mapping)框架如Hibernate或...

    包你说语音红包小程序源码

    数据库设计需要考虑到数据的一致性、安全性及查询效率,可能采用MySQL或NoSQL数据库,如MongoDB。 四、服务器端与后端开发 小程序的后端通常负责处理业务逻辑、数据交互、接口提供等功能。开发者需要编写API接口,...

    php结合redis实现高并发下的抢购、秒杀功能的实例

    首先,使用Redis作为缓存系统,可以减少数据库的读写操作。在抢购开始时,我们可以先将商品库存信息存储到Redis中,而不是直接从数据库查询。Redis支持原子操作,如`INCRBY`命令,可以用来减小库存,这样在高并发...

Global site tag (gtag.js) - Google Analytics