java抢红包_Java 用Redis 实现抢红包功能

553888e7c280d8771c4f1c30d2796d6e.png

红包功能描述

红包功能现在已经很普遍了,主要功能发红包和抢红包。

一发一抢或一发多抢,主要难点还是一发多择抢高并发场景。

红包功能分析

首先我们假设会员体系和金额账号体系都已经存在,我们本功能只是一个小红包工具。

红包一发一抢,一发多抢。那可以得出有一个红包订单,然后,红包订单分成多个子红包订单。

一发一抢是特殊情况,就是一个红包订单对应一个子红包订单。

上面分析完了,可以分析出我们需要设计两张表。

表一红包订单:订单ID、会员ID、订单编号、红包金额、红包个数、红包类型、红包状态、抢掉金额、未抢金额、抢到红包数、未抢红包数、子红包XX格式集合、创建时间、更新时间等。

表二子红包订单:子红包订单ID、发会员ID、抢会员ID、会员名、红包金额、红包类型、订单编号、创建时间、更新时间等。

红包功能设计

我们这边只说后端实现,假设前端已经都设计好了也都实现好了

功能点:发送红包接口,发送会员查询红包情况接口,抢会员查询红包情况接口、打开红包接口、抢红包接口,红包清点定时器。

接口功能分析:

发送红包:根据发送者提供的红包个数,红包金额,发送红包。发送会员查询红包情况:抢会员查询红包情况:打开红包接口:查看红包是否已经抢光了,如果没抢光得到一个抢红包的入门KEY。抢红包接口:抢红包,检查是否有抢红包的入门KEY,抢红包是否符合抢红包和红包是否能抢,然后,直接抢红包。红包清点定时器:如果红包没被抢完,时间到期直接把剩下红包金额还给发送者。

红包功能伪代码开发

我们用中文的伪代码(主引教程的特色)解析开发功能:

创建两个表和实体类都实现了,dao层,service层、controller层都写了。

发送红包

现在在controller层添加一个sendRed 接口有若干个参数,其中红包个数和金额都有。

开始写代码了:

1、会员金额账号检查是否有足够的金额。2、随机生成红包个数的红包金额。3、创建一个红包订单对象,把对象存储到数据库。4、把发送会员的金额账号对应的红包金额扣除,把对象存储到数据库。5、把红包的个数按数组的形式存储到Redis的队列上(list集合类型)。6、返回给发送者发送成功并把红包发出来。

打开红包接口

现在在controller层添加一个openRed 接口有红包订单的信息。

开始写代码了:

1、先判断该会员是否有权限访问这个红包。2、判断红包是否有效。3、红包有效,从Redis里面生成对应这个红包的入门KEY。4、返回给会员红包打开。

抢红包接口

现在在controller层添加一个grabRed 接口有红包订单的信息。

开始写代码了:

1、先判断该会员是否有权限访问(根据Redis的入门KEY)这个红包。2、判断红包是否有效并有的抢。3、抢到Redis里对应的序号,然后,和数据库里的子红包XX格式集合解析出子红包多少金额。4、把红包的金额生成子红包保存到数据,并且修改会员的金额账号5、返回给会员抢到红包。6、返回给发送者发送成功并把红包发出来。

红包清点定时器

在项目里添加上一个quartz的定时器,实现对有效的红包定时清除功能。

开始写代码了:

1、查询红包状态是有效了。2、根据退还规则把剩下的红包转到发红包会员金额账号。

红包功能技术分析

Redis是单线程的,上面的实现红包有可能部分抢不到。不会被多抢,并发也没什么压力。

一般一个红包也就500人来抢,压力主要是带宽等资源,还有服务器的CPU等。

首先:Redis先存储红包的子包一个序号,会员先打开就是到Redis那边拿到抢红包的入门KEY,到抢红包这个环节会判断Redis的入门KEY,存在才让取Redis子红包的序号。才继续红包抢的功能。

Redis的入门KEY,可以理解分布式锁,拿到了才可以拿子红包的资源。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值