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

网站后台数据采集上海网站seo

网站后台数据采集,上海网站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.yayakq.cn/news/519260/

相关文章:

  • 酒店用品网站源码济南酷火网站建设
  • 移动商城网站建设网站建设与实践步骤
  • 网站哪个公司做的比较好的赣州室内设计学校
  • 建筑网站排行榜找人做试管婴儿的网站
  • flash个人网站动画人力资源服务外包
  • 什么是小手机型网站阿里云网站模板送域名
  • 盱眙网站制作阳江网胜
  • 免费网站奖励自己游戏热门网页游戏平台
  • 网站建设ftp软件WordPress登录美化扁平化
  • 城乡建设部网站施工员证书查询酒类网站该怎么做
  • 网站开发工具简述网站开发的完整流程图
  • ps素材网站大全陕西做网站的公司电话
  • 酒店手机网站首页设计网站建设哪好
  • 没内容的网站怎么优化wordpress发布文章报错
  • 网站模板下载 免费网站添加广告源码
  • 网站建设 博客thinkphp 显示第三方网站图片
  • 专门做图的网站网站可分为哪两种类型
  • 网站 源码 下载厦门市建设工程在哪备案网站
  • 吉安建设工程项目网站修改dns连接外国网站
  • 网站模板是什么家具网站案例
  • 电影网站加盟可以做么郑州网站制作网
  • 文学网站建设湖州市南浔区建设局网站
  • 网站建设最好1688平台
  • 深圳专业网站设计专业定制房地产app开发
  • 郑州网站制作公司怎么样wordpress 酒店预订
  • 网站制作教学广州网站建设公司怎么选
  • 自己买服务器可以搭建网站吗如何选择徐州网站开发
  • 有个做h手游的网站房地产销售述职报告
  • 自动优化网站建设无棣做网站
  • 网站开发人员选项百度商家入驻