微信红包体系设计分析
2021/02/25

【/h/】说明:普通红包是指固定金额的红包,包括团体普通红包和个人普通红包,个人普通红包也是1个红包号的团体普通红包。

1需求分析


一个字:钱;两个字:娱乐

1.1为什么用户要发红包?


让别人和自己玩耍

有的人发一些1分钱的红包,看到大家哄抢就觉得很爽;有的人给自己一个0.01来和别人争速度。这些无聊的人都在找娱乐,比如黑白快,2048等。,所以无聊的人花时间就够了。

(2)成为焦点

【/h/】当你经常群发红包的时候,你会成为“群星”,让更多的人认识你,和你聊天。你有朋友遍天下的错觉,但是鸡蛋没有用。人们为了你的钱而来。所以有[我发的红包总数] [红包被抢的提醒]

(3)获得关注并销售广告

【/h/】单纯发广告不仅不会被看到,还会引起反感。但是如果你发一个大红包,群里的人会喜欢的,好心的问你项目的情况或者帮你填问卷。但是小红包的广告渐渐失去了吸引力,因为大家的兴奋门槛提高了,用户不可能通过重复事情来保持高潮,就像你在xxoo里不能一直用一个体位一样。所以服务号和关注的红包至少有2块钱,也可以分发给你的朋友。2元是多少?官方说法是一张彩票的价格,一个希望,而2元彩票早就在群众心理上建立了一个门槛,一个希望的门槛,“万一实现了呢?”这种心理。而这种希望可以传递给别人(裂变红包),何乐而不为呢?

(4)纯粹是福

有时我们的产品经理想得太多了。人们可能只是以微信红包的新奇方式送出传统的红包。以前只有结婚的人才可以发红包,现在可以给全民,我也可以给朋友带个祝福。但是包裹多少钱?这个很纠结,太少,不体面;给“上流社会”的人发红包,门槛高,负担不起太多。这就是[随机红包]

1.2用户为什么抢红包?


(1)有趣刺激的

这个理由还是留给那些无聊的人,没有解释,用“为什么要给红包?”第一点类似。那次[的好运]刺激了人们玩红包接龙(不是某宝的红包接龙...)

(2)贪婪——原始人类的欲望

在法律和道德的重重压制下,人性被深深地掩盖了。当有这么合法光明正大的“抢钱”时,哪怕是0.01也足以让人压制贪婪,创造微信红包的繁荣。虽然官方说,挥舞红包的目的是让老一辈人了解我们的世界,了解我们的生活,让我们回家过年的时候可以一起挥舞红包。但是,从朋友圈,从新闻,从群里每个人的反应,我都没有觉得红包让家人聚在一起。不知道是不是公关说辞。这里不做任何评论,但是人性的刺激是绝对彻底的。就像所有的自然科学最终都会回归哲学问题一样,所有的产品最终都会回归对人性的思考。(废话太多~~~)

炫耀

证明你单身20年,哦!不,应该是为了证明你的手很快(不都是一个意思,废话真多!)有的人无聊到自己发,自己抢,借此炫耀自己的4G网络,光纤,还有……独角兽臂。

(4)减少损失

【/h/】很多人发了幸运红包,觉得钱包流得厉害,就又抢了一个,希望能抢更大的金额,相当于少发红包。

1.3为什么要晒红包?


(1)炫耀财富心理——我发的红包统计页面

(2)比较心理学-红包结果页

【/h/】这里就不解释了,就想想你为什么喜欢在朋友圈发东西。

2入口


1

【/h/】门户网站主要分为聊天窗口和微信钱包两类。

2

2.1钱包


【/h/】钱包加红包入口的原因是用户第一次使用的时候,通常会先收到别人的红包,想取钱,那么哪里可以拿到呢?必须是钱包,需要整合所有与钱相关的概念,才能给用户留下深刻的印象。类似于OmniFocis的透视功能(不知道,算了...),需要将相关内容聚合到一个门户中。所以钱包聚合了与金钱相关的内容,比如信用卡还款、手机充值、理财等。用户第一次进来收钱,自然看到微信红包,进一步引导用户绑定信用卡,发红包。另外,如果用户第一次没有收到别人的红包,而是听说了红包的作用或者看到了别人的红包,他首先会认为钱相关的东西应该在红包里。

3

2.2聊天窗口


