`
yefei
  • 浏览: 124536 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

微信红包金额分配的算法

 
阅读更多

虽然春节已经过去一段时间,但不少微信群里面依旧乐此不疲的在玩发红包活动,用户自发的将最初的一个春节拜年的场景功能慢慢演化成一个长尾功能。

用户在微信中抢红包时分成抢包和拆包两个操作。抢包决定红包是否还有剩余金额,但如果行动不够迅速,在拆包阶段可能红包已经被其他用户抢走的情况。

红包的金额是在什么时候算? 据某架构群腾讯财付通专家反馈,红包的金额是拆的时候实时计算,而不是预先分配,实时计算基于内存,不需要额外存储空间,并且实时计算效率也很高。每次拆红包时,系统取0.01到剩余平均值*2之间作为红包的金额。

为了保证每次操作的原子性,拆包过程中使用了CAS,确保每次只有一个并发用户拆包成功。拆包CAS失败的用户可以由系统自动进行重试。但也有可能在重试过程中被别的用户抢得先机而空手而归,因此严格意义拆包的调用也未能保证用户先到先得。

基于上面的原因,当时在群中提到这种算法有些复杂,微信红包为了减少存储,每次进行了一个理解稍复杂的实时计算。对比大部分架构师想到的预分配金额的做法,预先分配金额需要将金额保存在一个内存队列中,如果红包的份额较多,则需要较大的存储空间。而微信红包仅保存 count:balance 这样2个数字。count指还剩几个人可以抢,balance只还剩下的金额。

但是预分配金额也并不是非得需要额外存储。比如利用随机算法,在种子相同的情况下,随机数实际上返回的随机序列也是固定的。如以下Python代码,对于给定的seed 1024,每次执行返回的结果都是相同的。
>>> import random
>>> random.seed(1024)
>>> random.randint(1,100)
80
>>> random.randint(1,100)
49
>>> random.randint(1,100)
39
>>> random.randint(1,100)
83
>>> random.randint(1,100)
88

因此预分配金额也只需要额外存储一个种子,或利用一些红包id做加密变换零存储。而在发放红包时候,无需进行CAS操作,而只需要做一个DECR操作。当DECR<0时,表示红包被拆包抢完。由于DECR是原子操作,无需加锁,用简单的方法达到了先拆包先得,原理上不存在并发冲突的情况。

每个人分配的金额是:total * random(n) / random_total,不需要重复计算。
random(1)..random(n)不需要保存,因为对于给定的seed,random(1)到random(n)返回是固定的。

Reference:
1、https://www.zybuluo.com/yulin718/note/93148
2、网友基于聊天记录整理的微信红包架构图
wechat architecture

分享到:
评论

相关推荐

    微信红包随机生成算法php版

    1. 微信红包算法介绍:微信红包算法是一种随机分配红包金额的方式,能够在保证每个人至少获得一定金额的同时,让红包金额具有随机性和趣味性。它通常有两种类型:普通红包和拼手气红包。普通红包平均分配,拼手气...

    Java 实现微信红包分配算法内含源码以及说明书可以自己运行复现.zip

    微信红包分配算法是微信支付中的一个重要功能,它确保了红包金额在随机分配时的公平性与趣味性。以下将详细介绍该算法的实现原理及相关的编程知识。 1. **红包分配算法概述** 微信红包分配算法的核心目标是在保证...

    Python版微信红包分配算法

    ### Python版微信红包分配算法详解 #### 一、引言 微信红包作为一种流行的社交互动方式,在节日或特殊场合被广泛使用。为了使红包分配更加有趣和公平,开发了一种基于数学算法的红包分配方法。本篇文章将详细介绍...

    .net版微信红包开发Demo

    红包金额的分配通常遵循等概率原则,确保每个红包金额的随机性。.NET提供了丰富的数学库,可以用于生成随机数,结合业务规则实现红包金额的计算。 此外,微信红包的API调用过程中,还需要处理签名和验签的问题。...

    微信红包拆分

    微信红包的拆分算法主要是基于随机数生成和概率分配的概念。当用户发送一个红包时,系统会根据输入的总金额和红包个数,通过算法来决定每个红包的具体金额。算法的目标是在保证总金额不变的前提下,让每个红包的...

    Java代码实现微信红包功能

    首先,我们要理解微信红包的核心功能,包括红包发放、红包领取、红包金额随机分配等。这些功能都需要通过精心设计的类结构来实现。我们可以创建一个`RedPacket`类作为红包的基础模型,它包含红包总额、红包个数等...

    微信红包架构设计

    微信红包架构设计的核心技术是随机算法,用于生成红包的金额。下面将详细介绍微信红包架构设计的技术实现和架构设计。 随机算法 微信红包架构设计使用的随机算法是基于概率论的,旨在生成红包的金额。该算法的核心...

    作业内容:微信红包分配机制的模拟

    2. **金额分配策略**:微信红包遵循“二项分布”原则,即最后一个红包可能比其他红包大很多,以保证至少有一个“幸运儿”。这种机制的关键在于,前n-1个红包的总金额由随机数决定,最后一个红包的金额则为总金额减去...

    模仿微信发红包代码

    微信红包功能的实现涉及到随机算法、并发处理以及数据库操作等多个技术领域。下面,我们将深入探讨这个主题,以"模仿微信发红包代码"为背景,解析其中涉及的关键知识点。 首先,我们需要理解微信红包的基本逻辑。...

    php仿微信红包分配算法的实现方法

    在for循环中,使用rand()函数生成一个随机金额($temp),这个金额需要在总金额的范围之内,并且乘以100再除以100是为了得到两位小数的金额值,模拟微信红包金额的精度。为了确保生成的随机金额不会超过剩余金额,...

    php生成微信红包类.zip

    2. **红包金额分配算法**:类内部可能存在一个方法,用于生成随机红包金额。这通常涉及到数学随机函数和公平的红包分配策略。例如,可以采用等概率均分、随机分配等算法。 3. **接口封装**:为了与微信服务器交互,...

    微信红包源码微信CPA微信抽奖活动推广源码

    7. **红包算法**:微信红包的发放有多种模式,如普通红包(每个红包金额随机)、拼手气红包(总金额随机分配)等。算法的设计直接影响到红包的分配公平性和用户的参与体验。 8. **抽奖逻辑**:抽奖活动通常包含概率...

    微信发红包开发接口ThinkPHP3.1版本

    在调用微信红包接口时,需要设置一系列参数,如红包金额、红包个数、祝福语、商户订单号等。这些参数必须符合微信接口的规范,并且在实际使用中要根据业务需求灵活调整。 6. **签名机制**: 微信支付接口调用通常...

    微信红包的架构设计简介

    微信红包采用了一种基于随机算法的实时计算机制,该机制能够在短时间内快速计算出每个红包的具体金额,并将其分发给参与的用户。这种机制可以确保红包的随机性和公平性,同时还能有效减少用户的等待时间。 例如,在...

    Python模拟微信红包分配算法的技术实现与探讨

    主要讨论了模拟红包抢夺程序的设计思想,具体包括输入参数(如总金额、总人数)、核心逻辑(例如每次分配时随机化并保持总金额恒定以及最后一个参与者领取剩余所有金额)、以“分”作为货币的基本单位来进行精准的...

    递归文件路径+微信红包随机

    本项目结合了两个核心概念:递归文件路径遍历和微信红包随机分配算法,这些都是Java开发者需要掌握的关键技能。 首先,让我们深入理解递归文件路径遍历。在Java中,遍历电脑上特定路径下的所有文件是常见的需求,...

    微信红包 JAVA

    1. **随机数生成**:红包金额的随机分配是通过随机数生成算法来实现的。Java提供了`java.util.Random`类,用于生成各种类型的随机数。在这个示例中,我们需要生成一个随机数来决定每个红包的金额。 2. **数据结构与...

    php生成微信红包类库

    1. **设置红包参数**:这可能包括红包金额、红包个数、祝福语、活动名称等。对于普通红包,可以设置总金额和红包个数;对于拼手气红包,可以设置总金额和红包个数的最大值和最小值。 2. **签名生成**:微信API调用...

    Android-java实现仿照微信抢红包算法

    2. **随机分配**:使用Java的`Random`类生成随机数,分配红包金额。可以使用线性同余法或Mersenne Twister等高质量随机数生成器来提高随机性。 3. **并发控制**:在Android环境中,多个用户可能同时尝试抢红包,...

Global site tag (gtag.js) - Google Analytics