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

Java基于redis和mysql實現(xiàn)簡單的秒殺(附demo)

 更新時間:2021年02月07日 10:34:24   作者:JAVA拾貝  
這篇文章主要介紹了Java基于redis和mysql實現(xiàn)簡單的秒殺(附demo),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一.秒殺業(yè)務(wù)分析

       所謂秒殺,就是網(wǎng)絡(luò)賣家發(fā)布一些超低價格的商品,所有買家在同一時間網(wǎng)上搶購的一種銷售方式。秒殺商品通常有兩種限制:時間限制,庫存限制,其中庫存超賣問題是本教程的重點!

秒殺業(yè)務(wù)的運(yùn)行流程主要可以分為以下幾點:

  • 商家提交秒殺商品申請,錄入秒殺商品數(shù)據(jù),主要有:商品標(biāo)題,商品原價,秒殺價格,商品圖片,介紹等信息
  • 運(yùn)營商審核秒殺申請
  • 秒殺頻道首頁列出秒殺商品,點擊秒殺商品圖片可以跳轉(zhuǎn)到秒殺商品詳細(xì)頁面
  • 商品詳細(xì)頁面顯示秒殺商品信息,點擊立即搶購實現(xiàn)秒殺下單,下單時扣減庫存,當(dāng)庫存為0或者不存在活動時間范圍內(nèi)時無法秒殺
  • 秒殺下單成功,直接跳轉(zhuǎn)到支付頁面(掃碼),支付成功,跳轉(zhuǎn)到成功頁面,填寫收貨、電話、收件人等信息,完成訂單。
  • 當(dāng)用戶秒殺下單5分鐘內(nèi)未支付,取消預(yù)訂單,調(diào)用支付的關(guān)閉訂單接口,恢復(fù)庫存。

 二.數(shù)據(jù)庫設(shè)計

商品表:

訂單表:

  三.秒殺實現(xiàn)思路

       秒殺技術(shù)實現(xiàn)核心思想是運(yùn)用緩存減少數(shù)據(jù)庫瞬間的訪問壓力。讀取商品詳細(xì)信息時要運(yùn)用緩存,當(dāng)用戶點擊搶購時也要運(yùn)用緩存,減少緩存中的庫存數(shù)量,當(dāng)庫存數(shù)為0時或活動時間結(jié)束才同步到數(shù)據(jù)庫中。產(chǎn)生的秒殺預(yù)訂單也不會立刻寫到數(shù)據(jù)庫中,而是先寫到緩存,當(dāng)用戶付款成功后再寫入數(shù)據(jù)庫,或者異步寫入MQ,讓數(shù)據(jù)庫根據(jù)自身的能力去消費。

  四.實現(xiàn)關(guān)鍵步驟說明

緩存商品信息,庫存信息

  @Override
  @Transactional(rollbackFor = Exception.class)
  public GoodsEntity initGoods(String name, Integer amount, BigDecimal price) {
    GoodsEntity goodsEntity = new GoodsEntity().setName(name).setAmount(amount).setPrice(price).setStartDate(new Date()).setEndDate(new Date());
    Assert.isTrue(goodsService.save(goodsEntity), "搶購商品初始化發(fā)生異常~");
    // 緩存庫存
    redisTemplate.opsForValue().increment("amount:" + goodsEntity.getId(), amount);
    // 緩存商品信息
    redisTemplate.opsForValue().set("goods:" + goodsEntity.getId(), goodsEntity);
    return goodsEntity;
  }

基于redis incr 原子性防止超賣

  @Override
  @Transactional(rollbackFor = Exception.class)
  public Boolean secKill(String key) {
    Long result = redisTemplate.opsForValue().decrement("amount:" + key, 1);
    if (result.compareTo(0L) >= 0) {
      // 下面的數(shù)據(jù)庫操作建議走M(jìn)Q讓數(shù)據(jù)庫按照他的處理能力,從消息隊列中拿取消息進(jìn)行處理。
      Try.of(() -> {
        Assert.isTrue(goodsService.secKill(Long.valueOf(key)), "庫存不足!");
        OrderEntity orderEntity = new OrderEntity().setGoodsId(Long.valueOf(key)).setOrderNo(UUID.randomUUID().toString().replace("-", ""));
        Assert.isTrue(orderService.save(orderEntity), "訂單創(chuàng)建發(fā)生異常~");
        redisTemplate.opsForValue().set("secKill:" + orderEntity.getId(), orderEntity.getOrderNo(), 10, TimeUnit.SECONDS);
        return true;
      }).onFailure((e) -> {
        log.error("持久化異常:" + e.getMessage());
        redisTemplate.opsForValue().increment("amount:" + key, 1);
      });
      return false;
    }
    redisTemplate.opsForValue().increment("amount:" + key, 1);
    return false;
  }

 最終效果:

