欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis事務(wù)處理的使用操作方法

 更新時(shí)間:2021年10月19日 17:01:57   作者:希望不要禿頭的0.0  
Redis保證一個(gè)事務(wù)中的所有命令要么都執(zhí)行,要么都不執(zhí)行(原子性),如果客戶端發(fā)送了EXEC命令,所有的命令就都會(huì)被執(zhí)行,即使此后客戶端斷線也沒關(guān)系,因?yàn)镽edis中已經(jīng)記錄了所有要執(zhí)行的命令,下面通過本文給大家介紹Redis事務(wù)處理的使用操作,感興趣的朋友一起看看吧

一、簡介

        Redis采用了樂觀鎖方式進(jìn)行事務(wù)控制,它使用watch命令監(jiān)視給定的key,當(dāng)exec(提交事務(wù))的時(shí)候,如果監(jiān)視的key從調(diào)用watch后發(fā)生過變化,則整個(gè)事務(wù)會(huì)失敗。也可以調(diào)用watch多次監(jiān)視多個(gè)key。注意watch的key是對整個(gè)連接有效的,如果連接斷開,監(jiān)視和事務(wù)都會(huì)被自動(dòng)清除。當(dāng)然exec,discard,unwatch命令都會(huì)清除連接中的所有監(jiān)視。

        Redis保證一個(gè)事務(wù)中的所有命令要么都執(zhí)行,要么都不執(zhí)行(原子性)。如果在發(fā)送EXEC命令前客戶端斷線了,則Redis會(huì)清空事務(wù)隊(duì)列,事務(wù)中的所有命令都不會(huì)執(zhí)行。而一旦客戶端發(fā)送了EXEC命令,所有的命令就都會(huì)被執(zhí)行,即使此后客戶端斷線也沒關(guān)系,因?yàn)镽edis中已經(jīng)記錄了所有要執(zhí)行的命令。

常用指令:

  • multi 開啟事務(wù)
  • exec 提交事務(wù)
  • discard 取消事務(wù)
  • watch 監(jiān)控,如果監(jiān)控的值發(fā)生變化,則提交事務(wù)時(shí)會(huì)失敗
  • unwatch 去掉監(jiān)控

二、模擬使用

模擬轉(zhuǎn)賬操作

 開啟事務(wù)后所有操作都會(huì)進(jìn)入到一個(gè)隊(duì)列中,提交時(shí)一起執(zhí)行

模擬取消事務(wù)

redis事務(wù)太簡單,沒有回滾,而只有取消。

當(dāng)隊(duì)列中有語句出現(xiàn)錯(cuò)誤時(shí),事務(wù)會(huì)自動(dòng)取消

 樂觀鎖使用演示

        樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改,所以不會(huì)上鎖,期間該數(shù)據(jù)可以隨便被其他人讀取,但是在更新的時(shí)候會(huì)判斷一下在此期間別人有沒有去更新這個(gè)數(shù)據(jù),可以使用版本號(hào)等機(jī)制。
        版本號(hào)機(jī)制是樂觀鎖最常用的方式,就是在表中增加一個(gè)版本號(hào)的字段,更新前先查一遍獲取版本號(hào),再作為更新語句的where條件進(jìn)行更新,如果數(shù)據(jù)在獲取版本號(hào)之后,在更新之前已經(jīng)改變了,那就會(huì)更新失敗,因?yàn)樽詈蟾铝?條數(shù)據(jù),java后臺(tái)拿到更新數(shù)如果為0,則說明更新失敗,出現(xiàn)了并發(fā)問題,然后做具體的處理。

1.添加測試數(shù)據(jù)語句

開啟監(jiān)控,開啟事務(wù),執(zhí)行語句

 

 2.另起一個(gè)redis對數(shù)據(jù)進(jìn)行修改

 3.返回第一個(gè)數(shù)據(jù)庫提交事務(wù)

這里我們可以看到執(zhí)行事務(wù)失敗。a變成了666

 三、樂觀鎖秒殺搶票練習(xí)

/*基于reids實(shí)現(xiàn)一個(gè)簡單的多線程搶票操作
* 重點(diǎn)延時(shí)樂觀鎖的應(yīng)用*/
public class SecondsKillDemo02 {
    //定義搶票邏輯
    public static void KillTicket() {
        //1.連接
        Jedis jedis = JedisDataSource.getConnection();
        //2.監(jiān)控reids中指定的key
        String a = jedis.get("a");
        if (a == null || Integer.valueOf(a) == 0)
            throw new RuntimeException("沒票了");
        jedis.watch("a", "b");
        //3.開啟事務(wù)執(zhí)行業(yè)務(wù)
        Transaction multi = jedis.multi();
        try {
            multi.decr("a");
            multi.incrBy("b", 100);
            //4.提交事務(wù)
             multi.discard();
            System.out.println("ok");
        } catch (Exception e) {
            multi.exec();
        } finally {
            //5.取消監(jiān)控
            jedis.unwatch();
            //6.釋放
            jedis.close();
        }
    }
 
