中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis事務處理的操作方法是什么

發布時間:2021-10-19 20:15:02 來源:億速云 閱讀:142 作者:柒染 欄目:開發技術

本篇文章給大家分享的是有關Redis事務處理的操作方法是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

一、簡介

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

        Redis保證一個事務中的所有命令要么都執行,要么都不執行(原子性)。如果在發送EXEC命令前客戶端斷線了,則Redis會清空事務隊列,事務中的所有命令都不會執行。而一旦客戶端發送了EXEC命令,所有的命令就都會被執行,即使此后客戶端斷線也沒關系,因為Redis中已經記錄了所有要執行的命令。

常用指令:

  • multi 開啟事務

  • exec 提交事務

  • discard 取消事務

  • watch 監控,如果監控的值發生變化,則提交事務時會失敗

  • unwatch 去掉監控

二、模擬使用

模擬轉賬操作

Redis事務處理的操作方法是什么

 開啟事務后所有操作都會進入到一個隊列中,提交時一起執行

模擬取消事務

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

Redis事務處理的操作方法是什么

當隊列中有語句出現錯誤時,事務會自動取消

Redis事務處理的操作方法是什么

 樂觀鎖使用演示

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

1.添加測試數據語句

開啟監控,開啟事務,執行語句

Redis事務處理的操作方法是什么 

 2.另起一個redis對數據進行修改

Redis事務處理的操作方法是什么

 3.返回第一個數據庫提交事務

這里我們可以看到執行事務失敗。a變成了666

Redis事務處理的操作方法是什么

 三、樂觀鎖秒殺搶票練習

/*基于reids實現一個簡單的多線程搶票操作
* 重點延時樂觀鎖的應用*/
public class SecondsKillDemo02 {
    //定義搶票邏輯
    public static void KillTicket() {
        //1.連接
        Jedis jedis = JedisDataSource.getConnection();
        //2.監控reids中指定的key
        String a = jedis.get("a");
        if (a == null || Integer.valueOf(a) == 0)
            throw new RuntimeException("沒票了");
        jedis.watch("a", "b");
        //3.開啟事務執行業務
        Transaction multi = jedis.multi();
        try {
            multi.decr("a");
            multi.incrBy("b", 100);
            //4.提交事務
             multi.discard();
            System.out.println("ok");
        } catch (Exception e) {
            multi.exec();
        } finally {
            //5.取消監控
            jedis.unwatch();
            //6.釋放
            jedis.close();
        }
    }
 
    public static void main(String[] args) {
        //1.定義初始數據
        Jedis jedis = JedisDataSource.getConnection();
        jedis.set("a", "1");
        jedis.set("b", "0");
        //2.創建多個線程,在線程中執行搶票
        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();
 
    }
}

以上就是Redis事務處理的操作方法是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

盈江县| 遵化市| 吐鲁番市| 大庆市| 柳江县| 革吉县| 客服| 荥经县| 锦屏县| 沂源县| 淄博市| 南陵县| 邮箱| 梅河口市| 临漳县| 泌阳县| 临夏县| 天水市| 临武县| 巢湖市| 宿州市| 新兴县| 剑川县| 印江| 论坛| 深州市| 新竹市| 文水县| 新巴尔虎右旗| 汉寿县| 盐边县| 海南省| 呈贡县| 崇州市| 巴中市| 景德镇市| 张家口市| 小金县| 资讯| 太康县| 嘉义县|