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.pswp.cn/news/278360.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/278360.shtml
英文地址,請注明出處:http://en.pswp.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;但實現起來往往對系統…