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

Java實(shí)現(xiàn)高并發(fā)秒殺的幾種方式

 更新時(shí)間:2023年05月23日 15:51:50   作者:fking86  
高并發(fā)場(chǎng)景在現(xiàn)場(chǎng)的日常工作中很常見,本文主要介紹了Java實(shí)現(xiàn)高并發(fā)秒殺的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

引言

高并發(fā)場(chǎng)景在現(xiàn)場(chǎng)的日常工作中很常見,特別是在互聯(lián)網(wǎng)公司中,這篇文章就來介紹如何實(shí)現(xiàn)高并發(fā)秒殺的幾種方式。

實(shí)現(xiàn)方式

1.緩存

使用緩存可以減少數(shù)據(jù)庫的訪問量,提高系統(tǒng)吞吐量。可以緩存熱點(diǎn)數(shù)據(jù)、查詢結(jié)果等。

@Cacheable(value = "goods", key = "#goodsId")
public Goods getGoods(Integer goodsId) {
    // 查詢數(shù)據(jù)庫
}

2.前端實(shí)現(xiàn)方式

通過前端 JS 代碼限制用戶請(qǐng)求頻率,避免過大流量涌入,導(dǎo)致系統(tǒng)崩潰。比如可以實(shí)現(xiàn)每秒鐘限制請(qǐng)求次數(shù)等。

var requestTimes = 0; 
var lastRequestTime = 0;
function requestSecKill() {
    var now = new Date();
    if (now - lastRequestTime < 1000 && requestTimes > 5) {
        alert('請(qǐng)求過于頻繁,請(qǐng)稍后再試!');
        return;
    }
    lastRequestTime = now;
    requestTimes++;
    // 發(fā)送秒殺請(qǐng)求
}

3.隊(duì)列削峰

當(dāng)請(qǐng)求流量超過系統(tǒng)容量時(shí),暫存多余請(qǐng)求到消息隊(duì)列,然后逐漸削峰處理。比如定時(shí)從隊(duì)列中取出一定數(shù)量請(qǐng)求處理。

BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1000);
?
public void addTask(Runnable task) {
    boolean offered = queue.offer(task);
    if (!offered) {
        // 隊(duì)列滿了,請(qǐng)求太多,返回限流提示
    }
}
?
public void handleTasks() {
    Runnable task = queue.poll();
    if (task != null) {
        executor.execute(task);
    }
}

4.限流

使用令牌桶或者漏桶算法根據(jù)系統(tǒng)容量限制請(qǐng)求通過速率。超過速率的請(qǐng)求被拒絕或進(jìn)入隊(duì)列等待。

RateLimiter rateLimiter = RateLimiter.create(10); // 每秒不超過10個(gè)請(qǐng)求 
if (rateLimiter.tryAcquire()) {
    // 請(qǐng)求通過
} else {
   // 請(qǐng)求超過限流頻率
}

5.數(shù)據(jù)庫讀寫分離

將數(shù)據(jù)庫分成主庫和從庫,秒殺相關(guān)讀操作從從庫讀取,防止主庫壓力過大。

@Autowired
private GoodsRepository goodsRepository;
?
public Goods getGoods(Integer goodsId) {
    // 讀取從庫
    return goodsRepository.read(goodsId); 
}
?
public void reduceStock(Integer goodsId) {
    // 寫入主庫
    goodsRepository.write(goodsId);
}

6.緩存失效時(shí)間

可以根據(jù)系統(tǒng)負(fù)載動(dòng)態(tài)調(diào)整緩存失效時(shí)間,在高流量期間縮短失效時(shí)間,避免緩存相同數(shù)據(jù)長(zhǎng)時(shí)間。

@Cacheable(value = "goods", key = "#goodsId", expire = "#expireTime")
public Goods getGoods(Integer goodsId, Integer expireTime) {
    // 查詢數(shù)據(jù)庫
}
?
// 調(diào)整失效時(shí)間
cacheManager.setCacheExpired(cacheName, expireTime); 

7.版本控制

對(duì)緩存或商品數(shù)據(jù)設(shè)置版本號(hào),當(dāng)數(shù)據(jù)修改時(shí)版本號(hào)遞增。請(qǐng)求帶上版本號(hào),如果緩存版本低,則從數(shù)據(jù)庫重新加載數(shù)據(jù)??梢源_保用戶獲取最新數(shù)據(jù)。

后端:

@Cacheable(value = "goods", key = "#goodsId + #version") 
public Goods getGoods(Integer goodsId, Integer version) {
    // 查詢數(shù)據(jù)庫,帶版本號(hào)校驗(yàn)
}
?
public void updateGoods(Integer goodsId, Integer version) {
    goods.setVersion(version + 1);
    // 更新數(shù)據(jù)庫  
}

前端:

$.get("/goods/" + goodsId + "?v=" + version, function(data) {
     // 處理返回結(jié)果
});

總結(jié)

