PHP实现微信随机红包算法和微信红包的架构设计简介

微信红包的架构设计简介:

原文:https://www.zybuluo.com/yulin718/note/93148

 

@来源于QCon某高可用架构群整理,整理朱玉华。

背景:有某个朋友在朋友圈咨询微信红包的架构,于是乎有了下面的文字(有误请提出,谢谢)

概况:2014年微信红包使用数据库硬抗整个流量,2015年使用cache抗流量。

1、微信的金额什么时候算? 

答:微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储。。 

采取实时计算金额的考虑:预算需要占存储,实时效率很高,预算才效率低。

2、实时性:为什么明明抢到红包,点开后发现没有? 

答:2014年的红包一点开就知道金额,分两次操作,先抢到金额,然后再转账。 

2015年的红包的拆和抢是分离的,需要点两次,因此会出现抢到红包了,但点开后告知红包已经被领完的状况。进入到第一个页面不代表抢到,只表示当时红包还有。

3、分配:红包里的金额怎么算?为什么出现各个红包金额相差很大? 

答:随机,额度在0.01和剩余平均值*2之间。 

例如:发100块钱,总共10个红包,那么平均值是10块钱一个,那么发出来的红包的额度在0.01元~20元之间波动。 

当前面3个红包总共被领了40块钱时,剩下60块钱,总共7个红包,那么这7个红包的额度在:0.01~(60/7*2)=17.14之间。 

注意:这里的算法是每被抢一个后,剩下的会再次执行上面的这样的算法(Tim老师也觉得上述算法太复杂,不知基于什么样的考虑)。

这样算下去,会超过最开始的全部金额,因此到了最后面如果不够这么算,那么会采取如下算法:保证剩余用户能拿到最低1分钱即可。

如果前面的人手气不好,那么后面的余额越多,红包额度也就越多,因此实际概率一样的。

4、红包的设计 

答:微信从财付通拉取金额数据郭莱,生成个数/红包类型/金额放到redis集群里,app端将红包ID的请求放入请求队列中,如果发现超过红包的个数,直接返回。根据红包的裸祭处理成功得到令牌请求,则由财付通进行一致性调用,通过像比特币一样,两边保存交易记录,交易后交给第三方服务审计,如果交易过程中出现不一致就强制回归。

5、发性处理:红包如何计算被抢完? 

答:cache会抵抗无效请求,将无效的请求过滤掉,实际进入到后台的量不大。cache记录红包个数,原子操作进行个数递减,到0表示被抢光。财付通按照20万笔每秒入账准备,但实际还不到8万每秒。

6、通如何保持8w每秒的写入? 

答:多主sharding,水平扩展机器。

7、据容量多少? 

答:一个红包只占一条记录,有效期只有几天,因此不需要太多空间。

8、询红包分配,压力大不? 

答:抢到红包的人数和红包都在一条cache记录上,没有太大的查询压力。

9、一个红包一个队列? 

答:没有队列,一个红包一条数据,数据上有一个计数器字段。

10、有没有从数据上证明每个红包的概率是不是均等? 

答:不是绝对均等,就是一个简单的拍脑袋算法。

11、拍脑袋算法,会不会出现两个最佳? 

答:会出现金额一样的,但是手气最佳只有一个,先抢到的那个最佳。

12、每领一个红包就更新数据么? 

答:每抢到一个红包,就cas更新剩余金额和红包个数。

13、红包如何入库入账? 

数据库会累加已经领取的个数与金额,插入一条领取记录。入账则是后台异步操作。

14、入帐出错怎么办?比如红包个数没了,但余额还有? 

答:最后会有一个take all操作。另外还有一个对账来保障。

 

 

使用PHP发红包,当我们输入红包数量和总金额后,PHP会根据这两个值进行随机分配每个金额,保证每个人都能领取到一个红包,每个红包金额不等,就是要求红包金额要有差异,所有红包金额总额应该等于总金额。

首先给大家分析下规律:

设定总金额为10元,有N个人随机领取:

N=1 第一个

则红包金额=X元;

N=2 第二个

为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数。

第二个红包=10-第一个红包金额;

N=3 第三个

红包1=0.01至9.99之间的某个随机数

红包2=0.01至(10-红包1-0.01)的某个随机数

红包3=10-红包1-红包2

……

