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

秒殺系統(tǒng)常見(jiàn)問(wèn)題—庫(kù)存超賣

這篇具有很好參考價(jià)值的文章主要介紹了秒殺系統(tǒng)常見(jiàn)問(wèn)題—庫(kù)存超賣。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

大家好!我是sum墨,一個(gè)一線的底層碼農(nóng),平時(shí)喜歡研究和思考一些技術(shù)相關(guān)的問(wèn)題并整理成文,限于本人水平,如果文章和代碼有表述不當(dāng)之處,還請(qǐng)不吝賜教。

以下是正文!

先看問(wèn)題

首先上一串代碼

public String buy(Long goodsId, Integer goodsNum) {
    //查詢商品庫(kù)存
    Goods goods = goodsMapper.selectById(goodsId);
    //如果當(dāng)前庫(kù)存為0,提示商品已經(jīng)賣光了
    if (goods.getGoodsInventory() <= 0) {
        return "商品已經(jīng)賣光了!";
    }
    //如果當(dāng)前購(gòu)買數(shù)量大于庫(kù)存,提示庫(kù)存不足
    if (goodsNum > goods.getGoodsInventory()) {
        return "庫(kù)存不足!";
    }
    //更新庫(kù)存
    goods.setGoodsInventory(goods.getGoodsInventory() - goodsNum);
    goodsMapper.updateById(goods);
    return "購(gòu)買成功!";
}

我們看一下這串代碼,邏輯用流程圖表示如下:

秒殺系統(tǒng)常見(jiàn)問(wèn)題—庫(kù)存超賣
從圖上看,邏輯還是很清晰明了的,而且單測(cè)的話,也測(cè)試不出來(lái)什么bug。但是在秒殺場(chǎng)景下,問(wèn)題可就大發(fā)了,100件商品可能賣出1000單,出現(xiàn)超賣問(wèn)題,這下就真的需要?dú)€(gè)程序員祭天了。

問(wèn)題分析

正常情況下,如果請(qǐng)求是一個(gè)一個(gè)接著來(lái)的話,這串代碼也不會(huì)有問(wèn)題,如下圖:

秒殺系統(tǒng)常見(jiàn)問(wèn)題—庫(kù)存超賣

不同的時(shí)刻不同的請(qǐng)求,每次拿到的商品庫(kù)存都是更新過(guò)之后的,邏輯是ok的。

那為啥會(huì)出現(xiàn)超賣問(wèn)題呢?
首先我們給這串代碼增加一個(gè)場(chǎng)景:商品秒殺(非秒殺場(chǎng)景難以復(fù)現(xiàn)超賣問(wèn)題)。
秒殺場(chǎng)景的特點(diǎn)如下:

  • 高并發(fā)處理:秒殺場(chǎng)景下,可能會(huì)有大量的購(gòu)物者同時(shí)涌入系統(tǒng),因此需要具備高并發(fā)處理能力,保證系統(tǒng)能夠承受高并發(fā)訪問(wèn),并提供快速的響應(yīng)。
  • 快速響應(yīng):秒殺場(chǎng)景下,由于時(shí)間限制和競(jìng)爭(zhēng)激烈,需要系統(tǒng)能夠快速響應(yīng)購(gòu)物者的請(qǐng)求,否則可能會(huì)導(dǎo)致購(gòu)買失敗,影響購(gòu)物者的購(gòu)物體驗(yàn)。
  • 分布式系統(tǒng): 秒殺場(chǎng)景下,單臺(tái)服務(wù)器扛不住請(qǐng)求高峰,分布式系統(tǒng)可以提高系統(tǒng)的容錯(cuò)能力和抗壓能力,非常適合秒殺場(chǎng)景。

在這種場(chǎng)景下,請(qǐng)求不可能是一個(gè)接一個(gè)這種,而是成千上萬(wàn)個(gè)請(qǐng)求同時(shí)打過(guò)來(lái),那么就會(huì)出現(xiàn)多個(gè)請(qǐng)求在同一時(shí)刻查詢庫(kù)存,如下圖:

秒殺系統(tǒng)常見(jiàn)問(wèn)題—庫(kù)存超賣

如果在同一時(shí)刻查詢商品庫(kù)存表,那么得到的商品庫(kù)存也肯定是相同的,判斷的邏輯也是相同的。

