这里写自定义目录标题
解决超卖问题:()
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 引入了新的中间件,提高了维护成本
转载添加链接描述