觀察redis存儲的數(shù)據(jù)和數(shù)據(jù)庫的訂單記錄可發(fā)現(xiàn),秒殺場景基本實現(xiàn)!

四.總結(jié)

     本文主要解決超賣,和長時間未支付庫存重置的問題; 實際場景,還要考慮前后端的多種優(yōu)化(靜態(tài)頁、cdn、防止重復(fù)下單、限流等等……)

五.完整代碼示例

前往下載

到此這篇關(guān)于Java基于redis和mysql實現(xiàn)簡單的秒殺(附demo)的文章就介紹到這了,更多相關(guān)Java基于redis和mysql秒殺內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實現(xiàn)設(shè)計模式之責(zé)任鏈模式

    Java實現(xiàn)設(shè)計模式之責(zé)任鏈模式

    責(zé)任鏈模式是一種行為設(shè)計模式,允許你將請求沿著處理鏈發(fā)送,然后處理者都可對其進(jìn)行處理,完成后可以再將其傳遞給下一個處理者。下面將會舉例說明什么是責(zé)任鏈模式,責(zé)任鏈模式該如何使用
    2022-08-08
  • Springmvc處理ajax請求并返回json數(shù)據(jù)

    Springmvc處理ajax請求并返回json數(shù)據(jù)

    這篇文章主要介紹了Springmvc處理ajax請求并返回json數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Redisson分布式鎖源碼解析

    Redisson分布式鎖源碼解析

    文章給大家分享了關(guān)于Redisson分布式鎖源碼相關(guān)的知識點內(nèi)容,有興趣的朋友們可以參考學(xué)習(xí)下。
    2018-08-08
  • Spring Data JPA中 in 條件參數(shù)的傳遞方式

    Spring Data JPA中 in 條件參數(shù)的傳遞方式

    這篇文章主要介紹了Spring Data JPA中 in 條件參數(shù)的傳遞方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 使用SpringBoot AOP 記錄操作日志、異常日志的過程

    使用SpringBoot AOP 記錄操作日志、異常日志的過程

    這篇文章主要介紹了使用SpringBoot AOP 記錄操作日志、異常日志的過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • 關(guān)于文件合并與修改md5值的問題

    關(guān)于文件合并與修改md5值的問題

    這篇文章主要介紹了關(guān)于文件合并與修改md5值的問題,使用本博客的方法,不僅僅可以修改md5值,還可以達(dá)到隱藏文件的目的,需要的朋友可以參考下
    2023-04-04
  • Java中JDom解析XML_動力節(jié)點Java學(xué)院整理

    Java中JDom解析XML_動力節(jié)點Java學(xué)院整理

    JDOM是一種解析XML的Java工具包。DOM適合于當(dāng)今流行的各種語言,包括Java,JavaScripte,VB,VBScript,Perl,C,C++等。下面通過本文給大家介紹Java中JDom解析XML的方法,感興趣的朋友一起學(xué)習(xí)吧
    2017-07-07
  • Spring Security實現(xiàn)基于角色的訪問控制框架

    Spring Security實現(xiàn)基于角色的訪問控制框架

    Spring Security是一個功能強(qiáng)大的安全框架,提供了基于角色的訪問控制、身份驗證、授權(quán)等安全功能,可輕松保護(hù)Web應(yīng)用程序的安全,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-04-04
  • Java利用MultipartFile實現(xiàn)上傳多份文件的代碼

    Java利用MultipartFile實現(xiàn)上傳多份文件的代碼

    這篇文章主要介紹了Java利用MultipartFile實現(xiàn)上傳多份文件的代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • java實現(xiàn)批量導(dǎo)入Excel表格數(shù)據(jù)到數(shù)據(jù)庫

    java實現(xiàn)批量導(dǎo)入Excel表格數(shù)據(jù)到數(shù)據(jù)庫

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)批量導(dǎo)入Excel表格數(shù)據(jù)到數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08

最新評論

凭祥市| 天津市| 龙泉市| 濮阳县| 长丰县| 正安县| 池州市| 沙湾县| 林州市| 日土县| 阳朔县| 襄垣县| 虞城县| 墨玉县| 定兴县| 遂平县| 平阳县| 盱眙县| 丹寨县| 江达县| 丰县| 临夏市| 镇远县| 莱州市| 偃师市| 洛扎县| 乐昌市| 安福县| 韩城市| 丹凤县| 鄂温| 仁怀市| 桑植县| 延寿县| 建昌县| 鹤壁市| 平武县| 华安县| 庆元县| 区。| 巧家县|