开篇:

之前也看过一些相关的书籍,最近又在学习redis的相关知识,不过这次偏实战一些,花了几天时间做了一个抢红包的功能,把设计的思路以及最终的源码贴出来给大家分享一下,本人自己自测了一下,能非常清楚的支持10000以上的QPS,估计还能支持更高,(特别说明,这里要抛去数据库,因为数据库在插入的时候存在明显瓶颈,本人机器4核8G),压测是利用Jmeter读取脚本的形式进行压测,此次测试,源码,数据库,jmeter压测工具都在本人机器上。

功能设计:

新建红包:并发较小,建议先让数据进入缓存(redis),然后再进行持久化,注意考虑到两个动作的保证同一个事务,redis放入两个key,分别为:{key1:红包总金额},{key2,红包总数}。

抢红包:并发较大,主要操作的是redis,为了最大的发挥效能,本次注意是利用lua脚本进行操作,且能保证原子性。

拆红包:为本次功能的重点,拆红包,涉及到各种校验例如改用户是否已经抢过红包了,红包金额还剩下多少,红包总数还剩下多少,红包金额和红包总数是否能匹配上,特别是在大并发的情况下,如果保证数据的一致性。

表结构设计:

DROP TABLE IF EXISTS `red_packet_info`;
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 NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=71 DEFAULT CHARSET=utf8mb4 COMMENT='红包信息表,新建一个红包插\r\n入一条记录';

-- ----------------------------
-- Table structure for red_packet_record
-- ----------------------------
DROP TABLE IF EXISTS `red_packet_record`;
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位随机\r\n数',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16448 DEFAULT CHARSET=utf8mb4 COMMENT='抢红包记录表,抢一个红包插\r\n入一条记录';

接口界面

Redis应用项目---抢红包功能(一)相关推荐

  1. Redis应用项目---抢红包功能(四)

    拆红包的核心功能: 拆红包功能是整个功能的核心,红包计算逻辑:剩余金额/剩余红包个数 * 2,这里有个一个点,如果保证剩余金额和剩余红包个数同时等于0,特别是在并发的情况下. 核心代码: public ...

  2. Redis应用项目---抢红包功能(三)

    抢红包逻辑及核心代码: 先判断用户有没有抢过红包,如果没有则进行第二步 判断红包个数,如果>0 则直接返回数量 判断红包金额,如果>0则直接返回金额 核心代码 说明:这里特别需要说明的,r ...

  3. Redis应用项目---抢红包功能(二)

    发红包逻辑及核心代码: 需要保证红包id的唯一性,此次用的是雪花算法,完全能够保证唯一性,关于分布式事务的唯一性ID,可以给大家推进一篇我写的博客,里面有多种唯一性ID的介绍:https://blog ...

  4. 基于Redis实现微信抢红包功能

    使用Redis和Lua的原子性实现抢红包功能 安装Lua(可选) 编写lua脚本 lua脚本学习可以参考 [https://www.runoob.com/lua/lua-basic-syntax.ht ...

  5. 基于redis实现抢红包功能(包括余额退回处理)

    本文将讲述使用redis实现抢红包功能,采用发红包时将红包拆好存储,解决红包金额平衡问题(两种算法).解决超发现象.将数据通过消息队列传递给另一个服务写入数据库,现阶段不考虑redis宕机的情况. - ...

  6. Redis 牛X!竟然能实现抢红包功能!

    原文链接:https://www.cnblogs.com/chenyanbin/p/13587508.html 为啥写这个微信抢红包项目呢,公司 0202 年 08 月 22 日,公司周年庆,抢了10 ...

  7. Redis在项目中的地位及使用场景剖析

    Redis在项目中的地位及使用场景剖析 一. redis 特点 所有数据存储在内存中,高速读写 提供丰富多样的数据类型:string. hash. set. sorted set.bitmap.hyp ...

  8. Redis在项目中的使用及性能测试(续)

    [前言] 在上篇博文<SCPPO:Redis在项目中的使用及性能测试>中小编为大家分享了在程序中引入Redis以及性能的提升,不过遗留了功能的完善以及性能在服务器上的测试,咱们就一鼓作气, ...

  9. Redis在项目中的使用及性能测试

    强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan [前言] 在上篇博文中为大家分享了<SCPPO:C#中Redis封装的类>,有了这个 ...

最新文章

  1. AAAI 2020 | 滴滴东北大学提出自动结构化剪枝压缩算法框架,性能提升高达120倍...
  2. html5 点击事件委托,jquery事件委托
  3. SGU 111 Very simple problem
  4. 飞书上点链接怎么指定跳转浏览器_链接示例表功能还可以这样用??
  5. 系统架构图怎么画_简历的项目经历应该怎么写得好看?
  6. 004-controller的使用
  7. 谁要是敢用Map传参数,我喵喵就打死他
  8. C#设计模式(13)——代理模式(Proxy Pattern)
  9. pgRouting参考资料
  10. 小米销量被荣耀赶超:手机枭雄如何跌落神坛?
  11. 怎样用计算机算出54188,计算机应用技术练习题.doc
  12. 考出面试者基本功的 10 个简单编程题
  13. Boost.Asio的使用技巧
  14. 51 nod 1682 中位数计数
  15. 【论文复现】CBAM(2018)
  16. 红孩儿编辑器的模块设计5
  17. 水电水利建设项目水环境与水生生态保护技术政策
  18. XPosed及插件安装(解决下载http://dl.xposed.info/repo/full.xml.gz时出错的问题)
  19. 八百呼的手机录音系统,一个划时代的进步
  20. 编程初学者为什么要选择python语言,哪些人群适合使用python

热门文章

  1. 如何批量将多个 PPT 文档中的图片提取出来
  2. Android Studio 编译时报文件不能删除,编译失败
  3. 二级路由dhcp关闭连不上wifi_无线宽带路由器除了WiFi上网还能有什么用,如何正确设置DHCP服务...
  4. git 命令git 地址_5个高级Git命令来启动您的Git游戏
  5. 如何批量用扫描仪扫描照片_如何用手机扫描旧照片
  6. 捕食搜索matlab代码,第8章——捕食搜索算法分析.ppt
  7. 淘宝标题优化词根优化方法技巧 什么是淘宝标题词根
  8. android 获取视频长度,android中如何获取视频时长
  9. STM32添加以太网连接
  10. 小学生C++趣味编程 2023 01 09 测试