日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

Java秒杀系统优化(高性能高并发)

發(fā)布時(shí)間:2023/12/15 windows 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java秒杀系统优化(高性能高并发) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

源碼免費(fèi)下載地址:關(guān)注微信公眾號(hào)“蝦米聊吧”,回復(fù)關(guān)鍵字“秒殺

主題:在大并發(fā)大流量的情況下如何提升吞吐量或者說(shuō)QPS?

而秒殺活動(dòng)恰恰就是屬于大并發(fā)的情形,因此下面簡(jiǎn)單來(lái)談?wù)劥蟛l(fā)下秒殺方案的優(yōu)化。

項(xiàng)目采用技術(shù):SpringBoot + MyBatis + MySql + RabbitMq + Redis

RabbitMq安裝參考:https://blog.csdn.net/zwx19921215/article/details/103255834

?

文章首先說(shuō)明優(yōu)化思路方案和步驟,然后闡述代碼具體實(shí)現(xiàn),最后采用JMeter進(jìn)行簡(jiǎn)單壓測(cè)。

?

  • 針對(duì)大并發(fā)的主體優(yōu)化常見(jiàn)有如下幾種方式:

1.頁(yè)面緩存 + URL緩存 + 對(duì)象級(jí)緩存

2.頁(yè)面靜態(tài)化(瀏覽器緩存),前后端分離+ajax

3.靜態(tài)資源優(yōu)化(js/css壓縮,減少流量),多個(gè)js/css組合,減少連接數(shù)

4.CDN優(yōu)化

?

而作為一個(gè)程序猿我們都知道并發(fā)最大的瓶頸基本就是數(shù)據(jù)庫(kù)因此最好就是減少數(shù)據(jù)庫(kù)的訪問(wèn)次數(shù)即加緩存。

?

  • 從訪問(wèn)開(kāi)始到后端返回整個(gè)緩存鏈可以是:

瀏覽器端緩存(頁(yè)面靜態(tài)化)--> CDN --> nginx緩存 --> 后端服務(wù)緩存(頁(yè)面緩存、對(duì)象級(jí)緩存等) --> 數(shù)據(jù)庫(kù)

?

而作為一名后端工程師的優(yōu)化則主要是針對(duì)接口優(yōu)化,這也是我們的重頭戲;

  • 接口優(yōu)化大概通過(guò)如下步驟處理:

1.redis預(yù)減庫(kù)存減少 數(shù)據(jù)庫(kù)訪問(wèn)?

2.內(nèi)存標(biāo)記減少redis訪問(wèn)?

3.請(qǐng)求先入隊(duì)緩沖,異步下單 ,增強(qiáng)用戶體驗(yàn)

?

  • 針對(duì)秒殺接口優(yōu)化:

核心思路:減少數(shù)據(jù)庫(kù)訪問(wèn)(數(shù)據(jù)庫(kù)瓶頸)

1.系統(tǒng)初始化,把商品庫(kù)存數(shù)量加載到redis

2.收到請(qǐng)求,redis預(yù)減庫(kù)存,庫(kù)存不足,直接返回,否則進(jìn)入3

3.請(qǐng)求入隊(duì),立即返回 排隊(duì)中

4.請(qǐng)求出隊(duì),生成訂單,減少庫(kù)存

5.客戶端輪詢,是否秒殺成功

?

  • 針對(duì)安全方面優(yōu)化:

1.秒殺接口地址隱藏

2.數(shù)學(xué)公式驗(yàn)證碼

3.接口限流防刷

?

  • 秒殺接口地址隱藏:

思路:秒殺開(kāi)始之前,先去請(qǐng)求接口獲取秒殺地址?

1.接口改造 ,帶上PathVariable參數(shù)

2.添加生成地址的接口

3.秒殺收到請(qǐng)求,先驗(yàn)證PathVariable

?

  • 數(shù)學(xué)公式驗(yàn)證碼:

目的:防機(jī)器人,分散請(qǐng)求

思路:點(diǎn)擊秒殺之前,先輸入驗(yàn)證碼,分散用戶的請(qǐng)求

1.添加生成驗(yàn)證碼接口

2.在獲取秒殺路徑的時(shí)候,驗(yàn)證驗(yàn)證碼

?

  • 接口防刷限流:

1.利用redis緩存:比如限制用戶1min中內(nèi)只允許訪問(wèn)多少次

2.可以利用攔截器減少對(duì)業(yè)務(wù)代碼的入侵

?

  • 解決超賣問(wèn)題:

1.數(shù)據(jù)庫(kù)加唯一索引:防止用戶重復(fù)購(gòu)買?

2.更新庫(kù)存sql增加庫(kù)存數(shù)量判斷:防止庫(kù)存變成負(fù)數(shù)?

(update table set count=count-1 where count>0)?

