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

溫馨提示×

溫馨提示×

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

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

redis中事務命令的介紹和使用

發布時間:2020-06-23 14:09:43 來源:億速云 閱讀:110 作者:元一 欄目:關系型數據庫

這篇文章將為大家詳細講解有關redis中事務命令的介紹和使用,文章內容質量較高,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

一、概述:

Redis 事務的本質是一組命令的集合。事務支持一次執行多個命令,一個事務中所有命令都會被序列化。在事務執行過程,會按照順序串行化執行隊列中的命令,其他客戶端提交的命令請求不會插入到事務執行命令序列中。

總結說:redis事務就是一次性、順序性、排他性的執行一個隊列中的一系列命令。

二、相關命令列表:

命令原型時間復雜度命令描述返回值

M

U

L

T

I


用于標記事務的開始,其后執行的命令都將被存入命令隊列,直到執行EXEC時,這些命令才會被原子的執行。始終返回OK

E

X

E

C


執行在一個事務內命令隊列中的所有命令,同時將當前連接的狀態恢復為正常狀態,即非事務狀態。如果在事務中執行了WATCH命令,那么只有當WATCH所監控的Keys沒有被修改的前提下,EXEC命令才能執行事務隊列中的所有命令,否則EXEC將放棄當前事務中的所有命令。原子性的返回事務中各條命令的返回結果。如果在事務中使用了WATCH,一旦事務被放棄,EXEC將返回NULL-multi-bulk回復。

D

I

S

C

A

R

D


回滾事務隊列中的所有命令,同時再將當前連接的狀態恢復為正常狀態,即非事務狀態。如果WATCH命令被使用,該命令將UNWATCH所有的Keys。始終返回OK。

W

A

T

C

H

k

e

y

[key ...]

O(1)在MULTI命令執行之前,可以指定待監控的Keys,然而在執行EXEC之前,如果被監控的Keys發生修改,EXEC將放棄執行該事務隊列中的所有命令。始終返回OK。

U

N

W

A

T

C

H

O(1)取消當前事務中指定監控的Keys,如果執行了EXEC或DISCARD命令,則無需再手工執行該命令了,因為在此之后,事務中所有被監控的Keys都將自動取消。始終返回OK。

三、命令示例:

1、事務被正常執行:
#在Shell命令行下執行Redis的客戶端工具。

 /> redis-cli

#在當前連接上啟動一個新的事務。

redis 127.0.0.1:6379> multi
OK

#執行事務中的第一條命令,從該命令的返回結果可以看出,該命令并沒有立即執行,而是存于事務的命令隊列。

redis 127.0.0.1:6379> incr t1
QUEUED

#又執行一個新的命令,從結果可以看出,該命令也被存于事務的命令隊列。

redis 127.0.0.1:6379> incr t2
QUEUED

#執行事務命令隊列中的所有命令,從結果可以看出,隊列中命令的結果得到返回。

redis 127.0.0.1:6379> exec
1) (integer) 1
2) (integer) 1

2、 事務中存在失敗的命令:
#開啟一個新的事務。

redis 127.0.0.1:6379> multi
OK

#設置鍵a的值為string類型的3。

redis 127.0.0.1:6379> set a 3
QUEUED

#從鍵a所關聯的值的頭部彈出元素,由于該值是字符串類型,而lpop命令僅能用于List類型,因此在執行exec命令時,該命令將會失敗。

redis 127.0.0.1:6379> lpop a
QUEUED

#再次設置鍵a的值為字符串4。

redis 127.0.0.1:6379> set a 4
QUEUED

#獲取鍵a的值,以便確認該值是否被事務中的第二個set命令設置成功。

redis 127.0.0.1:6379> get a
QUEUED

#從結果中可以看出,事務中的第二條命令lpop執行失敗,而其后的set和get命令均執行成功,這一點是Redis的事務與關系型數據庫中的事務之間最為重要的差別。
redis 127.0.0.1:6379> exec
1) OK
2) (error) ERR Operation against a key holding the wrong kind of value
3) OK
4) "4"
3、回滾事務:
#為鍵t2設置一個事務執行前的值。

redis 127.0.0.1:6379> set t2 tt
OK

#開啟一個事務。

redis 127.0.0.1:6379> multi
OK

#在事務內為該鍵設置一個新值。

redis 127.0.0.1:6379> set t2 ttnew
QUEUED

#放棄事務。

redis 127.0.0.1:6379> discard
OK

#查看鍵t2的值,從結果中可以看出該鍵的值仍為事務開始之前的值。

redis 127.0.0.1:6379> get t2
"tt"

四、WATCH命令和基于CAS的樂觀鎖:

在Redis的事務中,WATCH命令可用于提供CAS(check-and-set)功能。假設我們通過WATCH命令在事務執行之前監控了多個Keys,倘若在WATCH之后有任何Key的值發生了變化,EXEC命令執行的事務都將被放棄,同時返回Null multi-bulk應答以通知調用者事務執行失敗。

例如,我們再次假設Redis中并未提供incr命令來完成鍵值的原子性遞增,如果要實現該功能,我們只能自行編寫相應的代碼。其偽碼如下:

      val = GET mykey
      val = val + 1
      SET mykey $val

以上代碼只有在單連接的情況下才可以保證執行結果是正確的,因為如果在同一時刻有多個客戶端在同時執行該段代碼,那么就會出現多線程程序中經常出現的一種錯誤場景--競態爭用(race condition)。

比如,客戶端A和B都在同一時刻讀取了mykey的原有值,假設該值為10,此后兩個客戶端又均將該值加一后set回Redis服務器,這樣就會導致mykey的結果為11,而不是我們認為的12。為了解決類似的問題,我們需要借助WATCH命令的幫助,見如下代碼:

      WATCH mykey
      val = GET mykey
      val = val + 1
      MULTI
      SET mykey $val
      EXEC

和此前代碼不同的是,新代碼在獲取mykey的值之前先通過WATCH命令監控了該鍵,此后又將set命令包圍在事務中,這樣就可以有效的保證每個連接在執行EXEC之前,如果當前連接獲取的mykey的值被其它連接的客戶端修改,那么當前連接的EXEC命令將執行失敗。這樣調用者在判斷返回值后就可以獲悉val是否被重新設置成功。

以上就是redis中事務命令的介紹和使用,看完之后是否有所收獲呢?如果想了解更多相關內容,歡迎關注億速云行業資訊,感謝各位的閱讀。

向AI問一下細節

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

AI

新宾| 宁波市| 哈密市| 叙永县| 石狮市| 即墨市| 田东县| 班玛县| 烟台市| 长阳| 永兴县| 霍林郭勒市| 海阳市| 云林县| 江城| 平湖市| 广平县| 铜梁县| 包头市| 白城市| 夹江县| 临高县| 杭州市| 齐齐哈尔市| 曲周县| 台北县| 大同市| 高雄市| 曲水县| 曲麻莱县| 左贡县| 柳江县| 兴城市| 志丹县| 通道| 余江县| 天峻县| 明光市| 镇巴县| 德兴市| 通海县|