亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么通過redis實現減庫存的秒殺場景

發布時間:2022-06-01 13:39:07 來源:億速云 閱讀:463 作者:iii 欄目:開發技術

這篇“怎么通過redis實現減庫存的秒殺場景”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“怎么通過redis實現減庫存的秒殺場景”文章吧。

Redis扣庫存,主要目的是減少對數據庫的訪問,之前的減庫存,直接訪問數據庫,讀取庫存,當高并發請求到來的時候,大量的讀取數據有可能會導致數據庫的崩潰。

使用思路:

  • 系統初始化的時候,將商品庫存加載到Redis 緩存中保存。

  • 收到請求的時候,先在Redis中拿到該商品的庫存值,進行庫存預減,如果減完之后庫存不足,直接返回邏輯Exception就不需要訪問數據庫再去減庫存了,如果庫存值正確,進行下一步。

  • 將請求入隊,立即給前端返回一個值,表示正在排隊中,然后進行秒殺邏輯,后端隊列進行秒殺邏輯,前端輪詢后端發來的請求,如果秒殺成功,返回秒殺,成功,不成功就返回失敗。

第一步:系統初始化后就將所有商品庫存放入緩存

/**
 * 秒殺接口優化之---   第一步:  系統初始化后就將所有商品庫存放入 緩存
 */
@Override
public void afterPropertiesSet() throws Exception {
    List<GoodsVo> goods = goodsService.getGoodsList();
    if (goods == null) {
        return;
    }
    for (GoodsVo goodsVo : goods) {
        redisService.set(GoodsKey.getId(), goodsVo.getStockCount());
        isOverMap.put(goodsVo.getId(), false);//先初始化 每個商品都是false 就是還有
    }
}

第二步: 預減庫存從緩存中減庫存

/**秒殺接口優化之 ----第二步: 預減庫存 從緩存中減庫存
 * 利用 redis 中的方法,減去庫存,返回值為 減去1 之后的值
 * */
long stock = redisService.decr(GoodsKey.getGoodsStock, "" + goodsId);
/*這里判斷不能小于等于,因為減去之后等于 說明還有是正常范圍*/
if (stock < 0) {
    isOverMap.put(goodsId, true);//沒有庫存就設置 對應id 商品的map 為true
    return Result.error(CodeMsg.MIAO_SHA_NO_STOCK);
}

整體的邏輯如下:

1.先將所有數據讀出來,初始化到緩存中,并以 stock + goodid 的形成存入Redis。

2.在秒殺的時候,先進行預減庫存檢測,從redis中,利用decr 減去對應商品的庫存,如果庫存小于0,說明此時 庫存不足,則不需要訪問數據庫。直接拋出異常即可。
我們上面還使用到了isOverMap,這個是內存標記。

內存標記

由于接口優化很多基于Redis的緩存操作,當并發很高的時候,也會給Redis服務器帶來很大的負擔,如果可以減少對Redis服務器的訪問,也可以達到的優化的效果。

于是,可以加一個內存map,標記對應商品的庫存量是否還有,在訪問Redis之前,在map中拿到對應商品的庫存量標記,就可以不需要訪問Redis 就可以判斷沒有庫存了。

1.生成一個map,并在初始化的時候,將所有商品的id為鍵,標記false 存入map中。

private Map<Long, Boolean> isOverMap = new HashMap<Long, Boolean>();
/**
 * 秒殺接口優化之---   第一步:  系統初始化后就將所有商品庫存放入 緩存
 */
@Override
public void afterPropertiesSet() throws Exception {
    List<GoodsVo> goods = goodsService.getGoodsList();
    if (goods == null) {
        return;
    }
    for (GoodsVo goodsVo : goods) {
        redisService.set(GoodsKey.getGoodsStock, "" + goodsVo.getId(), goodsVo.getStockCount());
        isOverMap.put(goodsVo.getId(), false);//先初始化 每個商品都是false 就是還有
    }
}
/**再優化: 優化 庫存之后的請求不訪問redis 通過判斷 對應 map 的值
  * */
boolean isOver = isOverMap.get(goodsId);
if (isOver) {
     return Result.error(CodeMsg.MIAO_SHA_NO_STOCK);
}

if (stock < 0) {
     isOverMap.put(goodsId, true);//沒有庫存就設置 對應id 商品的map 為true
}

2.在預減庫存之前,從map中取標記,若標記為false,說明庫存

3.預減庫存,當遇到庫存不足的時候,將該商品的標記置為true,表示該商品的庫存不足。這樣,下面的所有請求,將被攔截,無需訪問redis進行預減庫存。

所以利用緩存的整體思路如下:

將商品的庫存數據加載至內存,同時初始化內存標記,即把每個產品的id存放至map,都是初始化為false,在每次需要執行秒殺邏輯之前,在在內存標記中取值,如果仍有庫存即map里返回的為false,則 執行秒殺邏輯,否則直接拋出異常。

同時扣減庫存時,需要判斷緩存中的庫存數量是否仍然大于0,如果小于等于0,修改內存標記。

以上就是關于“怎么通過redis實現減庫存的秒殺場景”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

十堰市| 成都市| 遂平县| 依安县| 响水县| 镇巴县| 綦江县| 虹口区| 修文县| 元氏县| 玉林市| 娱乐| 汤原县| 广安市| 孟村| 莆田市| 衡南县| 海丰县| 灵山县| 陇南市| 剑河县| 江永县| 海门市| 分宜县| 武邑县| 杂多县| 吴川市| 安远县| 墨江| 怀集县| 河南省| 辽阳市| 融水| 双流县| 宁德市| 丹凤县| 池州市| 广河县| 杭锦后旗| 山东| 土默特左旗|