当前位置: 首页 > news >正文

上海网站排名公司中国建筑今天最新消息

上海网站排名公司,中国建筑今天最新消息,商城微网站模板,杭州网站seo价格抢红包大致可以分为2步:1 发红包 ;2 抢红包 发红包流程 为了突出红包设计主题,以下设计会忽略支付流程、24H过期退款剩余金额、用户领取红包余额到账等业务,则简化后的相关表设计如下: CREATE TABLE red_record (id…

抢红包大致可以分为2步:1 发红包 ;2 抢红包

发红包流程
image.png
为了突出红包设计主题,以下设计会忽略支付流程、24H过期退款剩余金额、用户领取红包余额到账等业务,则简化后的相关表设计如下:

CREATE TABLE `red_record` (`id` bigint NOT NULL AUTO_INCREMENT,`user_id` bigint NOT NULL COMMENT '用户id',`total` int(11) NOT NULL COMMENT '人数',`amount` int(11) NOT NULL COMMENT '总金额(单位为分)',`status` tinyint(4) DEFAULT '1' COMMENT '状态:1 已发送,2 已抢完',`create_time` datetime DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COMMENT='发红包记录';
// 忽略 支付流程 和 24H过期退还剩余金额CREATE TABLE `red_rob_record` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` int(11) NOT NULLL COMMENT '用户ID',`red_record_id` int(11)  COMMENT '红包ID',`amount` int(11) NOT NULL COMMENT '红包金额(单位为分)',`rob_time` datetime DEFAULT NULL COMMENT '时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=118 DEFAULT CHARSET=utf8 COMMENT='抢红包记录';

红包算法选取二倍均值算法,保证无论用户是先抢还是后抢都保证抢到金额的概率一致。
二倍均值算法逻辑实现图:
image.png
算法代码实现:

/*** 二倍均值法计算红包金额* @param totalAmount 总金额 (单位分)* @param peopleNum 总人数* @return*/public static List<Integer> divideRedPackage(Integer totalAmount,Integer peopleNum) {List<Integer> list = new ArrayList<>();//金额和人数都必须大于0if (totalAmount > 0 && peopleNum > 0) {//重置入参Integer restAmount = totalAmount;Integer restNum = peopleNum;//计算红包while (restNum - 1 > 0) {//计算红包金额  高效随机数 随机范围 左闭右开 [1,restAmount / restNum * 2)//随机数使用高效的ThreadLocalRandomint amount = ThreadLocalRandom.current().nextInt(restAmount / restNum * 2 - 1) + 1;//金额减少 人数减一restAmount -= amount;restNum--;list.add(amount);}//最后一个人的红包list.add(restAmount);}return list;}

发红包代码实现:

/*** 发红包* @param totalAmount 总金额 (单位分)* @param peopleNum 总人数* @param userId 用户id* @return*/public void sendRedPackage(Integer totalAmount,Integer peopleNum,Long userId) {//金额和人数必须要大于0//持久化发红包信息RedRecordDO redRecordDO = new RedRecordDO();redRecordDO.setUserId(userId);redRecordDO.setAmount(totalAmount);redRecordDO.setTotal(peopleNum);//忽略支付流程 默认已支付redRecordDO.setStatus(1);redRecordService.save(redRecordDO);//计算发红包明细金额List<Integer> list = RedPackageUtil.divideRedPackage(totalAmount,peopleNum);//生成redis的key String key = "m:r:"+redId;//存储到redis中redisService.getListOps().rightPushAll(key,list);}

抢红包流程
image.png抢红包直接使用redis作为数据源码,利用redis高吞吐量的特性,在发红包阶段先用红包算法将其拆分,存储到redis中的list类型中。
主要利用redis的list数据类型的lpop原子操作(移除并获取列表第一个元素)
可以在redis客户端上简单看一下 list的lpop操作:
image.png
image.png

具体代码实现如下:

    /*** 抢红包* @param redId 红包id* @param userId 领取红包的用户id* @return null 表示红包已抢完*/public Integer robRedPackage(Long redId,Long userId){//redis key ,key建议缩写 m表示系统缩写 r 表示红包缩写String key = "m:r:"+redId;//先判断key是否存在if(redisService.exists(key)){//直接弹出list中的元素 lpop是原子性 ,且弹出list所有元素后会删除这个keyInteger amount = (Integer)redisService.getListOps().leftPop(key);//元素不为空,exists不是原子性指令,则 amount可能为null if(Objects.nonNull(amount)){//元素不为空则表示抢红包成功,异步更新红包流水redRobRecordService.robRecord(redId,userId,amount);}return amount;}//直接返回红包已被抢光return null;}
http://www.15wanjia.com/news/185591.html

相关文章:

  • 网站开发工具选择企业电话
  • 网站如何做银联在线支付做钓鱼网站教程视频
  • 东乌珠穆沁旗网站建设c网站开发教程
  • 手机门户网站源码wordpress 8080端口
  • 学做吃的网站百度seo网站
  • win2008 iis配置网站互联网营销师培训课程
  • 如何提高网站的收录率和收录量c2c网站建设费用
  • 长春做网站优化价格joomla 做外贸网站 好的
  • 怎样网站建设做视频网站需要什么资质
  • 汽车网站开发思路一个服务器大概需要多少钱
  • 手工做的网站呼和浩特可以做网站的公司
  • 网站建设公司合同模板如何优化网站 提高排名
  • 网站规划流程电脑上免费制作ppt的软件
  • 商业网站是什么网站改版iis301跳转如何做
  • 罗定网站优化如何做公司宣传网站
  • 移动端网站建设推广方案首服网页游戏开服表
  • 上海高端网站开发公WordPress多功能新闻积分商城主题
  • 赣州兼职网站建设中国最大的建站平台
  • 南京电商网站建设宣传画册设计
  • ui网站开发设计平台市场分析
  • 西部数码网站管理助手如何免费申请网站域名
  • 移动网站和定制网站注册域名后怎么建设网站
  • 自己建网站做推广万盛网站建设公司
  • 做网站要求电脑配置定制模板
  • 网站安全检测产品优势梅州企业网站建设公司
  • 亲 怎么给一个网站做备份php外贸网站源码
  • 响应式网站和非响应式网站的区别电商知识基础
  • 全网黄页网站动漫制作专业电脑配置
  • 四川建设安全协会网站wordpress自定义页
  • 网站开发毕设结论移动网站用什么建设