    public static void main(String[] args) {
        //1.定義初始數(shù)據(jù)
        Jedis jedis = JedisDataSource.getConnection();
        jedis.set("a", "1");
        jedis.set("b", "0");
        //2.創(chuàng)建多個(gè)線程,在線程中執(zhí)行搶票
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                KillTicket();
            }
        });
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                KillTicket();
            }
        });
        t1.start();
        t2.start();
 
    }
}

到此這篇關(guān)于Redis事務(wù)處理的文章就介紹到這了,更多相關(guān)Redis事務(wù)處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談redis的過期時(shí)間設(shè)置和過期刪除機(jī)制

    淺談redis的過期時(shí)間設(shè)置和過期刪除機(jī)制

    本文主要介紹了redis的過期時(shí)間設(shè)置和過期刪除機(jī)制,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • redis實(shí)現(xiàn)簡單分布式鎖

    redis實(shí)現(xiàn)簡單分布式鎖

    這篇文章主要介紹了redis實(shí)現(xiàn)簡單分布式鎖,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2013-09-09
  • websocket+redis動(dòng)態(tài)訂閱和動(dòng)態(tài)取消訂閱的實(shí)現(xiàn)示例

    websocket+redis動(dòng)態(tài)訂閱和動(dòng)態(tài)取消訂閱的實(shí)現(xiàn)示例

    本文主要介紹了websocket+redis動(dòng)態(tài)訂閱和動(dòng)態(tài)取消訂閱,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Redis高階之容錯(cuò)切換的實(shí)現(xiàn)

    Redis高階之容錯(cuò)切換的實(shí)現(xiàn)

    本文主要介紹了Redis高階之容錯(cuò)切換的實(shí)現(xiàn),當(dāng)一臺(tái)主節(jié)點(diǎn)宕機(jī)后,從節(jié)點(diǎn)會(huì)自動(dòng)接管成為新的主節(jié)點(diǎn),當(dāng)原主節(jié)點(diǎn)恢復(fù)后,它不會(huì)自動(dòng)成為主節(jié)點(diǎn),需要通過手動(dòng)操作將其重新設(shè)置為從節(jié)點(diǎn),感興趣的可以了解一下
    2025-02-02
  • 為什么斷電后Redis數(shù)據(jù)不會(huì)丟失

    為什么斷電后Redis數(shù)據(jù)不會(huì)丟失

    Redis 作為一款內(nèi)存數(shù)據(jù)庫,被廣泛使用于緩存,分布式鎖等場景,那么假如斷電或者因其他因素導(dǎo)致 Reids 服務(wù)宕機(jī),在重啟之后數(shù)據(jù)會(huì)丟失嗎?本文就來介紹與一下
    2021-08-08
  • Python利用redis限制用戶重復(fù)刷新帶來的數(shù)據(jù)問題

    Python利用redis限制用戶重復(fù)刷新帶來的數(shù)據(jù)問題

    在網(wǎng)站開發(fā)中,我們經(jīng)常會(huì)遇到需要控制用戶重復(fù)刷新頁面的情況,本文就來介紹了Python利用redis限制用戶重復(fù)刷新帶來的數(shù)據(jù)問題,感興趣的可以了解一下
    2024-03-03
  • Redisson如何解決redis分布式鎖過期時(shí)間到了業(yè)務(wù)沒執(zhí)行完問題

    Redisson如何解決redis分布式鎖過期時(shí)間到了業(yè)務(wù)沒執(zhí)行完問題

    這篇文章主要介紹了Redisson如何解決redis分布式鎖過期時(shí)間到了業(yè)務(wù)沒執(zhí)行完問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • redis適合場景八點(diǎn)總結(jié)

    redis適合場景八點(diǎn)總結(jié)

    在本篇文章中我們給大家整理了關(guān)于redis適合什么場景的8點(diǎn)知識(shí)點(diǎn)內(nèi)容,需要的朋友們參考下。
    2019-06-06
  • Redis過期監(jiān)聽機(jī)制,訂單超時(shí)自動(dòng)取消方式

    Redis過期監(jiān)聽機(jī)制,訂單超時(shí)自動(dòng)取消方式

    這篇文章主要介紹了Redis過期監(jiān)聽機(jī)制,訂單超時(shí)自動(dòng)取消方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Redis未授權(quán)訪問配合SSH key文件利用詳解

    Redis未授權(quán)訪問配合SSH key文件利用詳解

    這篇文章主要給大家介紹了關(guān)于Redis未授權(quán)訪問配合SSH key文件利用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09

最新評(píng)論