电商--红包活动总结

news2024/11/16 21:35:18

文章目录

  • 背景
  • 表结构设计
  • 实现流程
    • 流程图
    • 流程解析
    • 流程优化

背景

这是一个来自于NFT电商项目,这是个营销策略的需求,为了快狠准,短期内刺激消费,拉动销售增加购买量。运营人员可以在平台创建红包,并且设置该红包的发放时间段、个数、总金额、金额分摊策略(0-平均、1-随机)、NFT系列(0-不分系列),红包可作为NFT购买时的抵用券。然后用户可以在某个页面看到红包活动,对于进行中的红包活动,用户可以点击抢红包,获取红包,最后,用户可以查看自己抢到的红包。整个业务流程不复杂,难点在于抢红包这个行为可能有很高的并发。所以,系统设计的优化点主要关注在抢红包这个行为上。

抢红包的特点是有短时间段内的高并发,且也是读多写少的场景。

该特征与抢购的特征一样,所以也可以使用限流+缓存的方式来做架构设计。我们这里主要介绍业务流程。

由于查看红包过于简单,所以这里不讨论。这里主要关注创建红包、抢红包两种实现。

创建红包:运营设置红包总金额、总数量、有效时间段、金额分摊策略、NFT系列ID
抢红包:用户从总红包中随机获得一定金额

表结构设计

红包活动表,用于记录每次发放的红包整体信息。需要在每次


