前二天 了一篇, Redis高级项目实战 ( 点我直达 ), SpringBoot整合Redis附源码 ( 点我直达 ), 今天 我们来 一下 Redis秒杀 系统的设计。当然啦, Redis基础 知识 还不过关的 先去加强下自身内功 ,然后在回来看这篇, Redis基础知识 (点我直达 )。为啥写这个微信抢红包项目呢,公司0202年08月22日,公司周年庆,抢了100多红包🧧,O(∩_∩)O哈哈~

微信抢红包 实现原理

业务流程分析

在DB Redis 分别 新增一条记录

抢红包( 并发 )

请求Redis 红包剩余个数 大于0 才可以 等会0 时,提示用户, 红包已抢完

拆红包( 并发 )

Redis 中数据类型的 String特性 原子递减 DECR key 减少指定值 DECRBY key decrement

  • 请求Redis ,当 剩余红包个数大于0 红包个数 原子 递减 ,随机 获取红包
  • 计算金额 ,当最后一个红包时,最后一个红包金额=总金额-总已抢红包金额
  • 更新数据库
  • 查看红包记录

    查询DB 即可

    数据库表设计

    红包流水表

    CREATE TABLE `red_packet_info` (
     `id` int(11) NOT NULL AUTO_INCREMENT, 
     `red_packet_id` bigint(11) NOT NULL DEFAULT 0 COMMENT '红包id,采⽤
    timestamp+5位随机数', 
     `total_amount` int(11) NOT NULL DEFAULT 0 COMMENT '红包总⾦额,单位分',
     `total_packet` int(11) NOT NULL DEFAULT 0 COMMENT '红包总个数',
     `remaining_amount` int(11) NOT NULL DEFAULT 0 COMMENT '剩余红包⾦额,单位
    分',
     `remaining_packet` int(11) NOT NULL DEFAULT 0 COMMENT '剩余红包个数',
     `uid` int(20) NOT NULL DEFAULT 0 COMMENT '新建红包⽤户的⽤户标识',
     `create_time` timestamp COMMENT '创建时间',
     `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE
    CURRENT_TIMESTAMP COMMENT '更新时间',
     PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='红包信息
    表,新建⼀个红包插⼊⼀条记录';

    红包记录表

    CREATE TABLE `red_packet_record` (
     `id` int(11) NOT NULL AUTO_INCREMENT, 
     `amount` int(11) NOT NULL DEFAULT '0' COMMENT '抢到红包的⾦额',
     `nick_name` varchar(32) NOT NULL DEFAULT '0' COMMENT '抢到红包的⽤户的⽤户
    名',
     `img_url` varchar(255) NOT NULL DEFAULT '0' COMMENT '抢到红包的⽤户的头像',
     `uid` int(20) NOT NULL DEFAULT '0' COMMENT '抢到红包⽤户的⽤户标识',
     `red_packet_id` bigint(11) NOT NULL DEFAULT '0' COMMENT '红包id,采⽤
    timestamp+5位随机数', 
     `create_time` timestamp COMMENT '创建时间',
     `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE
    CURRENT_TIMESTAMP COMMENT '更新时间',
     PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='抢红包记
    录表,抢⼀个红包插⼊⼀条记录';
  • 发100元,共10个红包,那么平均值是10元一个,那么发出来的红包金额在0.01~20元之间波动
  • 当前面4个红包总共被领了30元时,剩下70元,总共6个红包,那么这6个红包的金额在0.01~23.3元之间波动
  • 抢红包接口开发

    模拟高并发抢红包( Jmeter压测工具 )

    因为我发了 10个红包 金额是20000 ,使用压测工具, 模拟50个请求 只允许前10个请求能抢到红包 并且金额等于20000

    OkHttp是一个优秀的网络请求框架

    一、OkHttp介绍   HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽。OkHttp是一个优秀的网络请求框架,它有以下默认特性: 支持HTTP/2,允许所有同一个主机地址的...

    this到底指向啥?看完这篇就知道了!

    JS中的this是一个老生常谈的问题了,因为它并不是一个确定的值,在不同情况下有不同的指向,所以也经常使人困惑。本篇文章会谈谈我自己对this的理解。 this到底是啥 其实this就是一个指针,它指示的就是当前的一个...

    手写 Promise 20 行最简实现(面试必备)

    前言 在面试的时候,经常会有面试官让你实现一个 Promise,如果参照 A+规范来实现的话,可能面到天黑都结束不了。 说到 Promise,我们首先想到的最核心的功能就是异步链式调用,本篇文章就带你用 20 行代码实现一...

    后端程序员不得不会的 Nginx 转发匹配规则

    本文收录在 GitHub 地址 https://github.com/chengxy-nds/Springboot-Notebook 一、正则表达式匹配 ~ 为区分大小写匹配 ~* 为不区分大小写匹配 !~ 和 !~* 分别为区分大小写不匹配及不区分大小写不匹配 二、文件及...

    这篇 MySQL 索引和 B+Tree 讲的太通俗易懂!

    点击上方蓝色“java大数据修炼之道”, 选择“设为星标” 每晚九点: 技术干货 👉 必定奉上 来源:https://blog.csdn.net/b_x_p/article/details/86434387 作者:he_321 正确的创建合适的索引,是提升数据库查询性...

    12张图带你彻底理解分布式事务产生的场景和解决方案!!

    写在前面 写这篇文章的背景是有个跟我关系不错的小伙伴去某大型互联网公司面试,面试官问了他关于分布式事务的问题,不巧的是他确实对分布式事务掌握的不是很深入,面试的结果挺遗憾的。不过,这位小伙伴还是挺乐...

    Stateful 组件的生命周期​

    老孟导读:关于生命周期的文章共有2篇,第一篇是介绍 Flutter 中Stateful 组件的生命周期。博客地址:http://laomengit.com/blog/20201227/Stateful%E7%BB%84%E4%BB%B6%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.htm......

    最全汇总之微前端知识和实战(EMP技术方案)

    我们团队在早早聊的B站直播间分享了EMP微前端---团队半年以来的技术果实。分享的内容全在这里,会讲述微前端的由来,解决的问题,以及EMP微前端方案的不同之处,更有四个实战项目的总结,欢迎大家一起探讨EMP微前...

    一文带你快速上手Rollup

    前言 项目中一直用的都是webpack,前一段需要开发几个类库供其他平台使用,本来打算继续用webpack的,但感觉webpack用来开发js库,不仅繁琐而且打包后的文件体积也比较大。正好之前看vue源码,知道vue也是通过rol...

    深入浅出 ZooKeeper

    ZooKeeper 是一个分布式协调服务 ,由 Apache 进行维护。 ZooKeeper 可以视为一个高可用的文件系统。 ZooKeeper 可以用于发布/订阅、负载均衡、命令服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布...