国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

秒殺系統(tǒng)的業(yè)務(wù)流程以及優(yōu)化方案(實現(xiàn)異步秒殺)

這篇具有很好參考價值的文章主要介紹了秒殺系統(tǒng)的業(yè)務(wù)流程以及優(yōu)化方案(實現(xiàn)異步秒殺)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

先看基本的業(yè)務(wù)流程

秒殺系統(tǒng)的業(yè)務(wù)流程以及優(yōu)化方案(實現(xiàn)異步秒殺),redis,分布式項目調(diào)優(yōu),junit,redis,性能優(yōu)化

?那么我們可以看到整個流程都是一個線程來完成的,這樣的話耗時還是很長的,那么可不可以采用多線程去實現(xiàn)呢?

首先我們要思考怎么對業(yè)務(wù)進行拆分,可以想象一個我們?nèi)ワ埖挈c餐,會有前臺接待,詢問訂單,之后將小票傳給后廚去做飯,這樣就會快很多,也可以接待更多的客人

也就是說 一個線程負責去讀數(shù)據(jù)庫做準備工作,另一個線程去實現(xiàn)寫操作,如下圖中所示:

秒殺系統(tǒng)的業(yè)務(wù)流程以及優(yōu)化方案(實現(xiàn)異步秒殺),redis,分布式項目調(diào)優(yōu),junit,redis,性能優(yōu)化

? ? 確定了我們可以將判斷庫存和檢驗一人一單業(yè)務(wù)抽取出來之后,我們在想一下 還能不能優(yōu)化,這個時候我們會發(fā)現(xiàn),這兩個操作還是在數(shù)據(jù)庫進行的,那么mysql的并發(fā)本身也是不高的,現(xiàn)在我們就要通過另一個性能更好的數(shù)據(jù)庫進行實現(xiàn),就是redis

秒殺系統(tǒng)的業(yè)務(wù)流程以及優(yōu)化方案(實現(xiàn)異步秒殺),redis,分布式項目調(diào)優(yōu),junit,redis,性能優(yōu)化? ? ?

?這樣只需要業(yè)務(wù)進行到校驗完成就可以給用戶返回下單完成的信息,之后在通過另一個線程異步進行扣減庫存操作

redis中實現(xiàn)上面兩個操作的業(yè)務(wù)流程如下:

秒殺系統(tǒng)的業(yè)務(wù)流程以及優(yōu)化方案(實現(xiàn)異步秒殺),redis,分布式項目調(diào)優(yōu),junit,redis,性能優(yōu)化

?由于操作流程較長,應(yīng)該使用lua腳本來保證原子性

將上面的邏輯采用lua腳本進行編寫,之后程序運行首先判斷返回值如果是0就說明用戶有下單資格,如果是1或者2就說明用戶沒有資格下單

如果有下單資格就可以將用戶id,優(yōu)惠券id,和訂單id存入一個阻塞隊列里面,之后異步進行寫入數(shù)據(jù)庫操作

整體流程:

秒殺系統(tǒng)的業(yè)務(wù)流程以及優(yōu)化方案(實現(xiàn)異步秒殺),redis,分布式項目調(diào)優(yōu),junit,redis,性能優(yōu)化

提供lua腳本代碼

-- 1.參數(shù)列表
-- 1.1.優(yōu)惠券id
local voucherId = ARGV[1]
-- 1.2.用戶id
local userId = ARGV[2]
-- 1.3.訂單id
local orderId = ARGV[3]

-- 2.數(shù)據(jù)key
-- 2.1.庫存key
local stockKey = 'seckill:stock:' .. voucherId
-- 2.2.訂單key
local orderKey = 'seckill:order:' .. voucherId

-- 3.腳本業(yè)務(wù)
-- 3.1.判斷庫存是否充足 get stockKey
if(tonumber(redis.call('get', stockKey)) <= 0) then
    -- 3.2.庫存不足,返回1
    return 1
end
-- 3.2.判斷用戶是否下單 SISMEMBER orderKey userId
if(redis.call('sismember', orderKey, userId) == 1) then
    -- 3.3.存在,說明是重復(fù)下單,返回2
    return 2
end
-- 3.4.扣庫存 incrby stockKey -1
redis.call('incrby', stockKey, -1)
-- 3.5.下單(保存用戶)sadd orderKey userId
redis.call('sadd', orderKey, userId)
-- 3.6.發(fā)送消息到隊列中, XADD stream.orders * k1 v1 k2 v2 ...
redis.call('xadd', 'stream.orders', '*', 'userId', userId, 'voucherId', voucherId, 'id', orderId)
return 0

