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

redis實戰(zhàn)---樂觀鎖與悲觀鎖

這篇具有很好參考價值的文章主要介紹了redis實戰(zhàn)---樂觀鎖與悲觀鎖。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一:故事背景

最近一直在研究Redis,今天學習到了樂觀鎖與悲觀鎖的部分,在這里進行總結。

二:概念

Redis是一個內存中的鍵值存儲系統(tǒng),支持多種數(shù)據結構,如字符串、哈希、列表等。
Redis提供了兩種鎖機制,即樂觀鎖和悲觀鎖。

三:樂觀鎖

3.1 什么是樂觀鎖

  • 樂觀鎖是一種樂觀的并發(fā)控制策略,它認為數(shù)據在大多數(shù)情況下不會被其他線程占用,因此每次需要修改數(shù)據時,都不會獲取鎖,而是直接進行修改。
  • 在Redis中,可以通過WATCH和CAS命令來實現(xiàn)樂觀鎖,WATCH命令用于監(jiān)視一個或多個鍵,CAS命令用于檢查并更新鍵的值。

3.2 舉例說明

例如,假設有一個計數(shù)器鍵counter,多個客戶端都需要對其進行操作。使用樂觀鎖的方式,可以在每個客戶端執(zhí)行操作之前,先通過WATCH命令監(jiān)視counter鍵:

WATCH counter
current_count = GET counter
new_count = current_count + 1
MULTI
SET counter new_count
EXEC

然后,在EXEC命令執(zhí)行之前,使用GET命令再次獲取counter鍵的值,并將其與之前獲取的值進行比較。如果值相等,就說明期間沒有其他客戶端對counter鍵進行了修改,此時可以使用CAS命令將新值設置到counter鍵中。如果值不相等,則說明期間有其他客戶端對counter鍵進行了修改,需要重新執(zhí)行操作。

GET counter

四:悲觀鎖

4.1 什么是悲觀鎖

悲觀鎖是一種悲觀的并發(fā)控制策略,它認為數(shù)據在大多數(shù)情況下都會被其他線程占用,因此每次需要修改數(shù)據時,都會先獲取鎖,確保在修改期間沒有其他線程可以訪問該數(shù)據。在Redis中,可以通過WATCH命令來實現(xiàn)悲觀鎖,該命令可以監(jiān)視一個或多個鍵,如果在事務執(zhí)行期間有任何被監(jiān)視鍵的值發(fā)生了變化,整個事務會被回滾。

4.2 舉例說明

還是上文的例子

WATCH counter
current_count = GET counter
new_count = current_count + 1
MULTI
SET counter new_count
EXEC

如果在執(zhí)行事務期間,有其他客戶端修改了counter鍵,那么整個事務會被回滾,需要重新執(zhí)行。

悲觀鎖的優(yōu)點在于它可以確保數(shù)據的一致性,但缺點在于它需要獲取鎖,可能會引起線程的阻塞,影響并發(fā)性能。

五:樂觀鎖代碼示例

5.1 業(yè)務背景

假設有一個電商平臺,用戶可以在平臺上購買商品。為了保證數(shù)據的一致性,我們可以使用Redis的樂觀鎖來實現(xiàn)商品庫存的扣減。

5.2 數(shù)據結構

首先,我們需要在Redis中保存每個商品的庫存信息,使用hash數(shù)據結構來保存,例如:

HSET stock sku001 100

5.3 業(yè)務流程

然后,在業(yè)務邏輯中,當用戶購買一個商品時,需要執(zhí)行以下步驟:

  1. 使用WATCH命令監(jiān)視商品庫存鍵,例如stock:sku001;
  2. 使用GET命令獲取當前商品庫存數(shù)量;
  3. 檢查商品庫存是否足夠,如果不足,直接返回錯誤信息;
  4. 計算新的庫存數(shù)量,并使用MULTI命令開啟一個事務;
  5. 使用HSET命令將新的庫存數(shù)量保存到Redis中;
    執(zhí)行事務,如果在執(zhí)行期間有其他客戶端修改了商品庫存,會回滾事務,需要重新執(zhí)行。

5.4 代碼實現(xiàn)

下面是使用Spring Boot實現(xiàn)的示例代碼:

@Service
public class OrderService {
    private final RedisTemplate<String, Integer> redisTemplate;

