红包功能的设计实现是一个很有趣的话题,主要的功能是P个人抢总金额M的N个红包,满足先抢的N个人能抢到红包。如果这是一个leetcode的算法题目难度应该是easy,只要保证Ni抢到的金额区间在[0.01,2倍剩余金额平均值)就能ac。

将算法带入到真实的工程实现,问题就要复杂得多,如果达到微信的量级,明显要考虑的有以下几点。

拆红包

高并发读

并发写

网络流量峰值

对账

降级

故障恢复

拆红包

拆红包有预拆包和实时拆包2种策略

预拆包策略

预拆包的策略在发红包时将金额M的红包拆分成N份,将分配好的结果放入内存队列或者cache,通过incr操作在用户抢红包时分配预算好的红包slot,预算的策略可以避免对共享资源的操作,减少了锁竞争,服务本身是无状态的,设计和实现相对简单,伸缩性较好。劣势是需要额外的存储空间,如果存在大量活跃红包或者红包份数很多时会增加成本。

实时拆包

实时拆包的策略在用户抢红包时实时拆包计算金额,这样只需要保存剩余红包数量和金额,不需要额外保存每个预拆包的红包金额。使用预拆包的策略会面临并发写的问题,如果多个拆红包的请求同时执行会导致数据不一致引起超发的问题,可以使用CAS操作实现乐观锁保证并发拆包不会出现问题。

高并发读

应对高并发读的通常思路是业务层拦截过滤无效请求,使用有效的缓存。可以使用Cache层decr功能记录请求红包的用户数,当decr到0后就拦截后面的请求直接返回,对DAO层也要增加相应的缓存减少数据库的压力。

并发写

应对并发写的通常思路是串行化和乐观锁。在用户抢红包时实时拆包计算金额,每抢到一个红包,就cas更新剩余金额和红包个数,同时在DB中记录凭证,考虑到DB的写入压力,需要做分库分表,冷热分离。

网络流量峰值

大量用户同时抢红包是否会造成网络拥塞,发红包和抢红包最好在同一个IDC。

对账

考虑到拆红包凭证和入账是异步的2套系统,以及出现故障的可能,需要定时对账保证数据的一致性。

降级

在cache故障时有限流的使用DB进行服务,在资源紧张的时候关闭掉非核心流程,在实时入账请求量过大时,延迟批量入账。