使用方式

    private static final DefaultRedisScript<Long> SECKILL_SCRIPT;

    static {
        SECKILL_SCRIPT = new DefaultRedisScript<>();
        SECKILL_SCRIPT.setLocation(new ClassPathResource("seckill.lua"));
        SECKILL_SCRIPT.setResultType(Long.class);
    }
  @Override
    public Result seckillVoucher(Long voucherId) {
        Long userId = UserHolder.getUser().getId();
        long orderId = redisIdWorker.nextId("order");
        // 1.執(zhí)行l(wèi)ua腳本
        Long result = stringRedisTemplate.execute(
                SECKILL_SCRIPT,
                Collections.emptyList(),
                voucherId.toString(), userId.toString(), String.valueOf(orderId)
        );
        int r = result.intValue();
        // 2.判斷結(jié)果是否為0
        if (r != 0) {
            // 2.1.不為0 ,代表沒有購買資格
            return Result.fail(r == 1 ? "庫存不足" : "不能重復(fù)下單");
        }
        // 3.返回訂單id
        return Result.ok(orderId);
    }

?redis的流程到此就完結(jié)了,接下來就是使用阻塞隊列存儲要進行寫操作的信息

阻塞隊列的實現(xiàn)方式通常是使用一個先進先出的隊列來存儲元素,同時使用鎖來實現(xiàn)線程安全。當隊列為空時,put()方法會被阻塞,直到有元素被添加到隊列中;當隊列滿時,put()方法同樣會被阻塞,直到隊列中有元素被移除。

阻塞隊列通常用于生產(chǎn)者-消費者模型中,生產(chǎn)者將元素添加到隊列中,消費者從隊列中取出元素進行處理。通過使用阻塞隊列,可以避免生產(chǎn)者和消費者之間的直接交互,從而簡化了代碼的設(shè)計和維護。

首先我們可以可以使用java自帶的阻塞隊列實現(xiàn),提供一個樣例:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class ProducerConsumerExample {
    public static void main(String[] args) {
        BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10); // 創(chuàng)建一個容量為10的阻塞隊列

        Thread producer = new Thread(new Producer(queue));
        Thread consumer = new Thread(new Consumer(queue));

        producer.start();
        consumer.start();
    }
}

class Producer implements Runnable {
    private BlockingQueue<Integer> queue;

