Redis分布式快取 微信搶紅包解決方案

2022-09-21 00:30:12 字數 1140 閱讀 8905

目錄

微信搶紅包已經在我們生活中很常見的場景了,特別是年底公司開年會和春節2個時間段,長輩領導都發紅包,手都點抽筋了,也沒搶到多少。

在這段時間裡,對於單個群裡的單個紅包,qp也是上千的,對於整個微信紅包系統,高峰的併發量是上億的。

高峰的搶紅包有3大特點:

1.包紅包

先把金額拆解為小金額的紅包,例如 總金額1000元,發10個,使用者在點儲存的時候,就自動拆解為10個隨機小紅包。

這裡的儲存就是個難題,多個金額(例如10個小金額的紅包)如何儲存?

2.搶紅包

高併發的搶紅包時核心的關鍵技術,就是控制各個小紅包的操作的原子性。

例如 10個紅包在100人的群裡被搶,10個紅包被搶走乙個的同時要紅包的庫存減1,即剩下19個。在整個過程中搶走乙個和紅包庫存減1個是乙個原子操作。

list的pop操作彈出乙個元素的同時會自動從佇列裡面剔除該元素,它是乙個原子性操作。

包紅包/**

* 包紅包的介面

*/@getmapping(value = "/set")

public long setredpacket(int total, int count) ={}",key,packet);

return n;

}拆解紅包

/*** 拆解紅包

* 1.紅包金額要被全部拆解完

* 2.紅包金額不能差太離譜

* total 紅包金額

* count 紅包數量

*/public integer splitredpacket(int total, int count)

use = use + array[i];

}return array;

}搶紅包

www.cppcns.com /**

* 搶紅包介面

*/@getmapping(value = "/rob")

public int rob(long redid,long userid) 搶到{}",userid,obj);

//todo 非同步把資料落地到資料庫上

return (integer) obj;

}//-1 代表搶完

return -1;

}//-2 代表已搶

return -2;

}

微信搶紅包演算法實現

只討論金額隨機的情況,需要滿足規則 所有人搶到金額之和要等於紅包總金額1.每個人至少搶到一分錢1.要保證所有人搶到金額的機率相等方案一 每個人點進來領,金額隨機,隨機的上限是當前剩餘的紅包金額。每次搶到的金額 隨機區間 0,剩餘紅包金額 分析 這樣做的缺陷是越早領越有優勢,因為每次搶到的金額 隨機區...

微信搶紅包架構設計

實時性 為什麼明明搶到紅包,點開後發現沒有?答 2014年的紅包一點開就知道金額,分兩次操作,先搶到金額,然後再轉賬。2015年的紅包的拆和搶是分離的,需要點兩次,因此會出現搶到紅包了,但點開後告知紅包已經被領完的狀況。進入到第乙個頁面不代表搶到,只表示當時紅包還有。分配 紅包裡的金額怎麼算?為什麼...

Redis 分布式快取

1 官網 3 菜鳥教程 4 redis的集群教程 5 史上最全redis高可用技術解決方案大全 一 redis的特點?redis 本質上是乙個 key value 型別的記憶體資料庫,很像 memcached,整個 資料庫統統載入在記憶體當中進行操作,定期通過非同步操作把資料庫資料 flush 到硬...