在这个聊天窗口加红包入口更简单粗暴。用户在过年或者普通使用时经常点击“+”发送图片,很容易看到红包入口。而且微信在过年的时候还特意用红色突出了红包按钮,让用户更容易发现,提高了入口的转化率。这里也有逻辑。单聊和群聊进入的红包页面不一样,如下图:

4

默认情况下,团红包是幸运团红包,而不是固定红包。为什么要酱紫色?我们来看看争取红包的好处:

1。量是随机的,大小量都能让用户大吃一惊;

2。可以看看其他用户抢了多少,造成攀比心理(这次不高兴,下次一定要抢大的);

3。产生很多新奇的玩法,比如最好的幸运3倍量;

4。因为我们可以看到谁抢了红包,一直在群里拿第一,不参与游戏的人基本都是用外挂软件,群里成员自发要求群主把这个人踢开。这种众包“反外挂”比微信本身用技术手段解决更划算,更有效。

【/h/】相对于普通红包,红包的缺点是需要大量的计算资源来计算红包的随机量。但对于腾讯强大的架构师和财务资源来说,这些计算资源算不了什么,只是消耗在拉起微信群的活动,同时增加在线用户数量上,让财务报表看起来更划算。

2.3摇一摇


).加速度传感器也很互动,但总是藏在手机里,使用率不如摄像头和麦克风。抖红包很好地利用了大家手机里的“雪藏”硬件。在“红包一定要发”和“有抖功能的代码已经有了”两个前提下,增加抖红包的功能并不会增加多少开发量和成本,因为既然发了红包,那么不管是以什么形式发,后台负载均衡和高并发分发都是必须要做的。抖的代码在pao时代已经完善了,访问红包的逻辑基本没有必要,所以机会成本很低那为什么还要发红包呢?因为去年头不好,示范效应导致支付宝入股。微信可以不发吗?

3接口


3.1红包页