    public Producer(BlockingQueue<Integer> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            try {
                System.out.println("Producing " + i);
                queue.put(i); // 將元素添加到隊列中
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class Consumer implements Runnable {
    private BlockingQueue<Integer> queue;

    public Consumer(BlockingQueue<Integer> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        while (true) {
            try {
                Integer item = queue.take(); // 從隊列中取出元素進行處理
                System.out.println("Consuming " + item);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

當然如果想要性能更好的話,我們可以采用消息隊列來做文章來源地址http://www.zghlxwxcb.cn/news/detail-672797.html

到了這里,關(guān)于秒殺系統(tǒng)的業(yè)務(wù)流程以及優(yōu)化方案(實現(xiàn)異步秒殺)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 企業(yè)內(nèi)業(yè)務(wù)系統(tǒng)與Activiti流程引擎的結(jié)合(五)

    書接上回 Activiti流程接口中臺 接口實現(xiàn) 查詢指定人員辦理過的任務(wù) /task/user/{userNo}/hiProcinst 查詢 activiti 相關(guān)表 請求參數(shù) 返回參數(shù)

    2024年02月13日
    瀏覽(20)
  • 企業(yè)內(nèi)業(yè)務(wù)系統(tǒng)與Activiti流程引擎的結(jié)合(一)

    Activiti流程接口中臺 此模塊分以下幾部分: 一、數(shù)據(jù)庫表設(shè)計 二、后臺接口設(shè)計 系統(tǒng)使用的Activiti版本? 一、初始化的數(shù)據(jù)庫表 1. Activiti 涉及25張表 ACT_EVT_LOG? ? ? ? ? ? ? ? ? ? ? ? 事件日志 ACT_GE_BYTEARRAY? ? ? ? ? ? 部署流程的資源(bpmn、圖片) ACT_GE_PROPERTY? ? ? ? ? ?

    2023年04月12日
    瀏覽(21)
  • 基于若依的ruoyi-nbcio流程管理系統(tǒng)自定義業(yè)務(wù)撤回功能的修復(fù)

    更多ruoyi-nbcio功能請看演示系統(tǒng) gitee源代碼地址 前后端代碼: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后臺管理系統(tǒng) 更多nbcio-boot功能請看演示系統(tǒng) gitee源代碼地址 后端代碼: https://gitee.com/nbacheng/nbcio-boot 前端代碼:https://gitee.com/nbacheng/nbcio-vue.git 在線演示(包括H

    2024年01月18日
    瀏覽(31)
  • 基于若依的ruoyi-nbcio流程管理系統(tǒng)修復(fù)自定義業(yè)務(wù)表單的收回功能

    更多ruoyi-nbcio功能請看演示系統(tǒng) gitee源代碼地址 前后端代碼: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后臺管理系統(tǒng) 更多nbcio-boot功能請看演示系統(tǒng) gitee源代碼地址 后端代碼: https://gitee.com/nbacheng/nbcio-boot 前端代碼:https://gitee.com/nbacheng/nbcio-vue.git 在線演示(包括H

    2024年01月18日
    瀏覽(23)
  • 使用Golang實現(xiàn)一套流程可配置,適用于廣告、推薦系統(tǒng)的業(yè)務(wù)性框架——簡單應(yīng)用

    使用Golang實現(xiàn)一套流程可配置,適用于廣告、推薦系統(tǒng)的業(yè)務(wù)性框架——簡單應(yīng)用

    在諸如廣告、推薦等系統(tǒng)中,我們往往會涉及過濾、召回和排序等過程。隨著系統(tǒng)業(yè)務(wù)變得復(fù)雜,代碼的耦合和交錯會讓項目跌入難以維護的深淵。于是模塊化設(shè)計是復(fù)雜系統(tǒng)的必備基礎(chǔ)。這篇文章介紹的業(yè)務(wù)框架脫胎于線上多人協(xié)作開發(fā)、高并發(fā)的競價廣告系統(tǒng),在實踐中

    2024年02月14日
    瀏覽(23)
  • 業(yè)務(wù)流程測試

    主要問題存在于 : 1、測試點分析:邏輯性不強 2、測試用例:關(guān)于,要細致到什么程度,不太明確 3、測試用例設(shè)計時是依據(jù)需求說明書還是系統(tǒng)? 流程規(guī)范的公司,一定是基于需求說明書(或原型圖)來設(shè)計測試用例 進入項目的時間節(jié)點來看 項目初期介入,依據(jù) 需求 說

    2023年04月11日
    瀏覽(20)
  • 安全策略與業(yè)務(wù)需求不匹配:安全規(guī)則與業(yè)務(wù)流程的優(yōu)先級不一致

    安全策略與業(yè)務(wù)需求不匹配:安全規(guī)則與業(yè)務(wù)流程的優(yōu)先級不一致

    隨著網(wǎng)絡(luò)攻擊手段層出不窮、黑客技術(shù)的日益升級和網(wǎng)絡(luò)安全法規(guī)的日益嚴格化,企業(yè)在保障信息安全的同時也面臨著越來越大的壓力和挑戰(zhàn)。其中一個突出的問題是**安全策略與業(yè)務(wù)需求的不匹配問題**。這主要表現(xiàn)為安全規(guī)則的制定與企業(yè)日常的業(yè)務(wù)流程存在很大的差異和

    2024年01月21日
    瀏覽(59)
  • 業(yè)務(wù)流程自動化:ThinkAutomation Professional Crack

    業(yè)務(wù)流程自動化:ThinkAutomation Professional Crack

    ThinkAutomation 助力您的業(yè)務(wù)流程自動化。自動執(zhí)行本地和基于云的業(yè)務(wù)流程,以降低成本并節(jié)省時間。 自動化傳入的通信渠道,監(jiān)控數(shù)據(jù)庫,對傳入的Webhook,Web表單和聊天機器人做出反應(yīng)。處理文檔、附件、本地文件和其他郵件源。 從傳入消息中解析和提取數(shù)據(jù)并執(zhí)行業(yè)務(wù)流

    2024年02月09日
    瀏覽(28)
  • AI智能語音機器人的基本業(yè)務(wù)流程

    AI智能語音機器人的基本業(yè)務(wù)流程

    先畫個圖,了解下AI語音機器人的基本業(yè)務(wù)流程。 上圖是一個AI語音機器人的業(yè)務(wù)流程,簡單來說就是首先要配置話術(shù),就是告訴機器人在遇到問題該怎么回答,這個不同公司不同行業(yè)的差別比較大,所以一般每個客戶都會配置其個性化的話術(shù)。 話術(shù)配置完成后,需要給賬號

    2024年02月12日
    瀏覽(29)
  • 尚上優(yōu)選社區(qū)團購業(yè)務(wù)流程及微服務(wù)技術(shù)實現(xiàn)

    尚上優(yōu)選社區(qū)團購業(yè)務(wù)流程及微服務(wù)技術(shù)實現(xiàn)

    尚上優(yōu)選是一家社區(qū)電商項目,采用“當日下單+次日送達+門店自提”的模式,圍繞社區(qū)居民日常生活所需,滿足不同用戶的差異化需求,通過完善的 倉儲配送體系,以便捷的方式和舒心的服務(wù)提升了每一個普通家庭的消費體驗。 掌握社區(qū)團購業(yè)務(wù)流程及實現(xiàn)方式 掌握Spri

    2024年02月10日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包