大概的逻辑:
- 就是以requestId为维度 , 进行加锁 , 如果获取锁失败 , 就抛一个自定义的重复下单异常 。
- 如果获取到锁 , 先check一下 , 是否已经下单 , 为了提高性能 , 下单完成后 , 也把下单的结果放在Redis缓存里 。
文章插图
redis防重逻辑
大概的代码如下:
public PlaceOrderResVO placeOrder(PlaceOrderReqVO reqVO) {//加锁RLock orderLock = redissonClient.getLock(RedisConstant.PLACE_ORDER_LOCK_KEY + reqVO.getRequestId());//获取锁失败 , 抛出重复下单异常if(orderLock.isExistes){throw new OrderRepeatException();}// 加锁orderLock.lock();try {//检查是否已经下单RBucket<PlaceOrderResVO> orderCache = redissonClient.getBucket(RedisConstant.PLACE_ORDER_LOCK_KEY+reqVO.getRequestId());if(orderCache.isExistes){return orderCache.get();}//下单业务逻辑……//落库//订单落库Order order = orderMapper.saveOrder(orderDO);……//缓存结果orderCache.put(resVO);return resVO;}} catch (Exception e) {//……} finally {orderLock.unlock();}return resVO;}这里再说明一下:- 为什么获取不到锁的时候要抛异常呢?
客户端 , 也可以根据响应的状态码 , 进行特殊处理 , 比如这个异常先不提示 , 但是允许用户再次点击下单按钮 , 来提升用户的体验 。
原文链接:
https://mp.weixin.qq.com/s/Dc_4taB6Boojdw_0mngroQ
作者:三分恶
【老生常谈的问题:电商业务中如何防止重复下单?】
推荐阅读
- win7系统显示桌面步骤
- 肉苁蓉鹿茸泡酒的食用方法
- 论文写作中常用的研究方法 论文研究方法有哪些
- 常用安眠药的种类与选择 安眠药有哪些
- 古代君王常常自称寡人 古代君王自称寡人是什么意思
- 华为手机非常冷门的实用小技巧,隐藏得很深所以很多人都没有开启
- 眼睛里面长黄斑怎么办?
- 淡竹叶和竹叶的区别是什么?
- 男士发型|最常见的三种男士发型,没想到这么帅,有你同款吗
- 常见的避孕药有哪些 避孕药有哪些