于是我们得到一个规律,在分配当前红包金额时,先预留剩余红白所需最少金额,然后在0.01至总金额-预留金额间取随机数,得到的随机数就是当前红包分配的金额。

实际应用中,程序先将红包金额分配好,即发红包时,红包个数以及每个红包的金额都分配好了,那么用户来抢红包时,我们随机给用户返回一个红包即可。

微信红包分配算法代码:

$total=19.5;//红包总金额
$num=9;// 分成10个红包,支持10人随机领取
$min=0.01;//每个人最少能收到0.01元
$money_arr=array(); //存入随机红包金额结果
for ($i=1;$i<$num;$i++)
{$safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限$money= mt_rand($min*100,$safe_total*100)/100;$total=$total-$money;$money_arr[]= $money;echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total.' 元 '."<br/>";
}
echo '第'.$num.'个红包:'.round($total,2).' 元,余额:0 元';
$money_arr[] = round($total,2);dd($money_arr);

 

运行以上代码,会输出以下结果:

第1个红包:2.15 元,余额:17.35 元 
第2个红包:1.46 元,余额:15.89 元 
第3个红包:2.23 元,余额:13.66 元 
第4个红包:2.43 元,余额:11.23 元 
第5个红包:2.37 元,余额:8.86 元 
第6个红包:0.1 元,余额:8.76 元 
第7个红包:2.26 元,余额:6.5 元 
第8个红包:2.09 元,余额:4.41 元 
第9个红包:4.41 元,余额:0 元


以上就是使用php实现微信发红包程序,希望对大家有所帮助!

转载于:https://www.cnblogs.com/zmdComeOn/p/10345663.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务实现事务一致性实例

分布式系统架构中&#xff0c;分布式事务问题是一个绕不过去的挑战。而微服务架构的流行&#xff0c;让分布式事问题日益突出&#xff01; 下面我们以电商购物支付流程中&#xff0c;在各大参与者系统中可能会遇到分布式事务问题的场景进行详细的分析&#xff01; 如上图所示&a…

使用ama0实现串口通信_“ AMA”是什么意思,以及如何使用它?

使用ama0实现串口通信BigTunaOnline/ShutterstockBigTunaOnline / ShutterstockThe term “AMA” is a staple of Reddit, and it has spread to the far corners of the internet. But what does AMA mean, who came up with the word, and how do you use it? “ AMA”一词是…

火狐 url 乱码_在Firefox中查看URL作为工具提示

火狐 url 乱码Would you like a way to view link URLs wherever you mouse is located in a webpage rather than using the Status Bar? Now you can do so very easily with the URL Tooltip extension for Firefox. 您是否想通过一种方式而不是使用状态栏来查看链接URL&am…

Juniper SRX防火墙批量导入set格式配置

Juniper SRX防火墙批量导入set格式配置 SRX在进行大量配置时可能会出现一些小问题&#xff0c;可以使用load set terminal命令导入大量set格式的配置。 root# load set terminal[Type ^D at a new line to end input] 输入配置set applications application tcp-1521 protocol …

java虚拟机之内存分配

Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时&#xff0c;Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。 JDK1.8之前的堆内存示意图&#xff1a; 从上图可以看出堆内存分为新生代、老年代和永久代。新生代又被进一步分为&#xff1a;Ed…

知道无人驾驶的网络安全有多重要吗?英国政府都决定插手开发了

这样的策略也被解读为&#xff0c;英国政府希望借此抢占未来无人驾驶汽车研发的先机。 相信看过下午我们有关速8中黑科技的文章的朋友们&#xff0c;一定对有关车辆网络安全印象深刻&#xff0c;也足以见得未来无人驾驶时代的网络安全问题有多重要。所以&#xff0c;英国政府决…

linux uniq命令_如何在Linux上使用uniq命令

linux uniq命令Fatmawati Achmad Zaenuri/ShutterstockFatmawati Achmad Zaenuri / ShutterstockThe Linux uniq command whips through your text files looking for unique or duplicate lines. In this guide, we cover its versatility and features, as well as how you c…

解决 display 和 transition 冲突的问题

问题&#xff1a; 既需要“显示、隐藏”’效果&#xff0c;也需要动画效果。此时使用了xxx.style.display "none / block" 之后&#xff0c;我们发现 transition 动画效果就没有了。 解决办法一&#xff1a;用定时器&#xff08;这种方法并不好&#xff09; btn2.on…

