javascript
redis如何解决秒杀超卖java_Spring Boot + redis解决商品秒杀库存超卖,看这篇文章就够了...
作者:濤哥談籃球
來源:toutiao.com/i6836611989607809548
問題描述
在眾多搶購活動中,在有限的商品數量的限制下如何保證搶購到商品的用戶數不能大于商品數量,也就是不能出現超賣的問題;還有就是搶購時會出現大量用戶的訪問,如何提高用戶體驗效果也是一個問題,也就是要解決秒殺系統的性能問題。本文主要介紹基于redis 實現商品秒殺功能。先來跟大家講下大概思路。
總體思路就是要減少對數據庫的訪問,盡可能將數據緩存到Redis緩存中,從緩存中獲取數據。
在系統初始化時,將商品的庫存數量加載到Redis緩存中;接收到秒殺請求時,在Redis中進行預減庫存,當Redis中的庫存不足時,直接返回秒殺失敗,否則繼續進行第3步;將請求放入異步隊列中,返回正在排隊中;服務端異步隊列將請求出隊,出隊成功的請求可以生成秒殺訂單,減少數據庫庫存,返回秒殺訂單詳情。當后臺訂單創建成功之后可以通過websocket 向用戶發送一個秒殺成功通知。前端以此來判斷是否秒殺成功,秒殺成功則進入秒殺訂單詳情,否則秒殺失敗。
下面直接上代碼系統初始化的時候將秒殺商品庫存放入redis緩存
第二創建消息隊列(這里為了方便,我直接使用redis隊列來進行模擬操作)
第三 配置RedisTemplate序列化
下面創建一個接口,在這個接口中創建10000個線程來模擬用戶商品搶購場景
這里使用到了redis api中的decrement操作,預先減輕用戶搶購的數量,同時判斷redis中的庫存是否大于用戶搶購數量,如果小于0,直接提示用戶秒殺失敗,否則秒殺成功,進入redis消息隊列執行數據庫建庫存操作。以上操作注意保證redis緩存與數據庫庫存數據保持一致性。
下面測試演示
初始化商品庫存100,在測試一萬并發量后,最終發現不會不會出現超賣問題。因為這里一萬個并發,每個并發搶購10件商品。經過redis減庫存之后,最后只會有10個線程去更新數據庫。
好文章,我在看??
總結
以上是生活随笔為你收集整理的redis如何解决秒杀超卖java_Spring Boot + redis解决商品秒杀库存超卖,看这篇文章就够了...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 按条件注解_Spring 条件
- 下一篇: java中struts2日期_Strut