如果要完美解決高并發(fā)場(chǎng)景,需要 從緩存、限流、消息隊(duì)列、數(shù)據(jù)庫擴(kuò)展多方面考慮,而不僅僅是一兩個(gè)技術(shù)就可以。還需要注意系統(tǒng)的穩(wěn)定性、擴(kuò)展性,要足夠靈活與健壯。

到此這篇關(guān)于Java實(shí)現(xiàn)高并發(fā)秒殺的幾種方式的文章就介紹到這了,更多相關(guān)Java 高并發(fā)秒殺內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring boot整合Swagger2的示例代碼

    spring boot整合Swagger2的示例代碼

    Swagger 是一個(gè)規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化RESTful風(fēng)格的 Web 服務(wù)。這篇文章主要介紹了spring boot整合Swagger2,需要的朋友可以參考下
    2017-04-04
  • Java 中的 BufferedWriter 介紹_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java 中的 BufferedWriter 介紹_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    BufferedWriter 是緩沖字符輸出流。它繼承于Writer。接下來通過本文給大家分享Java 中的 BufferedWriter知識(shí),需要的朋友參考下吧
    2017-05-05
  • SpringMVC整合SSM實(shí)現(xiàn)異常處理器詳解

    SpringMVC整合SSM實(shí)現(xiàn)異常處理器詳解

    SpringMVC是一種基于Java,實(shí)現(xiàn)了Web MVC設(shè)計(jì)模式,請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)Web框架,即使用了MVC架構(gòu)模式的思想,將Web層進(jìn)行職責(zé)解耦?;谡?qǐng)求驅(qū)動(dòng)指的就是使用請(qǐng)求-響應(yīng)模型,框架的目的就是幫助我們簡(jiǎn)化開發(fā),SpringMVC也是要簡(jiǎn)化我們?nèi)粘eb開發(fā)
    2022-10-10
  • Spring?Cloud?整合?nacos實(shí)現(xiàn)動(dòng)態(tài)配置中心的詳細(xì)步驟

    Spring?Cloud?整合?nacos實(shí)現(xiàn)動(dòng)態(tài)配置中心的詳細(xì)步驟

    這篇文章主要介紹了Spring?Cloud?整合?nacos?實(shí)現(xiàn)動(dòng)態(tài)配置中心,整合步驟是通過添加依賴新建nacos配置,本文分步驟通過實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2022-10-10
  • Spring boot2X負(fù)載均衡和反向代理實(shí)現(xiàn)過程解析

    Spring boot2X負(fù)載均衡和反向代理實(shí)現(xiàn)過程解析

    這篇文章主要介紹了Spring boot2X負(fù)載均衡和反向代理實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Spring中@ExceptionHandler注解的使用方式

    Spring中@ExceptionHandler注解的使用方式

    這篇文章主要介紹了Spring中@ExceptionHandler注解的使用方式,@ExceptionHandler注解我們一般是用來自定義異常的,可以認(rèn)為它是一個(gè)異常攔截器(處理器),需要的朋友可以參考下
    2024-01-01
  • Jenkins發(fā)送測(cè)試報(bào)告郵件過程詳解

    Jenkins發(fā)送測(cè)試報(bào)告郵件過程詳解

    這篇文章主要介紹了Jenkins發(fā)送測(cè)試報(bào)告郵件過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 深入理解Java String.replace()原理

    深入理解Java String.replace()原理

    String.replace()是我們?nèi)粘i_發(fā)中經(jīng)常用到的一個(gè)方法,那么,你有看過其底層的源碼實(shí)現(xiàn)嗎,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • Java如何使用命令查看內(nèi)存占用情況

    Java如何使用命令查看內(nèi)存占用情況

    jhat是一個(gè)用于分析Java堆轉(zhuǎn)儲(chǔ)文件的工具,通過啟動(dòng)Web服務(wù)器并加載堆轉(zhuǎn)儲(chǔ)文件,可以在瀏覽器中查看占用最多內(nèi)存的類及其詳細(xì)信息
    2025-02-02
  • mybatis實(shí)現(xiàn)增刪改查_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    mybatis實(shí)現(xiàn)增刪改查_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    本文通過實(shí)例代碼給大家介紹了mybatis實(shí)現(xiàn)增刪改查功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-09-09

最新評(píng)論

芦山县| 隆昌县| 阳东县| 鄯善县| 万宁市| 洛浦县| 永年县| 德州市| 临猗县| 浮梁县| 车险| 商洛市| 大化| 兴业县| 西畴县| 璧山县| 济南市| 西乌珠穆沁旗| 光山县| 扶余县| 岳普湖县| 黄梅县| 定兴县| 霍邱县| 鲁甸县| 鄂托克前旗| 溆浦县| 阿合奇县| 龙州县| 静宁县| 博兴县| 彰化市| 霞浦县| 伊川县| 广汉市| 台江县| 兴义市| 邵东县| 阜阳市| 清河县| 阿勒泰市|