win10任务栏和开始菜单_如何将网站固定到Windows 10任务栏或开始菜单

win10任务栏和开始菜单Having quick access to frequently-used or hard to remember websites can save you time and frustration. Whether you use Chrome, Firefox, or Edge, you can add a shortcut to any site right to your Windows 10 taskbar or Start menu. 快速访问…

智能家居的尴尬:概念比用户火

智能家居概念的走俏与用户的接受程度成鲜明的对比&#xff0c;如何才能撬开这个市场&#xff0c;这是整个行业都需要思考的问题。 追溯起源&#xff0c;智能家居已经有20年的历史&#xff0c;但由于技术缺陷、价格昂贵&#xff0c;实用性差、安装复杂及产品同质化严重等原因&a…

WEB_矛盾

题目链接&#xff1a;http://123.206.87.240:8002/get/index1.php 题解&#xff1a; 打开题目&#xff0c;看题目信息&#xff0c;本题首先要弄清楚 is_numeric() 函数的作用 作用如下图&#xff1a; 即想要输出flag&#xff0c;num既不能是数字字符&#xff0c;不能为数1&…

如何在Windows上解决蓝牙问题

Bluetooth gives you the freedom to move without a tether, but it isn’t always the most reliable way to use wireless devices. If you’re having trouble with Bluetooth on your Windows machine, you can follow the steps below to troubleshoot it. 蓝牙使您可以不…

Multicast注册中心

1234提供方启动时广播自己的地址。   消费方启动时广播订阅请求。   提供方收到订阅请求时&#xff0c;单播自己的地址给订阅者&#xff0c;如果设置了unicastfalse&#xff0c;则广播给订阅者。   消费方收到提供方地址时&#xff0c;连接该地址进行RPC调用。 <du…

阻止a链接跳转方法总结

总结下a标签阻止默认行为的几种简单方法(1) <a href"javascript:void(0);" > 点我 </a> onclick方法负责执行js函数&#xff0c;而void是一个操作符&#xff0c;void(0)返回undefined&#xff0c;地址不发生跳转。 <a href"javascript:;&qu…

美味奇缘_轻松访问和管理您的美味书签

美味奇缘Looking for an easy way to access and manage your Delicious Bookmarks collection with minimal UI impact? Now you can with SimpleDelicious for Firefox. 是否正在寻找一种简单的方法来访问和管理您的Delicious Bookmarks收藏&#xff0c;而对UI的影响最小&am…

谈谈如何使用Netty开发实现高性能的RPC服务器

RPC&#xff08;Remote Procedure Call Protocol&#xff09;远程过程调用协议&#xff0c;它是一种通过网络&#xff0c;从远程计算机程序上请求服务&#xff0c;而不必了解底层网络技术的协议。说的再直白一点&#xff0c;就是客户端在不必知道调用细节的前提之下&#xff0c…

寒假万恶之源3:抓老鼠啊~亏了还是赚了?

1.代码&#xff1a; #include<iostream>using namespace std;int main(){ char a/*操作*/; int i/*计数工具*/,b0/*老鼠会开心几天*/; int e/*正常的来*/,f/*老鼠会悲伤几天*/; int c1/*老鼠来不来*/,d0/*奶酪数目*/,g0/*老鼠数目*/; for (i1;;i) { …

在Firefox中结合Wolfram Alpha和Google搜索结果

Do you wish there was a way to combine all that Wolfram Alpha and Google goodness together when you search for something? Now you can with the Wolfram Alpha Google extension for Firefox. 您是否希望有一种方法可以在搜索某些内容时将Wolfram Alpha和Google的所有…

Docker容器中开始.NETCore之路

一、引言  开始写这篇博客前&#xff0c;已经尝试练习过好多次Docker环境安装,.Net Core环境安装了&#xff0c;在这里替腾讯云做一个推广,假如我们想学习、练手.net core 或是Docker却苦于没有开发环境&#xff0c;服务器也不想买&#xff0c;那么我们可以使用腾讯云提供的开…

分布式的数据一致性

一.前序 数据的一致性和系统的性能是每个分布式系统都需要考虑和权衡的问题。一致性的级别如下&#xff1a;1.强一致性这种一致性级别是最符合用户直觉的&#xff0c;它要求系统写入什么&#xff0c;读出来的也会是什么&#xff0c;用户体验好&#xff0c;但实现起来往往对系统…