如果银行卡没有绑定,跳转到零钱支付页面,点击按钮[零钱支付]无需输入密码。在这个过程中,如果更改不充分,跳转到输入银行卡卡号的页面。点击【[下一步】后,您需要输入您的姓名、银行预留的手机号码和短信验证码,然后您就可以用银行卡支付了。

5

这里要提到的是非常人性化的设计。当你点击“更改普通红包”,从幸运红包切换到普通红包时,输入内容不会丢失,红包数量不变。此时单笔金额EditView (Android UI控件)中的值会从总金额/红包数中获取并自动填充;当你点击“换一组幸运红包”,在从普通红包切换到一组幸运红包的过程中,输入的内容不会丢失,红包数量保持不变。此时,总量编辑视图中的值将由单个金额*红包数量计算并自动填充,这非常贴心,无需用户重新输入。这也是微信“最大化用户体验”的地方之一。

3.2红包抢页


聊天窗口将显示红包风格的聊天消息。点击红包后,会打开一个页面。

6

3.3红包“拆迁”页


【/h/】点击【反汇编】按钮后,黄色的东西会转(切换几帧图片形成的动画在IOS上比Android运行更流畅),转完那个东西页面会跳转到【红包结果页面】。值得一提的是,在最新版本的Android中,红包的Html版本被Android原生红包界面所取代。你为什么这么做?

【/h/】首先,微信通常会牺牲客户端资源(CPU、内存、存储卡容量)来换取服务器的稳定性,减少资源投入。页面资源放在本地,这样web前端服务器的容量可以减少投资,同时也可以减少客户端对资源服务器的访问。同样,微信的聊天记录默认不存储在服务器上,而是把各种图片、语音、视频塞进你手机的内存里。微信表情在6.0版之前没有保存到服务器。

【/h/】二、以往基于web的红包页面经常会有用户投诉,比如“妈妈的页面还在加载,红包没了”,“红包来了却连不上互联网是一种什么体验”,而原生页面因为放在本地,不需要远程加载,只需要传输一个简单的红包ID,少量信息,比如发件人, 可以通知客户端显示红包页面,可以减少联网时间,降低网络条件下抢红包体验的流畅度,让用户可以.下图是几个红包“拆迁”页面(大家一起玩,找不同的吧,嘻嘻):

7

这四页什么时候出现?5.2将详细介绍。

3.4红包结果页


红包结果页面会显示抢过红包的人的名单,其中金额最大的就是运气最好的。当两个或两个以上的数量相同时,最早的一个是最好的运气。页面还会显示发红包的人的昵称,你自己收到的金额(没收到就不显示了),找零转发红包入口,我的红包记录入口。红包结果页面也有很多种,详见本文5.3节。

8

3.5摇红包


9

【/h/】晃动红包和企业红包的随机方法和团体幸运红包类似,这里就不多说了,因为我还没接触过企业红包的发放流程。

【/h/】为什么要有剩余的红包数?

【/h/】引用鹏飞在产品经理大会广州站的话,大家都是产品经理,“给用户一个期望,现在有没有红包,还有多少,这个数字一定要准确,不能忽悠用户。有朋友跟我说最后几秒就摇了。所以,让用户为希望而摇,为希望而断手,是什么!”。是的,这个数字是“准确的”,但不是实时的。因为过于频繁刷新的数量减少了一点,不仅用户感觉不到,而且服务器继续访问数据库中剩余的红包压力也非常大。所以推测微信采用了这样的策略:每次红包数减少1个单位(比如50W),这个值自动写入缓存服务器。用户摇红包时,直接访问缓存,每次摇都不访问剩余数,只要求摇N次(比如摇5次)后的剩余红包数。这样,

没看到上面最后一页吗?

微信官方表示,当服务器压力过大时,应提醒用户在此页面休息。在这里,我提出另一个策略。可能微信也采用了这种策略:当用户晃红包请求,服务器压力过大,网络阻塞或者队列已满等。,它会直接通知客户端“你没抢到”,也就是直接返回到晃红包的页面进行下一次的晃动作,这样“休息”页面就永远不会显示了。

4背景


4.1数据库


以下关系数据库设计的字段是基于在少量请求下模拟红包系统的可行方案,没有考虑高并发、子数据库和子表、缓存等情况。对于这部分内容,请查看本文4.4节中一些大神的回答,以便理解。

(1)用户信息数据表user_info

userID,红包ID,问候语,红包类型,红包号,红包金额,超时

(2)用户钱包数据表user_wallet

用户标识、货币、银行卡标识等字段

(3)发送红包数据表red_send

红包ID,senderID,红包数量,红包金额,祝福语,好运,发时间

(4)接收红色数据包数据表red _接收

红包ID、收件人、收件时间、收件金额

4.2随机算法


很多人说红包序列是手机发出去的时候预先生成的随机序列。事实上,这将产生大量的数据库读写操作。内存读取速度可达17G/s,写入速度可达18G/s,以DDR3-2400为例(参考:http://m . it 168 . com/article _ 1410707 _ P5 . html)。而硬盘数据库的读写速度最多可以达到133MB/s。可以看出,从硬盘读写大量数据不仅容易损坏硬盘,而且不能满足高并发读写要求。所以提前生成随机序列写入数据库,然后在用户抓取时读出红包量,将用户信息写入数据库是不科学的。因此,随机序列在内存中实时计算,并异步写入硬盘数据库进行存储。基于记忆的随机序列是伪随机序列,不是真的随机,而是根据种子通过一定算法计算出来的值。只要种子不变,每次计算的值的顺序都是一致的。也就是说,当红包的指纹(ID或ID+时间戳或其他算法生成的)一定时,计算出来的序列是一致的,这样就不存储在数据库中,而是实时计算,第一次取序列的第一个值,第二次取序列的第二个值,以此类推。(详细说明请参考http://www . open-open . com/lib/view/open 1430473257443 . html)。具体步骤如下(代码以python为例,无法知道后台写的是什么语音):

拿红包ID当种子

> > > > red _ ID = 1775509988475009

> > > >随机. seed(red_ID)

组幸运红包最小值为0.01,摇红包最小值为2.00

> > > >最小值= 1.00

> > > > if(红包是幸运红包):

min = 0.01

else(红包就是抖红包):

min = 2.00

一组幸运红包的最大值是总量和剩余红包数的商的两倍(可以发组内红包回归,记得问我拿红包,哈哈)。

> > > > > max =(remain _ money/remain _ num)* 2

【/h/】而晃动红包给出的官方计算公式是剩余金额/剩余红包数*n

n主观猜测也等于2,然后在这个公司的基础上人为控制概率。

方案一:

比如2元-5元的概率是85%;5元-20元概率为10%,20元-50元概率为4.99%,618元概率为0.01%。(概率仅供参考,因为样本量太大,官方没有提供数据。这里只是其中一个可行的方案,下面的代码只是提供思路,与实际可以运行的代码略有不同。)

>>>a = random.uniform(0,1)

>>>b,_max,_min = 0

> > > >如果a < 0.85:

_min = 2.00

_max = 5.00

> > > elif a < 0.95 & a > = 0.85:

_min = 5.00

_max = 20.00

> > > elif a < 0.9999 & a > = 0.95:

_min = 20.00

_max = 50.00

> > > > elif a > 0.9999:

_min = 618.00

_max = 618.00

> > > > random . uniform(min,max)

方案2:

_min = 2.00

_max =剩余金额/剩余红包数*n

【/h/】人为放出一个618元的鸡蛋红包,通过上述方法将概率设为0.0001%【/h/】

【/h/】4.3发红包的时候发生了什么?


【/h/】由于个人水平限制,这部分无法给出深入的介绍。在这里,为了文章的完整性,使用胖文章作为解释(胖博客是www.phppan.com)

(1)红包后台操作:

在数据库中添加一条红包记录,存储在CKV,并设置到期时间;

向Cache添加一条记录(可能是腾讯内部kv数据库,基于内存,有登陆,有内核网络处理模块,以内核模块的形式提供服务),存储抢红包人数N

(2)抢红包后台操作:

这里的原子减法运算不是真正意义上的原子减法运算,而是其Cache层提供的CAS。通过版本号对比,有一定程度的冲突,冲突的用户会让他们去进行下一个反汇编操作,这也解释了为什么有些用户抢到了反汇编,发现已经收藏完了。

【/h/】拆除时会实时计算金额,是剩余平均值1-2倍之间的随机数,一个总金额M元的红包,最大红包M * 2 /N(且不会超过M)。拆红包时,剩余金额和数量会更新。财付通准备账户每秒20万交易,但每秒只有8万。

4.4问答(这部分在线排序,不知道怎么分类好,就放在一起了)


(1)既然抢劫时有原子还原,就不应该有不抢劫的情况?

这里的原子减法不是真正意义上的原子运算,而是Cache层提供的CAS,通过比较版本号不断尝试。

(2)如果缓存和数据库挂起怎么办?

主/备用+对账

(3)有没有红包不见了,但是余额还存在?

不,该程序最终将有一个全取操作和一个异步协调保证。

【/h/】④为什么要分、抢、拆?

【/h/】总体思路是设置多层过滤器,层层筛选,层层降低流量和压力。这个设计本来是因为抢操作是业务层,拆操作是会计操作。一次操作太重,中断率高。从接口层面来说,第一个接口是纯Cache操作,造压能力强。一个简单的查询缓存就屏蔽了大部分用户,做了第一个过滤,所以大部分人都会看到被抢的提示。

【/h/】⑤抢到红包后,送出红包或提现。这里有什么策略吗?

大价值优先进入策略

⑥你有没有从数据中证明每个红包的概率是否相等?

要么是绝对平等,要么是简单的拍脑袋算法。官员们已经在产品经理会议上解释说,这是一个拍脑袋的算法。

⑦红包发件人的钱会被冻结吗?

是实时直接扣款,不是冻结。

⑧实时计算金额的考虑因素是什么?

更高的实时效率使得预算效率低下。预算也会占用额外的存储空间。因为红包只占一条记录,有效期只有几天,不需要空那么多。即使压力很高,水平膨胀机也是。详见本文4.2中的描述。

【/h/】⑨实时:为什么打开红包就抢?

【/h/】答:2014年红包金额一开就知道了。分为两个操作。先抢到金额,再转账。

【/h/】进入第一页不代表抢,只代表当时有红包。详见第五部分金凯的解释。

⑩红包设计

A:微信从财付通拉取金额数据,生成数字/红包类型/金额,放入redis集群。app端将对红包ID的请求放入请求队列,发现红包数量超过则直接返回。如果按照红包的逻辑处理成功获得令牌请求,财付通会进行一致的调用,像比特币一样保存双方的交易记录,并将交易提交给第三方服务进行审核。如果交易过程中有不一致的地方,会强制退回。

【/h/】并发处理:被抢红包怎么算?

A:缓存会抵制无效请求,过滤掉无效请求,实际进入后台的量并不大。Cache记录红包数量,原子操作减少数量,达到0表示被抢。财付通准备账户每秒20万交易,实际上是每秒不到8万。

如何保持每秒8w的写入速度?

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

【/h/】查询红包发放压力大吗?

A:抢红包和红包的人数都在一个缓存记录里,查询压力不大。

一个红包和一个队列?

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

每次收到红包都更新数据?

A:每次抢到红包,更新剩余金额和红包数量,进行cas。

【/h/】如何将红包入库?

数据库将累计已收款的数量和金额,并插入收款记录。记账是后台异步操作。

【/h/】开户有错怎么办?比如红包数没了,余额还在?

答:最后会有一个全取操作。还有一个和解要保证。

5互动


5.1前后端之间的相互作用正时


(1)绑定银行卡

10

(2)发送和接收幸运红包

11

①启动红包操作

(2)银行扣款逻辑。如果不成功,返回,如果成功,继续下一步

(3)请求将红包写入数据库中的一个集合,获取红包ID并返回给客户端

(4)长连接通知客户端成功

⑤其他用户收到红包消息时,点击打开打开。因为用户的操作速度远低于计算机的处理速度,所以开和开的分离相当于设置了一个缓冲区。另外,打开后不直接获取金额,而是先读取是否收到红包的缓存,如果没有收到,则显示【拆除】按钮。单击[反汇编],然后再次访问缓存,查看是否收到红包。如果没有,请求服务器内存计算随机量返回给客户端,然后异步写入数据库。

⑥红包结果会写入LIstView(Android的UI控件名,ios有类似的控件),用户马上就能看到

⑦当用户再次打开红包结果页面时,将从数据库中读取最新的结果列表并进行更新。

(3)收发普通红包


①启动红包操作

(2)银行扣款逻辑。如果不成功,返回,如果成功,继续下一步

(3)选择发送对象(如果聊天窗口跳过此步骤)

④计算红包的平均值(总量/数量),将红包的数量和平均值写入数据库,并将红包ID返回给客户端

⑤其他用户点击红包,打开,访问,确定红包数是否大于0。如果为真,则减1;如果为假,将通知客户端显示[完成]样式。

5.2界面交互


5.2.1基本流程


13

5.2.2红包开页显示逻辑


【/h/】对团体幸运红包、团体普通红包、普通红包(实际上是红包数为1的团体普通红包)以及是否领取、是否领取进行交叉分析后,总结出以下结论:【/h/】

mmexport 1442151693886

5.2.3红包结果页面显示逻辑



描述:

1代表该项的出现

单词“代表下图所示区域的文本内容:

16

“button”代表蓝色文字链接,如下图:

17

金额是指您获得的金额

18

被抓的人指的是一份名单:

19

绿色网格表示没有这样的逻辑,可能是因为页面没有出现或者其他原因。

挖掘上表中的数据,我们可以找到以下规则集:

(1)收到红包时,会依次或随机显示“红包存小找”、“消费存小找”、“转账存小找”、“提现存小找”其中一个按钮。并显示你获得的红包金额。

(2)当你发的红包没有收到时,会显示“继续发这个红包”按钮;

(3)收到别人的红包时,会显示“查看我的红包记录”按钮;

【/h/】( 4)收到一组幸运红包,如果红包是自己发的,会显示“N个红包共计N元,N秒被抢”字样;如果是某人发的红包,会显示“N个红包,N秒被抢”字样;收到(组)普通红包时,会显示“N个红包共计N元”字样;

【/h/】( 5)如果没有收到红包(数字大于1),你自己的红包上会显示“x/y已收到,共x/y元”字样;别人发的红包“收x/y块”字样;

【/h/】(6)未收到红包(数量等于1)时,会显示“红包金额为N元,等待对方收到”字样;

【/h/】(7)抢红包的人名单会针对团体幸运红包和自己发的普通红包进行展示;

(8)“最佳幸运”标志只有在收到幸运红包后才会显示;

从(4)-(6)中的规则可以看出,为什么微信是一个优秀的产品,而不仅仅是一个及格的产品。你自己的红包会显示总金额,你也知道你发了多少钱,但你不希望别人看到总金额(虽然可以按单算,但大多数人不会算对方红包的总金额),以免发红包的用户要承担“面子问题”挫伤用户发红包的积极性。这样可以营造一个大家都可以发红包的氛围,间接增加红包的数量,增加整个平台的活跃度。

5.2.4摇红包


【/h/】这部分,因为写文章的时候抖红包的活动已经下线了,只能从网上找截图,简单说明一下过程。下图:


【/h/】本文仅纪念大学四年来为加入微信团队所做的努力。

我们的优势
上门服务

支持POS机刷卡

最快1小时上门交接资料

专业服务

具有10年以上财务工作经验

严格按照新三板财务标准做账

价格透明

拒绝隐形消费

价格全称透明合理

支付随心

支付宝扫码支付、POS机刷卡

微信扫码支付、现金收款