使用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 &gt; 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数据库操作、并发处理、安全性等多个关键IT知识点,对于想要深入学习这些技术的开发者来说,这是一个很好的实践案例。...
该项目是使用Spring Boot、Redis和MySQL数据库来实现的抢红包功能。这个系统设计的主要目标是创建一个高效且实时的红包分配系统,适用于线上活动或社交应用。以下将详细阐述涉及的技术点及其作用。 1. **Spring ...
微信付出 10 块,随机抢红包到账 1-100 块,这便是精彩交换抢红包方式,招引了不计其数用户参加抢红包,全新吸粉方式,这种娱乐性的红包方式很受欢迎,现在许多商家都喜爱玩这种方式圈钱! •运行环境:php+mysql ...
在IT行业中,开发一款“攒红包抢红包”应用涉及到许多技术层面的知识,这些技术涵盖了后端服务器开发、数据库设计、前端交互以及网络通信等多个领域。接下来,我们将详细探讨这些关键知识点。 1. **后端开发**:...
在这个模拟发红包的小程序中,我们可以深入学习如何使用Django框架来设计RESTful API,处理HTTP请求,与数据库交互(如SQLite或MySQL),实现并发控制(防止同一用户重复抢红包),以及如何利用模板语言(如Django...
普通红包会将总金额随机分配给抢红包的用户,而定额红包则确保每个用户领取到的金额是固定的。 **1. 红包算法设计** 在PHP中实现红包算法,首先需要设定红包的总额、红包个数以及最大和最小金额限制。普通红包的...
高并发业务实现——抢红包 ProjectGoal:模拟20万元的红包,共分2万可抢的小红包,有3万人抢夺的场景 ProjectLink: 1.MySql数据库建表 (1)红包表t_red_packet 字段 参数范围 字段释义 id int(12) 红包编号pk user_id ...
第二步:把根目录sql后缀名的数据库文件,通过mysql数据库管理工具(比如:NavicatforMySQL)导入mysql数据库。 第三步:对照修改includes文件夹里的config.php文件数据库信息,用记事本可以打开。
2. **数据库管理**:存储用户信息、红包记录、口令等数据,可能使用MySQL、MongoDB等数据库。 3. **微信支付接口**:与微信支付接口对接,处理红包资金的充值、发放、退款等操作,需要熟悉微信支付的文档和协议。 ...
源码集成了丰富的游戏体验,包括俱乐部、多模式比赛和活动功能,如万人抢红包、水果狂欢、欢乐农场等,并支持捕鱼游戏的寻宝活动。客户端支持编译为Android和iOS APP及H5版本。源码包含服务器端Java、客户端白鹭引擎...
2. **数据库管理**:源码包含数据库后台,可能使用SQLite或MySQL等轻量级数据库系统。数据库用于存储用户信息、关注状态、交互记录等。开发者需要理解如何在E4A中进行数据库操作,包括创建表、插入数据、查询和更新...
java抢红包源码 MobileApp 2016-12-29 升级到spring-boot1.4 neo4j 使用自带的rest 进行图数据库的维护与引擎的调度; 2016-12-27 增加druid监控; 2016-12-20 菜单调整 2016-11-29 完成java 动态脚本调用groovy ...
这可能涉及到数据库的使用,如SQLite或者MySQL,通过JDBC(Java Database Connectivity)接口进行连接和操作。开发者可能创建了数据访问对象(DAO,Data Access Object)来封装这些数据库操作,使得业务逻辑与数据...
这款小程序不仅具备基本的发红包、抢红包的功能,还可能包括一些定制化的互动元素,如特定主题的红包、文字互动等,从而提升了用户在社交场景中的互动体验。 首先,我们要了解的是微信小程序的基本概念。微信小程序...
2. **红包分配**:实现红包的公平分配,可能需要使用多线程或并发技术,比如 `java.util.concurrent` 包中的 `ExecutorService` 和 `Semaphore` 等工具,确保多个用户能同时进行抢红包操作而不发生冲突。 3. **用户...
H5聊天系统即时通讯,IM聊天APP、聊天、交友、客服、微信 带安卓、苹果端APP源码/视频教程项目是...数据库方面:要用到多个数据库联合,mysql 用作写,mongodb 用作读,实现读写分离,数据库合理设计,数据库水平切分。
3. **数据库操作**:为了存储用户信息、红包记录等数据,项目可能采用了关系型数据库如MySQL,或者非关系型数据库如MongoDB。这涉及到SQL查询优化和事务处理,以及ORM(Object-Relational Mapping)框架如Hibernate或...
数据库设计需要考虑到数据的一致性、安全性及查询效率,可能采用MySQL或NoSQL数据库,如MongoDB。 四、服务器端与后端开发 小程序的后端通常负责处理业务逻辑、数据交互、接口提供等功能。开发者需要编写API接口,...
首先,使用Redis作为缓存系统,可以减少数据库的读写操作。在抢购开始时,我们可以先将商品库存信息存储到Redis中,而不是直接从数据库查询。Redis支持原子操作,如`INCRBY`命令,可以用来减小库存,这样在高并发...