CREATE TABLE `t_redpack_activity`
(
    `id`         bigint(20)     NOT NULL COMMENT '主键',
    `nft_series_id` bigint(20)     NOT NULL DEFAULT '0' COMMENT 'nft系列表ID,0-不分系列',
    `total_amount`     decimal(10, 2) NOT NULL DEFAULT '0.00' COMMENT '总金额',
    `surplus_amount`     decimal(10, 2) NOT NULL DEFAULT '0.00' COMMENT '剩余金额',
    `total` bigint(20)     NOT NULL DEFAULT '0' COMMENT '红包总数',
    `surplus_total` bigint(20)     NOT NULL DEFAULT '0' COMMENT '红包剩余总数',
     `status`     TINYINT(4) NOT NULL DEFAULT 0 COMMENT '红包活动状态 1-有效; 2-失效',
    `version` bigint(20)     NOT NULL DEFAULT '0' COMMENT '版本号',
    `start_time` bigint(13) unsigned NOT NULL DEFAULT '0' COMMENT '开始时间',
    `end_time` bigint(13) unsigned NOT NULL DEFAULT '0' COMMENT '结束时间',
    `create_time` bigint(13) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
  `create_user` varchar(32) COLLATE utf8mb4_bin NOT NULL DEFAULT ' ' COMMENT '创建人',
  `update_time` bigint(13) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
  `update_user` varchar(32) COLLATE utf8mb4_bin NOT NULL DEFAULT ' ' COMMENT '更新人',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='红包活动表';

明细表,用于记录红包被谁领取,红包的金额


CREATE TABLE `t_redpack_detail`
(
    `id`         bigint(20)     NOT NULL COMMENT '主键',
    `activity_id`         bigint(20)     NOT NULL DEFAULT 0 COMMENT '红包活动ID',
    `amount`     decimal(10, 2) NOT NULL DEFAULT '0.00' COMMENT '金额',
    `user_id`    bigint(20)     NOT NULL DEFAULT '0' COMMENT '用户编号',
    `status`     TINYINT(4) NOT NULL DEFAULT 0 COMMENT '红包状态 1可用 2不可用',
    `version` bigint(20)     NOT NULL DEFAULT '0' COMMENT '版本号',
    `create_time` bigint(13) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
  `update_time` bigint(13) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='红包明细表';

这里有个小小的疑问,就是为什么需要提前给红包明细表生成数据呢?事实上考虑到如果红包明细信息是在抢红包中去创建那么会使整个抢红包流程变得比较慢,所以采用 预先分配数据的方案。

实现流程

流程图

在这里插入图片描述

流程解析

  • 首先声明由于这里使用分库分表、读写分离,所以数据库的所有操作都是无事务的操作。
  • 客户端获取到红包活动数据,根据开始时间和和结束时间判断显示的状态(活动中;活动结束;已抢光)
  • 客户端请求服务端抢红包接口
  • 服务端根据用户ID、活动ID做校验。
    – 根据用户ID判断该用户是否领取过红包,领取过返回客户端提示已领取;未领取进行活动的校验
    – 根据活动ID,查询红包活动表查看活动是否进行中,是否抢光,是否有效。有校验不通过的返回客户端相关提示,校验通过继续下面的流程
  • 查询出红包明细表中所有用户编号为空的记录乱序后选取前5个放入java内存队列中,从队列中取出一条记录,更新它的用户编号、更新时间。更新失败,则去下一个,都失败则提示让用户自己重试;成功则返回成功信息,并显示获取的金额。
  • 更新红包活动表的剩余金额和剩余红包数字段

流程优化

1、对于步骤1查询是否抢光的流程,可以增加java本地内存和redis缓存的优化。在java内存中存储一个字段表示是否已经抢光,抢光则直接返回抢光的提示,这样就不需要操作数据库。在运营创建红包活动后同步红包活动的信息到redis内存中,这样可以不读取mysql数据库,直接使用redis的数据进行校验活动是否开始,而是否抢光的判断就不进行了,直接根据获取明细表中的未更新用户编号数据校验是否抢光了。

2、第三步和第四步之间可能由于实例崩溃导致更新了明细表却没更新活动表,所以当查询到明细表用户编号为空的数据集合为空时则表示红包已经抢光了。则设置java内存中是否抢光的标识为抢光。

3、由于明细表是高并发且做了读写分离,所以明细表的更新操作要根据版本号做乐观锁操作,最终都要根据返回值判断是否更新成功。

4、之所以提前生成明细数据是使用了高性能设计中的预计算的处理方案来提高系统的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/634689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android系统视角下对APK的分析(1)- 静态分析APK文件

声明 以Android手机用户角度来看,安装各式各样的APP,基本就是从应用市场上 “搜索->下载->安装” 三连。而对Android系统来说,这就是个大工程了,因为对Android系统来说APK是“外来户”,如何安装它、有限制地支持…

【用户认证】密码加密,用户状态保存,cookie,session,token

相关概念 认证与授权 认证(authentication )是验证你的身份的过程,而授权(authorization)是验证你有权访问的过程 用户认证的逻辑 获取用户提交的用户名和密码根据用户名,查询数据库,获得完…

redis知识复习

redis知识复习 redis基础知识redis的认识一. 非关系型数据库 与 传统数据库 的区别二. 安装redis并设置自启动三. 熟悉命令行客户端四.熟悉图形化工具RDM redis的命令与数据结构一. 数据结构介绍二. redis通用命令(熟练掌握) redis的Java客户端一. Jedis…

文心一言 VS 讯飞星火 VS chatgpt (38)-- 算法导论5.4 2题

二、假设我们将球投入到b个箱子里,直到某个箱子中有两个球。每一次投掷都是独立的并且每个球落入任何箱子的机会均等。请问投球次数期望是多少? 文心一言: 这是一个典型的鸽巢原理(Pigeonhole Principle)问题。假设每次投球时&…

2023年上半年系统分析师下午真题及答案解析

试题一(25分) (试题一为必答题,试题二~五选答两题) 某软件公司拟开发一套汽车租赁系统,科学、安全和方便的管理租赁公司的各项业务,提高公司效率,提升利用率。注册用户在使用系统进行车辆预约时需执行以下操作:(a)用…

从0-1一起学习live555设计思想之二 RTSP交互过程

流媒体服务系列 文章目录 流媒体服务系列前言一、OPTION二、DESCRIBE三、SETUP四、PLAY总结前言 本篇文章通过代码去分析rtsp交互过程与工作原理。由于live555的继承关系太过复杂,所以做了个图简单记录一下与h264文件传输相关的类继承关系。 一、OPTION OPTION比较简单,就…

【调制BFSK】二进制频移键控FSK的数字调制(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

ARM学习(22)断点认识以及调试

笔者来聊聊断点以及断点的调试 1、断点原理 断电的原理一般分为两种,插入断点指令或者利用硬件调试寄存器进行断点。 前者程序如果在RAM(SRAM、DDR)上,则调试器可以直接在断点地址处插入断点指令,例如BKPT&#xff0…

python自动化测试-自动化基本技术原理

1 概述 在之前的文章里面提到过:做自动化的首要本领就是要会 透过现象看本质 ,落实到实际的IT工作中就是 透过界面看数据。 掌握上面的这样的本领可不是容易的事情,必须要有扎实的计算机理论基础,才能看到深层次的本质东西。 …

家用电器-空调制冷、制热、除霜、除湿、换新风的基本原理及实现讲解

目录 一、空调历史 二、空调的作用 三、空调类型 四、基本原理 4.1 制冷过程 4.2 制热过程 4.3 除霜过程 4.4 除湿过程 4.5 换气过程 五、电路控制系统 六、核心部件 七、基本指标 1)气候类型 2)额定制冷量 3)能效比 八、市场…