舉個(gè)例子,現(xiàn)在商品的庫(kù)存是10件,請(qǐng)求1買6件,請(qǐng)求2買5件,由于兩次請(qǐng)求查詢到的庫(kù)存都是10,肯定是可以賣的。
但是真實(shí)情況是5+6=11>10,明顯有問(wèn)題好吧!這兩筆請(qǐng)求必然有一筆失敗才是對(duì)的!

那么,這種問(wèn)題怎么解決呢?

問(wèn)題解決

從上面例子來(lái)看,問(wèn)題好像是由于我們每次拿到的庫(kù)存都是一樣的,才導(dǎo)致庫(kù)存超賣問(wèn)題,那是不是只要保證每次拿到的庫(kù)存都是最新的話,這個(gè)問(wèn)題不就迎刃而解了嗎!

在說(shuō)方案前,先把我的測(cè)試表結(jié)構(gòu)貼出來(lái):

CREATE TABLE `t_goods` (
  `id` bigint NOT NULL COMMENT '物理主鍵',
  `goods_name` varchar(64) DEFAULT NULL COMMENT '商品名稱',
  `goods_pic` varchar(255) DEFAULT NULL COMMENT '商品圖片',
  `goods_desc` varchar(255) DEFAULT NULL COMMENT '商品描述信息',
  `goods_inventory` int DEFAULT NULL COMMENT '商品庫(kù)存',
  `goods_price` decimal(10,2) DEFAULT NULL COMMENT '商品價(jià)格',
  `create_time` datetime DEFAULT NULL COMMENT '創(chuàng)建時(shí)間',
  `update_time` datetime DEFAULT NULL COMMENT '更新時(shí)間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

方法一、redis分布式鎖

Redisson介紹

官方介紹:Redisson是一個(gè)基于Redis的Java駐留內(nèi)存數(shù)據(jù)網(wǎng)格(In-Memory Data Grid)。它封裝了Redis客戶端API,并提供了一個(gè)分布式鎖、分布式集合、分布式對(duì)象、分布式Map等常用的數(shù)據(jù)結(jié)構(gòu)和服務(wù)。Redisson支持Java 6以上版本和Redis 2.6以上版本,并且采用編解碼器和序列化器來(lái)支持任何對(duì)象類型。 Redisson還提供了一些高級(jí)功能,比如異步API和響應(yīng)式流式API。它可以在分布式系統(tǒng)中被用來(lái)實(shí)現(xiàn)高可用性、高性能、高可擴(kuò)展性的數(shù)據(jù)處理。

Redisson使用

引入

<!--使用redisson作為分布式鎖-->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.16.8</version>
</dependency>

注入對(duì)象

RedissonConfig.java

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RedissonConfig {
    /**
     * 所有對(duì)Redisson的使用都是通過(guò)RedissonClient對(duì)象
     *
     * @return
     */
    @Bean(destroyMethod = "shutdown")
    public RedissonClient redissonClient() {
        // 創(chuàng)建配置 指定redis地址及節(jié)點(diǎn)信息
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("123456");

        // 根據(jù)config創(chuàng)建出RedissonClient實(shí)例
        RedissonClient redissonClient = Redisson.create(config);
        return redissonClient;

    }
}

代碼優(yōu)化

public String buyRedisLock(Long goodsId, Integer goodsNum) {
    RLock lock = redissonClient.getLock("goods_buy");
    try {
        //加分布式鎖
        lock.lock();
        //查詢商品庫(kù)存
        Goods goods = goodsMapper.selectById(goodsId);
        //如果當(dāng)前庫(kù)存為0,提示商品已經(jīng)賣光了
        if (goods.getGoodsInventory() <= 0) {
                return "商品已經(jīng)賣光了!";
        }
        //如果當(dāng)前購(gòu)買數(shù)量大于庫(kù)存,提示庫(kù)存不足
        if (goodsNum > goods.getGoodsInventory()) {
                return "庫(kù)存不足!";
        }
        //更新庫(kù)存
        goods.setGoodsInventory(goods.getGoodsInventory() - goodsNum);
        goodsMapper.updateById(goods);
        return "購(gòu)買成功!";
    } catch (Exception e) {
        log.error("秒殺失敗");
    } finally {
        lock.unlock();
    }
    return "購(gòu)買失敗";
}

加上Redisson分布式鎖之后,使得請(qǐng)求由異步變?yōu)橥剑屬?gòu)買操作一個(gè)一個(gè)進(jìn)行,解決了庫(kù)存超賣問(wèn)題,但是會(huì)讓用戶等待的時(shí)間加長(zhǎng),影響了用戶體驗(yàn)。

