<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Redis扣庫存,主要目的是減少對資料庫的存取,之前的減庫存,直接存取資料庫,讀取庫存,當高並行請求到來的時候,大量的讀取資料有可能會導致資料庫的崩潰。
大家可以先讀一下《秒殺系統設計》對整體的秒殺流程有個瞭解之後,在來讀一下這篇文章。
本文只是解決秒殺系統中的一個場景即資料預載入,即把庫存資料事先載入到快取,然後通過快取來更新庫存。
/** * 秒殺介面優化之--- 第一步: 系統初始化後就將所有商品庫存放入 快取 */ @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減庫存的秒殺場景實現的文章就介紹到這了,更多相關redis減庫存內容請搜尋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