电商中用户余额/积分以及库存的设计
来源:互联网 发布:类似trackid的软件 编辑:程序博客网 时间:2024/06/05 09:14
在电商中,我们总会遇到用户余额/积分和库存的问题,总是怕会出现用户余额/积分用超或商品超卖的情况。这次就来了解一下怎么设计用户余额/积分,怎么来处理库存问题。
一、用户余额/积分设计
1、概述
对于用户余额/积分,一方面我们需要知道用户的总积分有多少(这部分是可用积分),另一方面我还还需要知道用户的积分变动记录(积分的增加和减少)。
同时,在电商中,关于积分的操作不仅仅都是同步的,也就是我们可以直接增加或扣减积分,为了提升服务的性能,如果积分的操作存在异步的情况,那么我们就不能直接进行增加或扣减积分了,这种情况下,我们可以引入积分冻结的概念,暂缓对积分的处理。
另外,如果用户的积分变动较为集中,即存在单位时间内增加和扣减同时出现的情况,那么我们还需要引入分布式锁对用户积分进行保护,避免多个线程同时操作用户积分,造成积分异常。
2、积分表的设计
用户积分表的设计,我们重点需要关注一下三个字段:
我们需要注意一下总积分和可用积分的区别,一般情况下总积分和可用积分总是相同的,但当需要积分冻结时,我们操作冻结的是用户的可用积分,此时用户的总积分和可用积分就是不相同的。我们也可以通过两者是否相同来判断是否存在冻结中的积分
3、积分明细表的设计
4、增加积分
增加积分,只需要增加用户积分、生成积分记录即可
用户积分表:
积分记录表:
5、直接扣减积分
如果用户支付使用了20积分,那么用户积分情况如下:
用户积分表:
积分记录表:
扣减时,我们要从积分记录中找到可扣除的积分(增加类型的积分且可用积分为0)进行扣除。
如果此时用户再使用了80积分,那么用户的积分情况是这样的:
用户积分表:
积分记录表:
6、冻结用户积分
引入冻结的目的是为了在用户使用积分的时候,不会真的扣除用户的积分,而是先冻结起来,当确定扣除的操作成功后,再真正的扣除积分,如果操作失败了,则要解冻积分。同时还需要用定时去处理哪些需要解冻而没有正常解冻的积分。
假设用户初始有100的可用积分,当支付需要使用20积分时,先扣除可用积分,生成冻结积分记录,用户的积分情况是这样的:
用户积分表:
积分记录表:
如果异步消息确认用户支付成功,那么就解除积分的冻结状态,此时的用户积分情况如下:
用户积分表:
积分记录表:
7、解冻用户积分
当出现用户使用积分失败的情况时,我们需要去把冻结中的积分进行解冻,避免影响用户权益。在解冻时,一定要确认确实时用户使用积分失败了,需要解冻,不要出现解冻错误的情况。一般情况下,我们会使用定时任务来解冻积分。解冻时,用户积分情况如下:
用户积分表:
积分记录表:
二、库存处理设计
在处理库存时,为了避免卖超,在扣减库存时,一般都会先去判断库存是否足够,如果足够,才会去扣减库存。分布式系统一定要考虑并发的问题,如果查询时库存是足够的,扣减的时候却不足了,如何处理呢?一般我们会考虑加上锁,保证当一个线程操作库存时,其他线程进行等待。但是,锁的出现,必定会影响效率。那么如何设计才能既保证了库存的安全又提高效率呢?解决办法就是通过sql来解决。
比如,我们用t_goods标识库存表,inventory字段标识库存,需要减少N个库存时,通过如下sql来执行:
update t_goods set inventory = inventory - #{N} where inventory >= #{N}
我们通过在update语句添加where条件,来确保扣减库存时,库存一定不小于扣减的数量。
以上就是关于用户余额/积分和库存处理的设计,希望能对大家有所帮助!
- 电商中用户余额/积分以及库存的设计
- TCC 强一致性 实时 DEMO 下单(创建订单,扣除库存,增加积分,扣除余额)
- 库存数据库表的设计
- 库存数据库表的设计
- 关于库存表的设计
- 交互设计--用户头像的设计以及点击操作习惯
- 怎么看到自己的积分,以及如何获取积分?
- T6导入库存期初余额提示“类型不匹配”
- 根据用户的积分进行排名
- 出库单添加以及库存更新的存储过程
- 计算账户的余额及日均余额
- 库存系统架构设计
- 日志式库存管理的设计思路解释
- 日志式库存管理的设计思路解释
- 日志式库存管理的设计思路解释
- 高并发高性能仓库库存系统的架构设计
- 高并发高性能仓库库存系统的架构设计
- 余额宝的蝴蝶效应
- c++primer plus阅读笔记(五)
- SQL 语句关键词笔记二
- cocos 屏幕抖动,3.10可以用
- elasticsearch 学习历程
- 根据两个位置的经纬度,来计算两地的距离(单位为KM)
- 电商中用户余额/积分以及库存的设计
- python 格式化字符串 format() 函数
- Spring 配置拦截器 HandlerInterceptor
- 从学习SaaS引申学习的一些关键词概念
- NIO服务端
- 验证用户名和密码是否为空的两种方式
- 阻止a链接href跳转的两种方式
- 例7.16 命名空间的使用举例
- c++primer plus阅读笔记(六)