方法二、MySQL的行鎖

行鎖介紹

MySQL的行鎖是一種針對(duì)行級(jí)別數(shù)據(jù)的鎖,它可以鎖定某個(gè)表中的某一行數(shù)據(jù),以保證在鎖定期間,其他事務(wù)無(wú)法修改該行數(shù)據(jù),從而保證數(shù)據(jù)的一致性和完整性。
特點(diǎn)如下:

  • MySQL的行鎖只能在InnoDB存儲(chǔ)引擎中使用。
  • 行鎖需要有索引才能實(shí)現(xiàn),否則會(huì)自動(dòng)鎖定整張表。
  • 可以通過(guò)使用“SELECT ... FOR UPDATE”和“SELECT ... LOCK IN SHARE MODE”語(yǔ)句來(lái)顯式地使用行鎖。

總之,行鎖可以有效地保證數(shù)據(jù)的一致性和完整性,但是過(guò)多的行鎖也會(huì)導(dǎo)致性能問(wèn)題,因此在使用行鎖時(shí)需要謹(jǐn)慎考慮,避免出現(xiàn)性能瓶頸。

那么回到庫(kù)存超賣這個(gè)問(wèn)題上來(lái),我們可以在一開(kāi)始查詢商品庫(kù)存的時(shí)候增加一個(gè)行鎖,實(shí)現(xiàn)非常簡(jiǎn)單,也就是將

 //查詢商品庫(kù)存
Goods goods = goodsMapper.selectById(goodsId);

原始查詢SQL
SELECT *
  FROM t_goods
  WHERE id = #{goodsId}

改寫為
 SELECT *
  FROM t_goods
  WHERE id = #{goodsId} for update

那么被查詢到的這行商品庫(kù)存信息就會(huì)被鎖住,其他請(qǐng)求想要讀取這行數(shù)據(jù)時(shí)就需要等待當(dāng)前請(qǐng)求結(jié)束了,這樣就做到了每次查詢庫(kù)存都是最新的。不過(guò)同Redisson分布式鎖一樣,會(huì)讓用戶等待的時(shí)間加長(zhǎng),影響用戶體驗(yàn)。

方法三、樂(lè)觀鎖

樂(lè)觀鎖機(jī)制類似java中的cas機(jī)制,在查詢數(shù)據(jù)的時(shí)候不加鎖,只有更新數(shù)據(jù)的時(shí)候才比對(duì)數(shù)據(jù)是否已經(jīng)發(fā)生過(guò)改變,沒(méi)有改變則執(zhí)行更新操作,已經(jīng)改變了則進(jìn)行重試。

商品表增加version字段并初始化數(shù)據(jù)為0

`version` int(11) DEFAULT NULL COMMENT '版本'

將更新SQL修改如下

update t_goods
set goods_inventory = goods_inventory - #{goodsNum},
     version         = version + 1
where id = #{goodsId}
and version = #{version}

Java代碼修改如下

public String buyVersion(Long goodsId, Integer goodsNum) {
    //查詢商品庫(kù)存(該語(yǔ)句使用了行鎖)
    Goods goods = goodsMapper.selectById(goodsId);
    //如果當(dāng)前庫(kù)存為0,提示商品已經(jīng)賣光了
    if (goods.getGoodsInventory() <= 0) {
        return "商品已經(jīng)賣光了!";
    }
    if (goodsMapper.updateInventoryAndVersion(goodsId, goodsNum, goods.getVersion()) > 0) {
      return "購(gòu)買成功!";
    }
    return "庫(kù)存不足!";
}

通過(guò)增加了版本號(hào)的控制,在扣減庫(kù)存的時(shí)候在where條件進(jìn)行版本號(hào)的比對(duì)。實(shí)現(xiàn)查詢的是哪一條記錄,那么就要求更新的是哪一條記錄,在查詢到更新的過(guò)程中版本號(hào)不能變動(dòng),否則更新失敗。