4年功能庸庸碌碌,进阶自动化测试拿到了24k,测试之路不再平凡...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 手工测试如何进阶…

多业务聚合查询设计思路与实践

文章目录 [toc] 1.需求2.方案2.1 方案架构图2.2 选用flink-cdc的原因 3.实践3.1 环境准备3.3 es集群搭建3.4 flink1.14.0环境搭建3.5 准备sql和jar包3.5.1[创建mysql的flink用户并授权](https://ververica.github.io/flink-cdc-connectors/master/content/connectors/mysql-cdc…

【树形DP+直径思想】代码源每日一题div1 三进制循环

三进制循环 - 题目 - Daimayuan Online Judge 题意: 思路: 有点像树的直径 回顾一下我们是怎么求直径的:维护根节点到其子树上的点的最大距离和次大距离,然后答案就是统计所有结点的次大值最大值 的 最大值 这道题也是一样的&a…

C盘爆满时的几个救命无害清理技巧

其实网上也有很多清理C盘的方法 但是很多就是为了弄成空间 不讲原理 也不计后果 很可能坑惨小伙伴 可以看到 我电脑的C盘都已经读红条了 非常危险 对了 可能有些朋友的电脑上没有此电脑的选项 我们可以在桌面上右键选择 个性化 找到 主题 并选择 向下拉 找到 桌面图标设置 …

经验总结:13 条自动化测试框架设计原则!

1.代码规范 测试框架随着业务推进,必然会涉及代码的二次开发,所以代码编写应符合通用规范,代码命名符合业界标准,并且代码层次清晰。特别在大型项目、多人协作型项目中,如果代码没有良好的规范,那么整个框…

微服务之负载均衡

Informal Essay By English I wish the students of the college entrance examination can win the gold toad and win the title of the gold list 参考书籍:“凤凰架构” 负载均衡(load balance) 负载平衡是指在一组后端服务器&#xf…

《计算机网络——自顶向下方法》精炼——4.4.1-4.4.2

敬教劝学,建国之大本;兴贤育才,为政之先务。——《朱舜水集。劝学》 文章目录 IPv4编址接口IP地址子网 无类别域间路由选择(CIDR)获取一块地址获取主机地址网络地址转换 IPv4编址 接口 主机或路由器与物理链路的边界称作接口。一…

深度学习卷积神经网络CNN之ResNet模型网络详解说明(超详细理论篇)

1.ResNet背景 2. ResNet论文 3. ResNet模型结构 4. ResNet优缺点 一、ResNet背景 ResNet 在2015 年由微软研究院提出的一种深度卷积神经网络结构,在ILSVRC(ImageNet Large Scale Visual Recognition Challenge)中取得了冠军(分类…

python - kubernetes中grpc服务健康检查实现

概述 kubernetes本身不支持gRPC健康检查,本文记录使用 ‘grpc-health-probe’ 实现grpc服务的健康检查 ‘grpc-health-probe’,这是 Kubernetes 原生的健康检查 gRPC 应用程序的方法 官方参考文档:https://kubernetes.io/zh-cn/blog/2018/1…

45--Django-项目实战-全栈开发-基于django+drf+vue+elementUI企业级项目开发流程-纯手工安装部署和docker一键部署

前期准备: 购买服务器,公网地址访问 服务器有多种选择,阿里云,腾讯云,华为云(可以免费试用几个月) 买阿里云就当成你去电脑市场组装了一台电脑。阿里云按时间计费(账户余额要大于100)。 购买流程: 搜索云服务器 开始创建你的云服务器 按量付费:用多少扣多少 地域…