Java 用Redis 实现抢红包功能

红包功能描述

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

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

红包功能分析

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

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

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

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

表一红包订单:订单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,可以理解分布式锁,拿到了才可以拿子红包的资源。

Copyright © 2019-2019主引教程mainboot.com All Rights Reserved. 备案号: 闽ICP备13019624号-4