<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
秒殺最直觀的定義:在高並行場景下而下單某一個商品,這個過程就叫秒殺
【秒殺場景】
早起的12306購票,剛被開發出來使用的時候,12306會經常出現 超賣 這種現象,也就是說車票只剩10張了,卻被20個人買到了,這種現象就是超賣!
還有在高並行的情況下,如果說沒有一定的保護措施,系統會被這種高流量造成宕機
/** * @Author oldlu */ @Service @Transactional //控制事務 public class OrderServiceImpl implements OrderService { @Autowired private StockMapper stockMapper; private OrderMapper orderMapper; //在非並行情況下無問題 @Override public Integer kill(Integer id) { //根據商品id校驗庫存是否還存在 Stock stock = stockMapper.checkStock(id); //當已售和庫存相等就庫存不足了 if(stock.getSale().equals(stock.getCount())){ throw new RuntimeException("庫存不足!"); }else{ //扣除庫存 (已售數量+1) stock.setSale(stock.getSale()+1); stockMapper.updateSale(stock); //更新資訊 //建立訂單 Order order = new Order(); order.setSid(stock.getId()).setName(stock.getName()).setCreateDate(new Date()); orderMapper.createOrder(order); //建立訂單 return order.getId(); //mybatis主鍵生成策略 直接返回建立的id } } }
測試controller
/** * @Author oldlu */ @RestController @RequestMapping("/stock") public class StockController { @Autowired private OrderService orderService; //開發秒殺方法 @GetMapping("/kill/{id}") public String kill(@PathVariable("id") Integer id){ System.out.println("秒殺商品的ID=====================>"+id); try { //根據秒殺商品id呼叫秒殺業務 Integer orderId = orderService.kill(id); return "秒殺成功,訂單ID為:"+String.valueOf(orderId); }catch (Exception e){ e.printStackTrace(); return e.getMessage(); } } }
正常情況看不會有什麼問題,就是你存取一下庫存少一個
執行緒不安全,方法就是加鎖,單機簡單加鎖即可解決,如果是分散式叢集模式搭建那就要考慮分散式鎖
/** * @Author oldlu */ @RestController @RequestMapping("/stock") public class StockController { @Autowired private OrderService orderService; //開發秒殺方法 @GetMapping("/kill/{id}") public String kill(@PathVariable("id") Integer id){ System.out.println("秒殺商品的ID=====================>"+id); try { //使用悲觀鎖 synchronized (this){ //根據秒殺商品id呼叫秒殺業務 Integer orderId = orderService.kill(id); return "秒殺成功,訂單ID為:"+String.valueOf(orderId); } }catch (Exception e){ e.printStackTrace(); return e.getMessage(); } } }
這樣效率很差會造成執行緒阻塞,執行緒排隊問題,對使用者的體驗不是很好,必須處理完一個才能繼續.
/** * 扣除庫存 * @param stock */ public void updateSale(Stock stock){ //扣除庫存 (已售數量+1) stock.setSale(stock.getSale()+1); stockMapper.updateSale(stock); //更新資訊 } /** * 扣除庫存 * @param stock */ public void updateSale(Stock stock){ //在sql層面完成銷量+1 和 版本號 +1 並且根據商品id和版本號同時查詢更新的商品 Integer updRows = stockMapper.updateSale(stock); //更新資訊 if(updRows == 0){ //代表沒有拿到版本號 throw new RuntimeException("搶購失敗,請重試!"); } }
也就是沒更新成功說明已經秒殺完了, 相對悲觀鎖而言樂觀鎖保證了一定的效率,而不像悲觀鎖那樣會造成執行緒阻塞使用樂觀鎖需要使用版本號,在運算元據的時候要對版本號進行更新
但是上述程式碼在高並行,可能其他執行緒會釋放別人的鎖
https://github.com/redisson/redisson
實現分散式鎖的解決方案
高並行快取佇列防止溢位解決方案
到此這篇關於Redis高並行場景下秒殺超賣解決的文章就介紹到這了,更多相關redis高並行秒殺超賣內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45