偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Java高手進(jìn)階:秒殺場(chǎng)景下的庫(kù)存一致性解決方案

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
悲觀鎖機(jī)制通過(guò)鎖定數(shù)據(jù)庫(kù)中的某行數(shù)據(jù),確保在高并發(fā)情況下只有一個(gè)用戶可以修改庫(kù)存。在用戶請(qǐng)求秒殺時(shí),數(shù)據(jù)庫(kù)會(huì)鎖定庫(kù)存行,直到操作完成后才釋放鎖。

秒殺活動(dòng)作為電商平臺(tái)的重要營(yíng)銷手段,對(duì)庫(kù)存管理的精確性提出了極高要求。防止超賣,即確保商品在秒殺過(guò)程中庫(kù)存不會(huì)被過(guò)度消耗,是秒殺功能實(shí)現(xiàn)的關(guān)鍵。本文將探討幾種防止超賣的經(jīng)典方案。

1.悲觀鎖機(jī)制

悲觀鎖機(jī)制通過(guò)鎖定數(shù)據(jù)庫(kù)中的某行數(shù)據(jù),確保在高并發(fā)情況下只有一個(gè)用戶可以修改庫(kù)存。在用戶請(qǐng)求秒殺時(shí),數(shù)據(jù)庫(kù)會(huì)鎖定庫(kù)存行,直到操作完成后才釋放鎖。

優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn):強(qiáng)一致性保障,確保在高并發(fā)下不會(huì)出現(xiàn)超賣問(wèn)題。
  • 缺點(diǎn):鎖的開(kāi)銷較大,容易導(dǎo)致數(shù)據(jù)庫(kù)性能瓶頸。在高并發(fā)場(chǎng)景下,過(guò)多的悲觀鎖可能導(dǎo)致鎖等待和死鎖問(wèn)題。

使用場(chǎng)景適用于對(duì)一致性要求極高,但并發(fā)量相對(duì)較小的場(chǎng)景。

Demo

@Mapper
public interface ProductMapper {
    @Select("SELECT stock FROM products WHERE product_id = #{productId} FOR UPDATE")
    Integer selectStockForUpdate(@Param("productId") int productId);
    @Update("UPDATE products SET stock = stock - 1 WHERE product_id = #{productId}")
    int updateStock(@Param("productId") int productId);
}
@Service
public class ProductService {
    @Autowired
    private ProductMapper productMapper;
    @Transactional
    public boolean seckill(int productId) {
        Integer stock = productMapper.selectStockForUpdate(productId);
        if (stock != null && stock > 0) {
            productMapper.updateStock(productId);
            return true; // 秒殺成功
        } else {
            return false; // 庫(kù)存不足
        }
    }
}

2.樂(lè)觀鎖機(jī)制

樂(lè)觀鎖通常通過(guò)“版本號(hào)”機(jī)制來(lái)實(shí)現(xiàn)。在庫(kù)存表中增加一個(gè)version字段,每次更新庫(kù)存時(shí),檢查version是否與上次讀取的一致,如果一致則更新庫(kù)存和version,如果不一致則說(shuō)明庫(kù)存已經(jīng)被其他用戶修改過(guò),需要重新嘗試。

優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn):無(wú)需鎖表,對(duì)數(shù)據(jù)庫(kù)性能影響較小,適合中小規(guī)模并發(fā)。
  • 缺點(diǎn):并發(fā)過(guò)高時(shí)可能導(dǎo)致更新失敗頻繁,用戶體驗(yàn)下降。在高并發(fā)場(chǎng)景下,樂(lè)觀鎖可能導(dǎo)致大量重試,增加系統(tǒng)負(fù)擔(dān)。

使用場(chǎng)景適合于高并發(fā)但沖突不頻繁的場(chǎng)景。

Demo

// 假設(shè)有一個(gè)Product實(shí)體類,包含stock和version字段
// 在Service層進(jìn)行庫(kù)存更新操作
@Service
public class ProductService {
    @Autowired
    private ProductMapper productMapper;
    @Transactional
    public boolean updateStock(int productId, int version) {
        Product product = productMapper.selectByPrimaryKey(productId);
        if (product.getVersion() != version) {
            return false; // 版本不匹配,更新失敗
        }
        product.setStock(product.getStock() - 1);
        product.setVersion(product.getVersion() + 1);
        productMapper.updateByPrimaryKey(product);
        return true; // 更新成功
    }
}

3.分布式鎖

分布式鎖可以確保在多臺(tái)服務(wù)器上并發(fā)處理庫(kù)存時(shí)不會(huì)導(dǎo)致超賣。常用Redis來(lái)實(shí)現(xiàn)分布式鎖。當(dāng)用戶請(qǐng)求秒殺時(shí),先嘗試通過(guò)Redis獲得鎖,如果獲得鎖則執(zhí)行扣減庫(kù)存操作,并釋放鎖;如果未獲得鎖則等待或重試。

優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn):適合大規(guī)模并發(fā)場(chǎng)景,鎖機(jī)制能夠確保多臺(tái)服務(wù)器在并發(fā)情況下安全修改庫(kù)存。
  • 缺點(diǎn):如果Redis出現(xiàn)故障,可能會(huì)影響鎖的管理和庫(kù)存的正確性。鎖的粒度要控制好,鎖的過(guò)大可能影響性能。在高并發(fā)場(chǎng)景下,分布式鎖可能導(dǎo)致網(wǎng)絡(luò)延遲和鎖競(jìng)爭(zhēng)問(wèn)題。

