最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何通過redis減庫存的秒殺場景實(shí)現(xiàn)

 更新時間:2022年06月01日 10:42:34   作者:ZNineSun  
本文通過解決秒殺系統(tǒng)中的一個場景即數(shù)據(jù)預(yù)加載,即把庫存數(shù)據(jù)事先加載到緩存,然后通過緩存來更新庫存,簡單介紹了如何通過redis減庫存的秒殺場景實(shí)現(xiàn),感興趣的可以了解一下

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

大家可以先讀一下《秒殺系統(tǒng)設(shè)計》對整體的秒殺流程有個了解之后,在來讀一下這篇文章。

本文只是解決秒殺系統(tǒng)中的一個場景即數(shù)據(jù)預(yù)加載,即把庫存數(shù)據(jù)事先加載到緩存,然后通過緩存來更新庫存。

使用思路:

  • 系統(tǒng)初始化的時候,將商品庫存加載到Redis 緩存中保存。
  • 收到請求的時候,先在Redis中拿到該商品的庫存值,進(jìn)行庫存預(yù)減,如果減完之后庫存不足,直接返回邏輯Exception就不需要訪問數(shù)據(jù)庫再去減庫存了,如果庫存值正確,進(jìn)行下一步。
  • 將請求入隊(duì),立即給前端返回一個值,表示正在排隊(duì)中,然后進(jìn)行秒殺邏輯,后端隊(duì)列進(jìn)行秒殺邏輯,前端輪詢后端發(fā)來的請求,如果秒殺成功,返回秒殺,成功,不成功就返回失敗。

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

/**
 * 秒殺接口優(yōu)化之---   第一步:  系統(tǒng)初始化后就將所有商品庫存放入 緩存
 */
@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 就是還有
    }
}

第二步: 預(yù)減庫存從緩存中減庫存

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

整體的邏輯如下:

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

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

內(nèi)存標(biāo)記

由于接口優(yōu)化很多基于Redis的緩存操作,當(dāng)并發(fā)很高的時候,也會給Redis服務(wù)器帶來很大的負(fù)擔(dān),如果可以減少對Redis服務(wù)器的訪問,也可以達(dá)到的優(yōu)化的效果。

于是,可以加一個內(nèi)存map,標(biāo)記對應(yīng)商品的庫存量是否還有,在訪問Redis之前,在map中拿到對應(yīng)商品的庫存量標(biāo)記,就可以不需要訪問Redis 就可以判斷沒有庫存了。

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

private Map<Long, Boolean> isOverMap = new HashMap<Long, Boolean>();
/**
 * 秒殺接口優(yōu)化之---   第一步:  系統(tǒng)初始化后就將所有商品庫存放入 緩存
 */
@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 就是還有
    }
}
/**再優(yōu)化: 優(yōu)化 庫存之后的請求不訪問redis 通過判斷 對應(yīng) map 的值
? * */
boolean isOver = isOverMap.get(goodsId);
if (isOver) {
? ? ?return Result.error(CodeMsg.MIAO_SHA_NO_STOCK);
}

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

2.在預(yù)減庫存之前,從map中取標(biāo)記,若標(biāo)記為false,說明庫存

3.預(yù)減庫存,當(dāng)遇到庫存不足的時候,將該商品的標(biāo)記置為true,表示該商品的庫存不足。這樣,下面的所有請求,將被攔截,無需訪問redis進(jìn)行預(yù)減庫存。

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

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

同時扣減庫存時,需要判斷緩存中的庫存數(shù)量是否仍然大于0,如果小于等于0,修改內(nèi)存標(biāo)記。

到此這篇關(guān)于如何通過redis減庫存的秒殺場景實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)redis減庫存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以

相關(guān)文章

  • redis慢查詢?nèi)罩镜脑L問和管理方式

    redis慢查詢?nèi)罩镜脑L問和管理方式

    這篇文章主要介紹了redis慢查詢?nèi)罩镜脑L問和管理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • redis中Hash字典操作的方法

    redis中Hash字典操作的方法

    redis支持五大數(shù)據(jù)類型,只支持第一層,也就說字典的value值,必須是字符串,本文主要介紹了redis中Hash字典操作,感興趣的可以了解一下
    2021-07-07
  • 解決Redis連接無法正常釋放的問題

    解決Redis連接無法正常釋放的問題

    這篇文章主要介紹了解決Redis連接無法正常釋放的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Redis主從復(fù)制的原理分析

    Redis主從復(fù)制的原理分析

    Redis主從復(fù)制通過將數(shù)據(jù)鏡像到多個從節(jié)點(diǎn),實(shí)現(xiàn)高可用性和擴(kuò)展性,主從復(fù)制包括初次全量同步和增量同步兩個階段,為優(yōu)化復(fù)制性能,可以采用AOF持久化、調(diào)整復(fù)制超時時間、優(yōu)化網(wǎng)絡(luò)帶寬等措施,故障轉(zhuǎn)移機(jī)制依賴于Sentinel或Cluster組件
    2025-01-01
  • Redis數(shù)據(jù)庫的數(shù)據(jù)傾斜詳解

    Redis數(shù)據(jù)庫的數(shù)據(jù)傾斜詳解

    Redis,英文全稱是Remote Dictionary Server(遠(yuǎn)程字典服務(wù)),是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,需要的朋友可以參考下
    2023-07-07
  • Redis 的過期策略與鍵的過期時間設(shè)置方法

    Redis 的過期策略與鍵的過期時間設(shè)置方法

    Redis通過惰性刪除和定期刪除策略管理內(nèi)存,提供多種命令設(shè)置鍵的過期時間,并通過過期字典高效處理過期鍵,合理設(shè)置過期時間、監(jiān)控過期鍵數(shù)量和避免大量鍵同時過期是最佳實(shí)踐,本文介紹Redis 的過期策略與鍵的過期時間設(shè)置,感興趣的朋友一起看看吧
    2025-03-03
  • Redis線程模型的原理分析

    Redis線程模型的原理分析

    Redis是一個高性能的數(shù)據(jù)存儲框架,在高并發(fā)的系統(tǒng)設(shè)計中,Redis也是一個比較關(guān)鍵的組件,是我們提升系統(tǒng)性能的一大利器,本文詳細(xì)的介紹了Redis線程模型,感興趣的可以了解一
    2021-11-11
  • Linux環(huán)境下升級redis的詳細(xì)步驟記錄

    Linux環(huán)境下升級redis的詳細(xì)步驟記錄

    這篇文章主要給大家介紹了關(guān)于Linux環(huán)境下升級redis的詳細(xì)步驟,描述了如何從舊版本升級到新版本Redis,包括備份舊數(shù)據(jù)、下載和安裝新版本、復(fù)制配置文件和數(shù)據(jù)、停止舊版本并啟動新版本的過程,需要的朋友可以參考下
    2024-12-12
  • 最新評論

    新疆| 精河县| 靖安县| 浮梁县| 黎平县| 宣汉县| 赤城县| 涿鹿县| 新乐市| 蒙自县| 湖口县| 灌云县| 搜索| 阜宁县| 全南县| 绥滨县| 威宁| 新津县| 石狮市| 宣化县| 蕲春县| 安国市| 宜春市| 耿马| 商水县| 图木舒克市| 定兴县| 年辖:市辖区| 铁力市| 巴彦淖尔市| 南通市| 封开县| 瓦房店市| 长岭县| 衡南县| 秦安县| 株洲市| 威远县| 中江县| 大姚县| 内江市|