电商中用户余额/积分以及库存的设计

来源:互联网 发布:类似trackid的软件 编辑:程序博客网 时间:2024/06/05 09:14

在电商中,我们总会遇到用户余额/积分和库存的问题,总是怕会出现用户余额/积分用超或商品超卖的情况。这次就来了解一下怎么设计用户余额/积分,怎么来处理库存问题。

一、用户余额/积分设计

1、概述

对于用户余额/积分,一方面我们需要知道用户的总积分有多少(这部分是可用积分),另一方面我还还需要知道用户的积分变动记录(积分的增加和减少)。

同时,在电商中,关于积分的操作不仅仅都是同步的,也就是我们可以直接增加或扣减积分,为了提升服务的性能,如果积分的操作存在异步的情况,那么我们就不能直接进行增加或扣减积分了,这种情况下,我们可以引入积分冻结的概念,暂缓对积分的处理。

另外,如果用户的积分变动较为集中,即存在单位时间内增加和扣减同时出现的情况,那么我们还需要引入分布式锁对用户积分进行保护,避免多个线程同时操作用户积分,造成积分异常。

2、积分表的设计

用户积分表的设计,我们重点需要关注一下三个字段:

字段1 字段2 字段3 用户标识 总积分 可用积分

我们需要注意一下总积分可用积分的区别,一般情况下总积分和可用积分总是相同的,但当需要积分冻结时,我们操作冻结的是用户的可用积分,此时用户的总积分和可用积分就是不相同的。我们也可以通过两者是否相同来判断是否存在冻结中的积分

3、积分明细表的设计

字段 说明 用户标识 唯一标识一个用户 操作积分 本次操作的积分值 可用积分 本次操作可以使用的积分值(用于扣减) 操作类型 增加积分、减少积分 积分类型 业务类型:消费送、支付扣减、过期等 积分状态 有效、已扣除、已过期、冻结中、冻结返还、冻结扣减 积分来源 当扣减积分时,存储扣减的积分记录id,用于追溯积分

4、增加积分

增加积分,只需要增加用户积分、生成积分记录即可
用户积分表:

用户标识 总积分 可用积分 张三 100 100

积分记录表:

记录id 用户标识 操作积分 可用积分 操作类型 积分类型 积分状态 积分来源 1 张三 100 100 增加 消费送 有效

5、直接扣减积分

如果用户支付使用了20积分,那么用户积分情况如下:
用户积分表:

用户标识 总积分 可用积分 张三 80 80

积分记录表:

记录id 用户标识 操作积分 可用积分 操作类型 积分类型 积分状态 积分来源 1 张三 100 80 增加 消费送 有效 2 张三 20 0 减少 支付用 有效 1

扣减时,我们要从积分记录中找到可扣除的积分(增加类型的积分且可用积分为0)进行扣除。
如果此时用户再使用了80积分,那么用户的积分情况是这样的:

用户积分表:

用户标识 总积分 可用积分 张三 0 0

积分记录表:

记录id 用户标识 操作积分 可用积分 操作类型 积分类型 积分状态 积分来源 1 张三 100 0 增加 消费送 已扣除 2 张三 20 0 减少 支付用 有效 1 3 张三 80 0 减少 支付用 有效 1

6、冻结用户积分

引入冻结的目的是为了在用户使用积分的时候,不会真的扣除用户的积分,而是先冻结起来,当确定扣除的操作成功后,再真正的扣除积分,如果操作失败了,则要解冻积分。同时还需要用定时去处理哪些需要解冻而没有正常解冻的积分。

假设用户初始有100的可用积分,当支付需要使用20积分时,先扣除可用积分,生成冻结积分记录,用户的积分情况是这样的:
用户积分表:

用户标识 总积分 可用积分 张三 100 80

积分记录表:

记录id 用户标识 操作积分 可用积分 操作类型 积分类型 积分状态 积分来源 1 张三 20 0 减少 支付用 冻结中

如果异步消息确认用户支付成功,那么就解除积分的冻结状态,此时的用户积分情况如下:
用户积分表:

用户标识 总积分 可用积分 张三 80 80

积分记录表:

记录id 用户标识 操作积分 可用积分 操作类型 积分类型 积分状态 积分来源 1 张三 20 0 减少 支付用 冻结完成,扣减 扣减的记录id

7、解冻用户积分

当出现用户使用积分失败的情况时,我们需要去把冻结中的积分进行解冻,避免影响用户权益。在解冻时,一定要确认确实时用户使用积分失败了,需要解冻,不要出现解冻错误的情况。一般情况下,我们会使用定时任务来解冻积分。解冻时,用户积分情况如下:
用户积分表:

用户标识 总积分 可用积分 张三 100 100

积分记录表:

记录id 用户标识 操作积分 可用积分 操作类型 积分类型 积分状态 积分来源 1 张三 20 0 减少 支付用 冻结失败,扣减 2 张三 20 0 增加 冻结退还 冻结失败,退还

二、库存处理设计

在处理库存时,为了避免卖超,在扣减库存时,一般都会先去判断库存是否足够,如果足够,才会去扣减库存。分布式系统一定要考虑并发的问题,如果查询时库存是足够的,扣减的时候却不足了,如何处理呢?一般我们会考虑加上锁,保证当一个线程操作库存时,其他线程进行等待。但是,锁的出现,必定会影响效率。那么如何设计才能既保证了库存的安全又提高效率呢?解决办法就是通过sql来解决。
比如,我们用t_goods标识库存表,inventory字段标识库存,需要减少N个库存时,通过如下sql来执行:

update t_goods set inventory = inventory - #{N} where inventory >= #{N}

我们通过在update语句添加where条件,来确保扣减库存时,库存一定不小于扣减的数量。

以上就是关于用户余额/积分和库存处理的设计,希望能对大家有所帮助!

原创粉丝点击