koa超卖解决之分布式锁

这里写自定义目录标题


解决超卖问题:()
apache benchmark:模拟并发请求
Redis:存储库存,用Redis 列表的长度来记录生成了多少订单
压力测试:
ab -c 10 -n 1000 http://localhost:4000/
> llen orders
要处理这个问题有三种方法:
1判断 incrby 命令的返回值
可以直接判断返回值是否大于 0 来判断是否抢购成功,不再需要 get 命令
实现代码:先判断如果redis.incrby由商品id加-1到商品上,即减少一个商品,随后调用redis.rpush由订单号是的订单加1
2使用 lua 脚本让 Redis 命令具有原子性
实现代码:在redis.defineCommand中写上网上的lua脚本,之后如果已经由商品id创建了订单则进行减库存,并且调用redis.rush由订单号创建订单。
3使用 Redis 的 rpop 命令只需要判断是否有数据能 pop 出来
调用redis.lpop根据商品id进行减库存,并调用redis.rpush根据订单id将订单插入到订单表中。
使用分布式锁也可以解决超卖的问题,我们可以基于 Redis 和 zookeeper 实现分布式锁(使用 go 开发的同学也可以使用 etcd 实现分布式锁)
基于 Redis 实现分布式锁有比较难实现阻塞的缺点,因为不是阻塞所以并不是先到先得,在秒杀时会出现后支付的用户越过前面支付的用户购买成功的情况。
而基于 zookeeper 实现分布式锁有下面两个缺点:
1 java程序员和熟悉kafka的程序员比较熟悉,其他语言的使用者需要一定的学习成本
2 引入了新的中间件,提高了维护成本

转载添加链接描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值