一 微服务总体架构
1.1 微服务总体架构
1.2 红包雨的流程
1.3 发红包的内容
1.3.1 概述流程
1.发红包-》抢红包。
1.所有人签到的金额之和等于红包总金额。2.每个人至少抢到一分钱;3.保证所有人抢到金额的几率相等。
1.3.2 拆分红包通用流程算法
其中拆红包最为关键,设计的算法是:二倍均值算法。
二倍均值算法:剩余的余额M,剩余的人数N,每次抢到红包数=随机区间(0,(M/N)*2)
这个公式:保证每次随机金额是均值相等的,不会因为抢红包的先后顺序造成不公平。这句话不理解耶???
package com.ljf.redis.redpackage;
import java.util.Arrays;
import java.util.Random;
/**
* @ClassName: TwoAvgSuanFa
* @Description: TODO
* @Author: admin
* @Date: 2023/07/21 10:20:24
* @Version: V1.0
**/
public class TwoAvgSuanFa {
public static void main(String[] args) {
Integer[] integers= sendAvgPackage(100,5);
System.out.println(""+ Arrays.toString(integers));
}
public static Integer[] sendAvgPackage(int totalMoney,int redPackagNum){
Integer[] rpNumberArrays=new Integer[redPackagNum];
int useMoney=0;
for(int i=0;i<redPackagNum;i++){
if(i==redPackagNum-1){
rpNumberArrays[i]=totalMoney-useMoney;
}
else {
int avgMoney=((totalMoney-useMoney)/(redPackagNum-i))*2;
System.out.println("avgMoney:"+avgMoney);
rpNumberArrays[i]=1+new Random().nextInt(avgMoney-1);
}
useMoney=useMoney+rpNumberArrays[i];
}
return rpNumberArrays;
}
}
结果:
1.3.3 红包雨的架构流程
1.发红包
1.按照金额M,红包人数N,使用二倍均值法,将M分成N个子红包。使用redis的list数据结构进行存储。
逻辑
2.抢红包
1.从redis的红包池list中使用lpop命令进行取出数据消费,且和用户进行绑定,在redis中使用hash结构记录抢红包的记录。
2.每次抢红包前从redis的 hash结构中查询是否已经存在抢红包记录,无则抢,有则不让再抢。
1.3.4 红包雨的v2版本
待完善....