    @Autowired
    public OrderService(RedisTemplate<String, Integer> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void placeOrder(String sku, int quantity) {
        String stockKey = "stock:" + sku;
        while (true) {
            // 監(jiān)視商品庫存鍵,以便在事務開始前檢測是否有其他客戶端修改了庫存
            redisTemplate.watch(stockKey);
            // 獲取當前庫存數(shù)量
            int currentStock = redisTemplate.opsForHash().get(stockKey, sku);
            // 檢查庫存是否足夠
            if (currentStock < quantity) {
                // 庫存不足,放棄事務并拋出異常
                redisTemplate.unwatch();
                throw new RuntimeException("Out of stock");
            }
            // 計算新的庫存數(shù)量
            int newStock = currentStock - quantity;
            // 開始事務
            redisTemplate.multi();
            // 更新庫存數(shù)量
            redisTemplate.opsForHash().put(stockKey, sku, newStock);
            // 提交事務
            List<Object> results = redisTemplate.exec();
            // 如果事務執(zhí)行成功,則退出循環(huán)
            if (results != null) {
                break;
            }
            // 如果事務執(zhí)行失敗,則重試
        }
    }
}

在上面的代碼中,我們使用RedisTemplate來操作Redis,其中watch方法用于監(jiān)視商品庫存鍵,opsForHash方法用于獲取和修改商品庫存的值,multi和exec方法用于開啟和提交事務。

六:悲觀鎖示例

除了樂觀鎖,Redis還支持悲觀鎖,可以通過設置NX(Not Exist)或XX(Exist)標志來實現(xiàn)。

6.1 悲觀鎖流程

例如,當NX標志設置為true時,如果鎖不存在,會返回OK,并創(chuàng)建一個鎖;如果鎖已經存在,會返回null,表示獲取鎖失敗。反之,當XX標志設置為true時,如果鎖已經存在,會返回OK,表示獲取鎖成功;如果鎖不存在,會返回null,表示獲取鎖失敗。

6.2 代碼實現(xiàn)

下面是使用Spring Boot實現(xiàn)的悲觀鎖示例代碼:

@Service
public class OrderService {
    private final RedisTemplate<String, String> redisTemplate;

    @Autowired
    public OrderService(RedisTemplate<String, String> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void placeOrder(String sku, int quantity) {
        String lockKey = "lock:" + sku;
        // 嘗試獲取鎖,如果鎖已經存在,說明有其他線程正在執(zhí)行相關操作
        Boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, "locked");
        if (!locked) {
            // 獲取鎖失敗,拋出異常
            throw new RuntimeException("Unable to acquire lock");
        }
        // 設置鎖的過期時間,防止鎖被一直占用
        redisTemplate.expire(lockKey, 10, TimeUnit.SECONDS);
        try {
            // 執(zhí)行訂單創(chuàng)建、扣減庫存等操作
        } finally {
            // 釋放鎖
            redisTemplate.delete(lockKey);
        }
    }
}

在上面的代碼中,我們使用setIfAbsent方法來嘗試獲取鎖,如果鎖已經存在,說明其他線程正在執(zhí)行相關操作,此時會返回false,表示獲取鎖失敗;否則,會返回true,表示獲取鎖成功。如果獲取鎖成功,我們會設置鎖的過期時間,并執(zhí)行相關操作,最后釋放鎖。

七:總結提升

需要注意的是,悲觀鎖一般適用于并發(fā)量不大的場景,如果并發(fā)量較高,容易導致性能問題。因此,在實際應用中,需要根據具體情況選擇合適的鎖策略。文章來源地址http://www.zghlxwxcb.cn/news/detail-408983.html

到了這里,關于redis實戰(zhàn)---樂觀鎖與悲觀鎖的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

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

領支付寶紅包贊助服務器費用

相關文章

  • 【樂觀鎖與悲觀鎖】—— 每天一點小知識

    【樂觀鎖與悲觀鎖】—— 每天一點小知識