红包 mysql表设计_微信红包的设计实现相关推荐

  1. 微信红包雨怎么抢_微信红包雨怎么发出? 微信红包雨发送技巧有哪些?

    微信红包雨怎么发出? 微信红包雨发送技巧有哪些?小编最近学会了一项技能,那就是发微信红包雨,一包多发,有对微信红包雨怎么发出感兴趣的伙伴吗,接下来小编与您分享下微信红包雨怎么发出吧. 微信红包雨怎么发 ...

  2. 自动回复mysql数据库设计_微信自动回复数据库设计思路【微擎】

    多商户设计 关键字触发 查找rule_keyword表 -> rule表 -> 回复资源表[news_reply 图文表.images_reply 图片表.video_reply 视频表. ...

  3. 微信红包助手php,php生成微信红包

    php生成微信红包 今天给大家带来微信红包算法的函数!! 用php来生成微信红包~ 直接看代码:/** * 微信红包生成函数 * @param $total 金额 * @param int $num  ...

  4. 餐饮管理系统 mysql数据库设计分析_终稿课程设计_餐饮管理系统数据库设计.docOK版(样例3)...

    <课程设计_餐饮管理系统数据库设计.doc>由会员分享,可免费在线阅读全文,更多与<(终稿)课程设计_餐饮管理系统数据库设计.doc(OK版)>相关文档资源请在帮帮文库(www ...

  5. 微信红包随机数字_微信红包随机算法转载

    php固定红包 + 随机红包算法 1 需求 CleverCode最近接到一个需求,需要写一个固定红包 + 随机红包算法. 1 固定红包就是每个红包金额一样,有多少个就发多少个固定红包金额就行. 2 随 ...

  6. 微信红包随机数字_微信红包的随机算法

    概况:2014年微信红包使用数据库硬抗整个流量,2015年使用cache抗流量. 微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储.采取实时计算金额的考虑:预算需要 ...

  7. python模拟微信发红包算法_微信红包的随机算法是怎样实现的?

    有人问过微信的人,大致是这样: 先上代码: public static double getRandomMoney(RedPackage _redPackage) { // remainSize 剩余 ...

  8. 余额 微信钱包图片_微信红包技巧:关闭这个功能,不上传身份证也能正常使用!...

    先点击"论人生吧",再点击"关注",这样您就可以免费收到我们的最新内容了,每天都会有更新,完全是免费订阅,请放心关注.本文转自网络,著作权属归原创者所有.如有侵 ...

  9. 1088红包数字代表什么_微信发红包的数字含义?各种红包代表着什么,你有没有发错呢?...

    微信发红包是现在常见的社交手段,不管是关系一般还是关系亲密,都可以用发红包这个方式表达自己的亲近,但是不同的关系下,可以发的红包数字也是不同的,有兴趣的小伙伴可以和喜辰乐嫁一起来了解一下. 我也是根据 ...

  10. 微信红包数字变化动态图片_微信红包数字动图下载_微信动态图片红包图下载_游戏吧...

    微信红包动图数字是一款有趣的实用工具,在这里用户能够通过软件进行简单的编辑来让自己发出的红包会就这样动起来,还等什么,感兴趣的话就快来下载体验吧! 下载使用教程 红包的使用教程在下载使用教程的下方,也 ...

最新文章

  1. 06-Windows Server 2012 R2 会话远程桌面-标准部署-RD网关(RemoteApp)
  2. OVS端口镜像(十四)
  3. OpenCV笔记(Size)
  4. 10天学安卓-第二天
  5. 一睹为快 | 施耐德电气全生命周期智能制造解决方案亮相线上工博
  6. DDD战略篇:架构设计的响应力
  7. ecshop插件_ECSHOP和SHOPEX快递单号查询中通快递插件V8.6专版
  8. 黄聪:HBuilder左侧项目管理器如何不与标签页一起自动切换
  9. mysql只update不做修改_105岁老人抽烟喝酒不运动,长寿秘诀:只做4件事,不做1件事...
  10. 设计一个服务器资源管理系统,基于虚拟化技术的服务器资源管理系统的设计与实现.pdf...
  11. 步进驱动器简单接线说明书
  12. 犯贱报(一张浓缩大学生活的..)
  13. python爬虫爬取糗百成人图片多线程版本
  14. Java8新特性总结
  15. 独立开发仿造一个智能窗帘机器人
  16. SpringBoot项目启动失败: is not eligible for getting processed by all BeanPostProcessors (for example: not)
  17. HaaS学习笔记 | 阿里云物联网平台的产品和设备创建明细教程
  18. android wifi驱动加载失败怎么办,请教WIFI连接失败问题,如何解决
  19. oracle utl file grant,oracle中设置UTL_FILE_DIR参数
  20. 透视网易云音乐重启IPO:何时才能走出亏损泥潭?

热门文章

  1. java中面向对象的例子_java面向对象九个经典例子程序
  2. 安全合规/等级保护--13--我们通过了等级保护三级认证
  3. 【OR】YALMIP 整数规划
  4. 计算机播放qq音乐没声音怎么办,电脑突然没声音了.开启QQ音乐说要检查音效卡驱动程式设定是否正常....
  5. CAD中怎么配置灭火器?
  6. 计算机基础知识五笔,教你简单快速学习五笔打字
  7. 打破信息茧房-我主动获取信息的方法 -#3
  8. 51单片机与蓝牙模块连接
  9. java小写金额转大写工具类
  10. 90后游戏开发大神毛星云跳楼自杀!8年执着国产3A梦碎