?

  • 秒殺優(yōu)化后的主體詳細(xì)流程大致可以分為如下步驟:
  • 程序啟動(dòng)后將秒殺庫(kù)存寫入redis,設(shè)置內(nèi)存標(biāo)記商品是否已秒殺完
  • 加入驗(yàn)證碼
  • 秒殺前首先獲取秒殺路徑
  • 開(kāi)始秒殺:
  • ?a.判斷用戶登錄信息是否異常b.驗(yàn)證秒殺路徑c.獲取秒殺商品內(nèi)存標(biāo)記并判斷是否已秒殺完d.redis獲取用戶訂單,判斷該用戶是否是重復(fù)秒殺e.如果是正常秒殺,對(duì)于未秒殺完的商品進(jìn)行redis減庫(kù)存操作f.如果redis庫(kù)存已<0,標(biāo)記內(nèi)存商品已秒殺完g.秒殺正常則加入隊(duì)列,異步處理訂單入庫(kù),返回排隊(duì)中

    5.前端輪詢訂單結(jié)果(是否秒殺成功)

    ?

    • 實(shí)現(xiàn)效果如下:

    用戶登錄界面

    描述商品列表頁(yè):

    秒殺商品詳情頁(yè)(增加驗(yàn)證碼):

    增加訪問(wèn)限制(防刷限流):

    重復(fù)秒殺處理:

    換一個(gè)秒殺商品重新秒殺:

    秒殺成功進(jìn)入訂單詳情頁(yè):

    數(shù)據(jù)庫(kù)查看庫(kù)存正常減1

    項(xiàng)目結(jié)構(gòu)如下:

    秒殺接口部分核心代碼如下:

    獲取驗(yàn)證碼:

    @AccessLimit(seconds = 5, maxCount = 5, needLogin = true)@RequestMapping(value = "/path", method = RequestMethod.GET)@ResponseBodypublic Result<String> getMiaoshaPath(HttpServletRequest request, MiaoshaUser user,@RequestParam("goodsId") long goodsId,@RequestParam(value = "verifyCode", defaultValue = "0") int verifyCode) {if (user == null) {return Result.error(CodeMsg.SESSION_ERROR);}boolean check = miaoshaService.checkVerifyCode(user, goodsId, verifyCode);if (!check) {return Result.error(CodeMsg.REQUEST_ILLEGAL);}String path = miaoshaService.createMiaoshaPath(user, goodsId);return Result.success(path);}

    獲取秒殺路徑:?

    @RequestMapping(value = "/verifyCode", method = RequestMethod.GET)@ResponseBodypublic Result<String> getMiaoshaVerifyCod(HttpServletResponse response, MiaoshaUser user,@RequestParam("goodsId") long goodsId) {if (user == null) {return Result.error(CodeMsg.SESSION_ERROR);}try {BufferedImage image = miaoshaService.createVerifyCode(user, goodsId);OutputStream out = response.getOutputStream();ImageIO.write(image, "JPEG", out);out.flush();out.close();return null;} catch (Exception e) {e.printStackTrace();return Result.error(CodeMsg.MIAOSHA_FAIL);}}

    執(zhí)行秒殺:

    @RequestMapping(value = "/{path}/do_miaosha", method = RequestMethod.POST)@ResponseBodypublic Result<Integer> miaosha(Model model, MiaoshaUser user,@RequestParam("goodsId") long goodsId,@PathVariable("path") String path) {model.addAttribute("user", user);if (user == null) {return Result.error(CodeMsg.SESSION_ERROR);}//驗(yàn)證pathboolean check = miaoshaService.checkPath(user, goodsId, path);if (!check) {return Result.error(CodeMsg.REQUEST_ILLEGAL);}//內(nèi)存標(biāo)記,減少redis訪問(wèn)if (localOverMap.size() > 0) {boolean over = localOverMap.get(goodsId);if (over) {return Result.error(CodeMsg.MIAO_SHA_OVER);}}//判斷是否已經(jīng)秒殺到了MiaoshaOrder order = orderService.getMiaoshaOrderByUserIdGoodsId(user.getId(), goodsId);if (order != null) {return Result.error(CodeMsg.REPEATE_MIAOSHA);}//預(yù)減庫(kù)存long stock = redisService.decr(GoodsKey.getMiaoshaGoodsStock, "" + goodsId);//10if (stock < 0) {localOverMap.put(goodsId, true);return Result.error(CodeMsg.MIAO_SHA_OVER);}//mq入隊(duì)MiaoshaMessage mm = new MiaoshaMessage();mm.setUser(user);mm.setGoodsId(goodsId);sender.sendMiaoshaMessage(mm);return Result.success(0);//排隊(duì)中
    • 采用JMeter做個(gè)簡(jiǎn)單的壓力測(cè)試

    JMeter簡(jiǎn)單使用參考:https://blog.csdn.net/zwx19921215/article/details/103261289

    操作系統(tǒng):centos 虛擬機(jī)雙核

    測(cè)試參數(shù):生成5000個(gè)用戶(token信息),設(shè)置5000個(gè)線程數(shù)循環(huán)10次,即運(yùn)行50000次,然后查看聚合報(bào)告中的吞吐量。

    虛擬機(jī)測(cè)試結(jié)果吞吐量為2000左右,取決于機(jī)器配置

    注:該接口是在未加入驗(yàn)證碼動(dòng)態(tài)獲取秒殺路徑的前提下測(cè)試的

    ?

    項(xiàng)目完整代碼下載地址:http://zyshare.cn/resource/detail/22

    源碼免費(fèi)下載地址:關(guān)注微信公眾號(hào)“蝦米聊吧”,回復(fù)關(guān)鍵字“秒殺

    關(guān)注微信公眾號(hào)“蝦米聊吧”,后續(xù)持續(xù)放送“技術(shù)架構(gòu)和資料”干貨!!!

    ? ?一個(gè)熱衷于分享技術(shù)和生活的程序猿,讓我們一起交流吧~??????

    ? ? ? ? ? ? ???? ? ?

    ? ? ? ? ? ? ? ? ? 微信掃描二維碼,關(guān)注我的公眾號(hào)

    總結(jié)

    以上是生活随笔為你收集整理的Java秒杀系统优化(高性能高并发)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。