    ?????????????????????????????????????????????????????????????????????????????? ?? 樂觀鎖與悲觀鎖 color{#FF1493}{樂觀鎖與悲觀鎖} 樂觀鎖與悲觀鎖 ?? ????????? ?? 仰望天空,妳我亦是行人.? ?? 個人主頁——微風撞見云的博客??

    2024年02月08日
    瀏覽(66)
  • JavaEE 初階篇-深入了解 CAS 機制與12種鎖的特征(如樂觀鎖和悲觀鎖、輕量級鎖與重量級鎖、自旋鎖與掛起等待鎖、可重入鎖與不可重入鎖等等)

    JavaEE 初階篇-深入了解 CAS 機制與12種鎖的特征(如樂觀鎖和悲觀鎖、輕量級鎖與重量級鎖、自旋鎖與掛起等待鎖、可重入鎖與不可重入鎖等等)

    ??博客主頁:?【 小扳_-CSDN博客】 ?感謝大家點贊??收藏?評論? 文章目錄 ? ? ? ? 1.0 樂觀鎖與悲觀鎖概述 ? ? ? ? 1.1 悲觀鎖(Pessimistic Locking) ? ? ? ? 1.2 樂觀鎖(Optimistic Locking) ? ? ? ? 1.3 區(qū)別與適用場景 ? ? ? ? 2.0 輕量級鎖與重量級鎖概述 ? ? ? ? 2.1 真正加

    2024年04月16日
    瀏覽(41)
  • Redis:事務操作以及監(jiān)控(悲觀鎖,樂觀鎖)

    事務操作是指:在一組操作中,有很多的命令,如果在這組操作時,有一個命令出現(xiàn)的了bug,那么這組這組操作會進行回滾,將環(huán)境還原成沒有開始這組操作時的狀態(tài)。在MySQL等關系型數(shù)據庫中事務操作可能會出現(xiàn)這種結果,但是在redis則也可能出現(xiàn)其他的錯誤,那就是語法問

    2024年02月05日
    瀏覽(16)
  • 悲觀鎖&樂觀鎖

    1.悲觀鎖 悲觀鎖介紹(百科): 悲觀鎖,正如其名,它指的是對數(shù)據被外界(包括本系統(tǒng)當前的其他事務,以及來自外部系統(tǒng)的事務處理)修改持保守態(tài)度,因此,在整個數(shù)據處理過程中,將數(shù)據處于鎖定狀態(tài)。悲觀鎖的實現(xiàn),往往依靠數(shù)據庫提供的鎖機制(也只有數(shù)據庫層

    2024年02月08日
    瀏覽(25)
  • django實現(xiàn)悲觀鎖樂觀鎖

    前期準備 1.原生mysql悲觀鎖 2.orm實現(xiàn)上述(悲觀鎖)? 3 樂觀鎖秒殺--》庫存還有,有的人就沒成功 ?

    2024年02月12日
    瀏覽(26)
  • 悲觀鎖和樂觀鎖(易懂)

    這里可以把悲觀鎖看作悲觀的人,啥事都往最壞的方向想。樂觀鎖看作樂觀的人,啥事都往最好的方向想。 首先,說一下悲觀鎖。 悲觀鎖就是假設并發(fā)情況下一定會有其他線程來修改數(shù)據,因此在處理數(shù)據之前,先將數(shù)據鎖住,確保其他線程不能進行修改 。感覺像一個過于

    2024年02月08日
    瀏覽(23)
  • 悲觀鎖和樂觀鎖、緩存

    悲觀鎖和樂觀鎖、緩存

    悲觀鎖: 悲觀鎖的實現(xiàn)通常依賴于數(shù)據庫提供的機制,在整個處理的過程中數(shù)據處于鎖定狀態(tài),session的load方法有一個重載方法,該重載方法的第三個參數(shù)可以設置鎖模式,load(object.class , int id,LockMode.?),該方法的?就是具體的鎖模式。 樂觀鎖: 樂觀鎖使用版本號或者時間戳

    2024年02月09日
    瀏覽(20)
  • 什么是樂觀鎖和悲觀鎖?

    樂觀鎖和悲觀鎖是并發(fā)控制的兩種不同策略,用于在多線程環(huán)境下管理共享資源的訪問。它們有不同的思想和實現(xiàn)方式: 悲觀鎖(Pessimistic Locking) : 思想 :悲觀鎖的思想是,它假定在并發(fā)訪問中會發(fā)生沖突,因此在訪問共享資源之前會先加鎖,以防止其他線程訪問。悲觀

    2024年02月10日
    瀏覽(25)
  • mybatis使用樂觀鎖和悲觀鎖

    悲觀鎖和樂觀鎖的概念: 悲觀鎖:就是獨占鎖,不管讀寫都上鎖了。傳統(tǒng)的關系型數(shù)據庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。Java中synchronized和ReentrantLock等獨占鎖就是悲觀鎖思想的實現(xiàn)。 樂觀鎖:不上鎖,讀取的時候

    2024年02月10日
    瀏覽(26)
  • Java并發(fā)(十四)----悲觀互斥與樂觀重試

    1. 悲觀互斥 互斥實際是悲觀鎖的思想 例如,有下面取款的需求 用互斥來保護 2. 樂觀重試 另外一種是樂觀鎖思想,它其實不是互斥

    2024年02月15日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包