商城秒杀活动备注

商城的主交易流程一般如下:
1.配置商品信息,2.查询商品 ,3.创建订单,4下单后扣减库存,5,更新订单,6付款,,7卖家发货,

而商城售卖活动中一般都会采用秒杀等方案。
所以解决秒杀等性能实现上主要采用redis功能,以减少DB瞬间的访问压力。
步骤大致如下:
一,商品添加到redis,读取商品详细信息时从redis读,。
1.用户点击抢购时读redis,减少redis中的库存数量,当库存数为0时或活动时间结束才同步到数据库中。
2.秒杀产生的预订单不立刻写到DB,先写到redis,当付款成功后再写入DB。

1.查询 审核通过,剩余库存大于0,活动开始时间小于等于当前时间 的秒杀商品List缓存到Redis中,返回商品List给前端。
2.秒杀详情页读取redis,前端利用商品活动的开始时间和结束时间控制秒杀剩余时间。
3.秒杀下单(修改缓存)商品详情页点击立即抢购实现秒杀下单,下单时候扣减库存。当库存为0或者超过活动时间范围内无法秒杀。
从缓存中查询秒杀商品,扣减(redis)库存,保存(redis)订单。
4.秒杀支付用户成功下单后,跳转到支付页面,用户完成支付后,保存订单到数据库。
 支付系统里获取当前用户,到redis查询秒杀订单,判断秒杀订单存在,支付校验,然后再支付。
5.查询支付结果,如果支付成功后保存订单到DB,删除redis中订单.
6.订单超时处理
当用户下单后给定时间分钟尚未付款应该释放订单,增加库存。
根据用户查询出缓存中的订单,删除缓存中的订单 ,库存回退。
7.补偿调度查询支付状态 关闭支付宝/微信订单。


在秒杀的情况下,肯定不能如此高频率的去读写数据库,会严重造成性能问题的必须使用缓存,将需要秒杀的商品放入缓存中,
并使用锁来处理其并发情况。当接到用户秒杀提交订单的情况下,先将商品数量递减(加锁/解锁)后再进行其他方面的处理,
处理失败在将数据递增1(加锁/解锁),否则表示交易成功。当商品数量递减到0时,表示商品秒杀完毕,拒绝其他用户的请求。
注意防止缓存穿透问题。即:如果缓存中所存商品的id范围可知,如100-1000,那么当我查询id为<100及1000的商品时,
这里缓存中肯定是不存在的,按逻辑肯定会去查DB,查到后把数据放到缓存。这时问题来了,如果有人故意刷你这个范围外的东西,
这样每次去查DB,并发量上来时,DB一定会挂。因此,为了避免这个问题,应在缓存放置当前数据存在的记录ID,
通过ID确定是否需要查询DB。这样大大减轻了DB的压力。


避免商品超卖
通常采用redis的队列QUEUE来实现。将要促销的商品数量以队列的方式存入redis中,每当用户抢到一件促销商品则从队列中删除一个数据,确保商品不会超卖。
Redis入队列rpop,lpush,注意考虑保证redis和数据库数据的数据一致性

redis实现商城中的秒杀并发问题思路
1秒杀活动开始之前,将商品的SKU和库存存入redis中。
redisTemplate.expire(商品的SKU,25,TimeUnit.HOURS); //以商品的唯一标识做为key,缓存24小时
2商品下单方法中增加一个计数器,以商品SKU为KEY,计数器为原子性,不存在并发问题.
long count = redisTemplate.opsForValue().increment(商品SUK, 1);
3提交订单时,从redis中获取商品SKU的库存量,和计数器中的count比较,如果大于等于count,说明秒杀完了.
4:同步库存量到数据库

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值