支付网关、redis + lua实现扣减库存

本文介绍了在电商系统中如何利用支付网关进行交易处理,并通过Redis+Lua实现分布式锁来避免库存超卖问题。支付流程涉及微信和支付宝接口调用,订单状态管理和异步处理。在库存管理上,通过lua脚本确保原子性操作,防止并发冲突,确保交易的正确性。此外,讨论了不同场景下分布式锁的实现方式以及并发量大的情况下采用消息队列的重要性。
摘要由CSDN通过智能技术生成

        昨天下班等公交的时候,一个大爷一直在看我,我以为是我太帅了原来是看我手机上的车来了,他说他新买的手机也下载了一个,但是打开后老是其他的广告,还骂骂咧咧的吐槽这个软件,哈哈,以前总是不太关心用户体验,经理总是说我们,现在终于深切的体会到了,体验不好他会慰问你八倍祖宗哈哈,骂也是骂产品经理和市场经理嘿嘿。

        跟今天要总结的东西有点跑偏了。。。

## 支付网关

网关是大哥写的,主要是在购票生成订单时去使用,目前有微信和支付宝两种支付方式,感觉没啥好说的。

就是调用支付网关的接口,然后给他订单信息(做签名)和回调地址(验签)。

回调地址就处理下支付成功或者失败后的业务逻辑,一般就是修改下订单状态、记录下流水号类之类,支付网关请求成功后会返回一个预支付交易会话ID返给前台,让前台去唤醒支付然后付钱。

如果唤醒支付后用户没有支付,这个订单就会进入到mq,然后做一个异步消费(延迟20分钟消费,如果20分钟后还没有支付就自定取消订单,增加库存)。

大致就这些,支付网关应该每个公司都差不多,都是一个通用的。

## redis + lua实现扣减库存 (分布式锁)(推荐方案2)

方案1:

这里主要是防止车票买超出的情况(一共10张票,卖了20张)
大致流程:
1、扣除库存前先将当前用户加锁并设置过期时间(过期时间要根据业务具体设置),返回锁的持有者
2、然后用返回锁的持有者跟当前要购票的用户比对
3、比对成功,获取剩余库存跟当前购票数比对
4、比对失败,就是没抢到票
5、如果还有票,就将库存key和购票数传入lua脚本扣除库存
6、判断lua脚本执行结果 >= 0 表示执行成功了。
7、然后根据用户和锁的key锁释锁(让其他用户可以享受购票,防止购完票了后还没有到锁的过期时间)。
8、如果没有票就告知前台库存不足购票失败。

这里的加锁(令牌)用的是jedis的 set(String key, String value, String nxxx, String expx, int time) 方法,就是setnx + 过期时间,这里是原子操作

这里是释放锁用的是lua脚本,如果锁的值是当前用户就执行del key 操作 否则返回 0

操作 lua脚本 用的是jedis的 eval(String script, List<String> keys, List<String> args) 方法

方案2:

这里主要是防止车票买超出的情况(一共10张票,卖了20张)
大致流程:

需要用到两个key,库存key(string)、用户是否购买了商品key(set)

1、判断用户是否购买过这个商品,如果购买过直接返回,提示他已经买过票了
2、如果没有买过这个商品,查询当前商品库存数是否小于等于0,如果是直接返回,提示他库存不足
3、如果库存大于0,判断库存数量 - 当前购买数量是否小于0,如果是直接返回,提示他库存不足
4、如果库存够,执行decrby操作,执行sadd操作,将库存扣除,将用户添加到是否购买了商品里面
5、执行完脚本后,初始化订单扣减数据库库存(事务),延迟队列,延迟消费订单(防止存在大量待支付订单)
6、调用用支付网关,返回成功后修改订单状态(待支付)
7、将网关调用支付宝或者微信的会话id拿到
8、返回给前台

操作lua脚本用的是:
redisTemplate的execute(RedisScript<T> script, List<K> keys, Object... args)方法

 分布式锁的三种实现方式,基于数据库、基于zookeeper、基于redis。

因为并发量不是很大,在初始化订单的时候没有放到mq中,如果并发很大的话一定要放到mq中,不然数据库扛不住。

下单后的第一个操作就是访问redis(查库存),不能有任何数据库操作。不然扛不住。

之前背面试题的时候不理解记不住,只有当自己在实践中使用是才能牢记,加油呀!打工人!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值