方法四、where條件和unsigned 非負(fù)字段限制

前面的兩種辦法是通過(guò)每次都拿到最新的庫(kù)存從而解決超賣問(wèn)題,那換一種思路:保證在扣除庫(kù)存的時(shí)候,庫(kù)存一定大于購(gòu)買量是不是也可以解決這個(gè)問(wèn)題呢?
答案是可以的?;氐缴厦娴拇a:

 //更新庫(kù)存
goods.setGoodsInventory(goods.getGoodsInventory() - goodsNum);
goodsMapper.updateById(goods);

我們把庫(kù)存的扣減寫在了代碼中,這樣肯定是不行的,因?yàn)樵诜植际较到y(tǒng)中我們獲取到的庫(kù)存可能都是一樣的,應(yīng)該把庫(kù)存的扣減邏輯放到SQL中,即:

 update t_goods
 set goods_inventory = goods_inventory - #{goodsNum}
 where id = #{goodsId}

上面的SQL保證了每次獲取的庫(kù)存都是取數(shù)據(jù)庫(kù)的庫(kù)存,不過(guò)我們還需要加一個(gè)判斷:保證庫(kù)存大于購(gòu)買量,即:

update t_goods
set goods_inventory = goods_inventory - #{goodsNum}
where id = #{goodsId}
AND (goods_inventory - #{goodsNum}) >= 0

那么上面那段Java代碼也需修改一下:

public String buySqlUpdate(Long goodsId, Integer goodsNum) {
    //查詢商品庫(kù)存(該語(yǔ)句使用了行鎖)
    Goods goods = goodsMapper.queryById(goodsId);
    //如果當(dāng)前庫(kù)存為0,提示商品已經(jīng)賣光了
    if (goods.getGoodsInventory() <= 0) {
        return "商品已經(jīng)賣光了!";
    }
    //此處需要判斷更新操作是否成功
    if (goodsMapper.updateInventory(goodsId, goodsNum) > 0) {
        return "購(gòu)買成功!";
     }
    return "庫(kù)存不足!";
}

還有一種辦法和where條件一樣,就是unsigned 非負(fù)字段限制,把庫(kù)存字段設(shè)置為unsigned 非負(fù)字段類型,那么在扣減時(shí)也不會(huì)出現(xiàn)扣成負(fù)數(shù)的情況。

總結(jié)一下

解決方案 優(yōu)點(diǎn) 缺點(diǎn)
redis分布式鎖 Redis分布式鎖可以解決分布式場(chǎng)景下的鎖問(wèn)題,保證多個(gè)節(jié)點(diǎn)對(duì)同一資源的訪問(wèn)順序和安全性,性能較高。 單點(diǎn)故障問(wèn)題,如果Redis節(jié)點(diǎn)宕機(jī),會(huì)導(dǎo)致鎖失效。
MySQL的行鎖 可以保證事務(wù)的隔離性,能夠避免并發(fā)情況下的數(shù)據(jù)沖突問(wèn)題。 性能較低,對(duì)數(shù)據(jù)庫(kù)的性能影響較大,同時(shí)也存在死鎖問(wèn)題。
樂(lè)觀鎖 相對(duì)于悲觀鎖,樂(lè)觀鎖不會(huì)阻塞線程,性能較高。 需要額外的版本控制字段,且在高并發(fā)情況下容易出現(xiàn)并發(fā)沖突問(wèn)題。
where條件和unsigned 非負(fù)字段限制 可以通過(guò)where條件和unsigned非負(fù)字段限制來(lái)保證庫(kù)存不會(huì)超賣,簡(jiǎn)單易實(shí)現(xiàn)。 可能存在一定的安全隱患,如果某些操作沒(méi)有正確限制,仍有可能導(dǎo)致庫(kù)存超賣問(wèn)題。同時(shí),如果某些場(chǎng)景需要對(duì)庫(kù)存進(jìn)行多次更新操作,限制條件可能會(huì)導(dǎo)致操作失敗,需要再次查詢數(shù)據(jù),對(duì)性能會(huì)產(chǎn)生影響。

方案有很多,用法結(jié)合實(shí)際業(yè)務(wù)來(lái)看,沒(méi)有最優(yōu),只有更優(yōu)。

全文至此結(jié)束,再會(huì)!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-458789.html

到了這里,關(guān)于秒殺系統(tǒng)常見(jiàn)問(wèn)題—庫(kù)存超賣的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Redis:原理速成+項(xiàng)目實(shí)戰(zhàn)——Redis實(shí)戰(zhàn)7(優(yōu)惠券秒殺+細(xì)節(jié)解決超賣、一人一單問(wèn)題)

    Redis:原理速成+項(xiàng)目實(shí)戰(zhàn)——Redis實(shí)戰(zhàn)7(優(yōu)惠券秒殺+細(xì)節(jié)解決超賣、一人一單問(wèn)題)

    ?????作者簡(jiǎn)介:一位大四、研0學(xué)生,正在努力準(zhǔn)備大四暑假的實(shí)習(xí) ??上期文章:Redis:原理速成+項(xiàng)目實(shí)戰(zhàn)——Redis實(shí)戰(zhàn)6(封裝緩存工具(高級(jí)寫法)緩存總結(jié)) ??訂閱專欄:Redis:原理速成+項(xiàng)目實(shí)戰(zhàn) 希望文章對(duì)你們有所幫助 這篇文章寫了很久。我自己在邊實(shí)現(xiàn)、邊用

    2024年01月24日
    瀏覽(20)
  • 分布式系統(tǒng)常見(jiàn)問(wèn)題

    分布式系統(tǒng)常見(jiàn)問(wèn)題

    分布式系統(tǒng)存在網(wǎng)絡(luò),時(shí)鐘,以及許多不可預(yù)測(cè)的故障。分布式事務(wù),一致性與共識(shí)問(wèn)題,迄今為止仍沒(méi)有得到很好的解決方案。要想完美地解決分布式系統(tǒng)中的問(wèn)題不太可能,但是實(shí)踐中應(yīng)對(duì)特定問(wèn)題仍有許多可靠的解決方案。本文不會(huì)談及諸如BASE, CAP, ACID 等空泛的理論,

    2024年02月04日
    瀏覽(39)
  • Java管理系統(tǒng)答辯常見(jiàn)問(wèn)題

    大家好,今天我來(lái)跟大家分享一下Java管理系統(tǒng)答辯常見(jiàn)問(wèn)題。我會(huì)盡可能用幽默的方式介紹這些問(wèn)題,讓大家在輕松愉快的氛圍中學(xué)習(xí)。 這是一個(gè)很常見(jiàn)的問(wèn)題,老師或者評(píng)委會(huì)問(wèn)你的系統(tǒng)是否考慮到某個(gè)方面。不要慌張,這其實(shí)是他們想要了解你們的設(shè)計(jì)思路和考慮的全

    2024年02月09日
    瀏覽(72)
  • 【BI系統(tǒng)】選型常見(jiàn)問(wèn)題解答二

    【BI系統(tǒng)】選型常見(jiàn)問(wèn)題解答二

    本文主要總結(jié)BI系統(tǒng)選型過(guò)程中遇見(jiàn)的常見(jiàn)問(wèn)題,并針對(duì)性做出回答,希望能為即將選型,或正在選型BI系統(tǒng)的企業(yè)用戶們提供一個(gè)快速了解通道。 有針對(duì)金蝶云星空的BI方案嗎?能起到怎樣的作用? 答:奧威BI系統(tǒng)擁有針對(duì)金蝶云星空的BI方案,特別是SaaS BI版的,無(wú)需下載安

    2024年02月14日
    瀏覽(28)
  • MacOS系統(tǒng) 安裝ZooKeeper 和常見(jiàn)問(wèn)題解決

    MacOS系統(tǒng) 安裝ZooKeeper 和常見(jiàn)問(wèn)題解決

    ZooKeeper 是一個(gè)分布式的開(kāi)源協(xié)調(diào)服務(wù),用于構(gòu)建分布式應(yīng)用程序。 使用 Homebrew 安裝,如果沒(méi)有的話,強(qiáng)烈推薦 Homebrew,安裝命令參考如下: 安裝 ZooKeeper: 啟動(dòng) ZooKeeper 服務(wù): 停止 ZooKeeper 服務(wù) : 測(cè)試 ZooKeeper 是否正常啟動(dòng) : 2.1 配置文件在哪? 使用 Homebrew 安裝,一般會(huì)

    2024年01月18日
    瀏覽(13)
  • windows10系統(tǒng)安裝docker desktop超常見(jiàn)問(wèn)題

    windows10系統(tǒng)安裝docker desktop超常見(jiàn)問(wèn)題

    問(wèn)題報(bào)錯(cuò): An unexpected error was encountered while executing a WSLcommand. Common causes include access rights issues, which occurafter waking the computer or not being connected to your domain/active directory. Please try shutting WSL down (wsl --shutdown) and/or rebooting yourcomputer. If not sufficient, WSL may need to be reinstalled fully. As alas

    2024年02月11日
    瀏覽(21)
  • Vue3+Vite+ElementPlus管理系統(tǒng)常見(jiàn)問(wèn)題

    Vue3+Vite+ElementPlus管理系統(tǒng)常見(jiàn)問(wèn)題

    本文本記錄了使用 Vue3+Vite+ElementPlus 從0開(kāi)始搭建一個(gè)前端工程會(huì)面臨的常見(jiàn)問(wèn)題,沒(méi)有技術(shù)深度,但全都是解決實(shí)際問(wèn)題的干貨,可以當(dāng)作是問(wèn)題手冊(cè)以備后用。本人日常工作偏后端開(kāi)發(fā),因此,文中的一些前端術(shù)語(yǔ)描述可能不嚴(yán)謹(jǐn),敬請(qǐng)諒解。重點(diǎn)是:這里記錄的解決方案

    2024年02月05日
    瀏覽(24)
  • Linux系統(tǒng)中HTTP代理的常見(jiàn)問(wèn)題及解決方案

    Linux系統(tǒng)中HTTP代理的常見(jiàn)問(wèn)題及解決方案

    親愛(ài)的Linux用戶們,是不是有時(shí)候覺(jué)得HTTP代理就像是一個(gè)魔法盒子,讓你在數(shù)字世界中自由穿梭?但是,就像所有的魔法物品一樣,它也會(huì)偶爾出點(diǎn)小狀況。今天,我們就來(lái)一起探討一下Linux系統(tǒng)中HTTP代理的常見(jiàn)問(wèn)題及解決方案,讓你在面對(duì)這些“魔法問(wèn)題”時(shí)不再頭疼!

    2024年04月09日
    瀏覽(41)
  • 客戶管理系統(tǒng)在選型過(guò)程中遇到一些常見(jiàn)的問(wèn)題

    客戶管理系統(tǒng)在選型過(guò)程中遇到一些常見(jiàn)的問(wèn)題

    ? 如今很多企業(yè)都搭上了客戶管理系統(tǒng)這趟順風(fēng)車,將現(xiàn)有規(guī)范化取得了很大成果。而也有很多企業(yè)處在觀望態(tài)度,主要原因還在于擔(dān)心 客戶管理系統(tǒng)在選型過(guò)程中遇到一些常見(jiàn)的問(wèn)題。 接下來(lái)分享一些真實(shí)的客戶需求: 部署系統(tǒng)后可以微調(diào) “選型時(shí),我們比較關(guān)注軟件使

    2024年02月08日
    瀏覽(20)
  • TencentOS Server鏡像操作系統(tǒng)介紹_常見(jiàn)問(wèn)題解答FAQ

    TencentOS Server鏡像操作系統(tǒng)介紹_常見(jiàn)問(wèn)題解答FAQ

    騰訊云TencentOS Server鏡像是騰訊云推出的Linux操作系統(tǒng),完全兼容CentOS生態(tài)和操作方式,TencentOS Server操作系統(tǒng)為云上運(yùn)行的應(yīng)用程序提供穩(wěn)定、安全和高性能的執(zhí)行環(huán)境,TencentOS可以運(yùn)行在騰訊云CVM全規(guī)格實(shí)例上,包括黑石物理服務(wù)器2.0。騰訊云服務(wù)器網(wǎng)分享TencentOS Server鏡像

    2024年02月15日
    瀏覽(15)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包