使用場(chǎng)景適用于高并發(fā)場(chǎng)景,特別是多臺(tái)服務(wù)器分布式部署時(shí),對(duì)一致性要求較高。

Demo

@Service
public class SeckillService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    public boolean seckill(int productId) {
        String lockKey = "lock:product:" + productId;
        boolean lock = redisTemplate.opsForValue().setIfAbsent(lockKey, "locked", 5, TimeUnit.SECONDS);
        if (lock) {
            try {
                String stockKey = "stock:" + productId;
                Integer stock = (Integer) redisTemplate.opsForValue().get(stockKey);
                if (stock != null && stock > 0) {
                    redisTemplate.opsForValue().decrement(stockKey);
                    return true; // 秒殺成功
                } else {
                    return false; // 庫(kù)存不足
                }
            } finally {
                redisTemplate.delete(lockKey); // 釋放鎖
            }
        } else {
            return false; // 秒殺失敗,未獲得鎖
        }
    }
}

4.庫(kù)存預(yù)減+異步處理

在用戶請(qǐng)求秒殺時(shí),使用緩存進(jìn)行庫(kù)存預(yù)減(即在用戶下單前就先減少庫(kù)存),然后通過(guò)異步隊(duì)列(如Kafka或RabbitMQ)將訂單請(qǐng)求發(fā)往后端進(jìn)行異步處理。商品秒殺開(kāi)始前,將商品庫(kù)存預(yù)先加載到Redis。當(dāng)用戶請(qǐng)求秒殺時(shí),先從Redis中預(yù)減庫(kù)存,將請(qǐng)求通過(guò)消息隊(duì)列發(fā)送到后端進(jìn)行訂單處理和庫(kù)存的最終確認(rèn)。如果訂單處理失?。ㄈ缰Ц妒〉龋?,則通過(guò)異步任務(wù)將Redis中的庫(kù)存回補(bǔ)。

優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn):使用緩存大幅減少數(shù)據(jù)庫(kù)壓力,適合大規(guī)模并發(fā)場(chǎng)景。削峰填谷,利用消息隊(duì)列將訂單處理異步化,緩解高并發(fā)對(duì)數(shù)據(jù)庫(kù)的沖擊。
  • 缺點(diǎn):需要處理訂單失敗后的庫(kù)存回補(bǔ),增加了系統(tǒng)復(fù)雜性。在極端情況下可能出現(xiàn)Redis庫(kù)存與數(shù)據(jù)庫(kù)庫(kù)存不一致的問(wèn)題,需要通過(guò)補(bǔ)償機(jī)制來(lái)解決。同時(shí),對(duì)緩存的可靠性和一致性要求較高。

使用場(chǎng)景適用于高并發(fā)場(chǎng)景,特別是需要減輕數(shù)據(jù)庫(kù)壓力時(shí),對(duì)性能要求較高,但對(duì)一致性要求可以容忍一定延遲的場(chǎng)景。

Demo(僅展示庫(kù)存預(yù)減部分,異步處理部分需結(jié)合消息隊(duì)列實(shí)現(xiàn)):

@Service
public class SeckillService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    public boolean preDecreaseStock(int productId) {
        String stockKey = "stock:" + productId;
        Integer stock = (Integer) redisTemplate.opsForValue().get(stockKey);
        if (stock != null && stock > 0) {
            redisTemplate.opsForValue().decrement(stockKey);
            return true; // 庫(kù)存預(yù)減成功
        } else {
            return false; // 庫(kù)存不足
        }
    }
}

5.小結(jié)

以上四種方案各有優(yōu)劣,選擇合適的方法取決于業(yè)務(wù)需求和技術(shù)棧。在實(shí)際應(yīng)用中,可以根據(jù)并發(fā)量、系統(tǒng)性能要求、一致性需求等因素綜合考慮選擇合適的方案。

責(zé)任編輯:武曉燕 來(lái)源: JAVA充電
相關(guān)推薦

2023-05-09 10:59:33

緩存技術(shù)派MySQL

2021-06-06 12:45:41

分布式CAPBASE

2010-05-24 11:35:11

WCDMA

2023-06-29 08:00:59

redis數(shù)據(jù)MySQL

2024-10-08 10:10:00

削峰高并發(fā)流量

2023-06-07 08:10:29

2021-01-21 07:34:16

分布式系統(tǒng)場(chǎng)景

2023-11-01 10:11:00

Java分布式

2017-07-25 14:38:56

數(shù)據(jù)庫(kù)一致性非鎖定讀一致性鎖定讀

2020-11-02 07:09:24

緩存服務(wù)器異構(gòu)

2022-08-29 08:38:00

事務(wù)一致性

2022-12-14 08:23:30

2025-03-27 03:00:00

2021-02-05 08:00:48

哈希算法?機(jī)器

2023-08-01 07:42:33

Redis數(shù)據(jù)項(xiàng)目

2021-02-02 12:40:50

哈希算法數(shù)據(jù)

2025-06-19 02:15:00

2021-02-04 06:30:26

Python編程語(yǔ)言

2022-03-11 21:35:57

Java程序線程

2024-12-11 09:16:38

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)