Redis基礎教程四

2021-07-26 18:22:09 字數 2690 閱讀 3597

一.事務

1.redis事務是一組命令集合,也同命令一樣是最小執行單位,事務原理是先將乙個事務的命令發給redis,然後再讓redis依次執行這些命令。事務在執行的期間不會主動中斷 —— 伺服器在執行完事務中的所有命令之後, 才會繼續處理其他客戶端的其他命令。如:

redis> multi

okredis> sadd name1 123

queued

redis> sadd name2 234

queued

redis> exec

1)(integer)1

2)(integer)1

上面首先使用multi告訴redis,下面的命令是屬於同乙個事務,先暫存起來不要執行,所以返回queued表示命令已經進入等待執行的事務佇列,當執行exec,就執行事務佇列的命令。

2.錯誤處理

當乙個事務中的某個命令執行出錯,redis會怎麼處理呢?

當遇到的是語法錯誤時:

redis> multi

redis> set key value

// 命令1

redis> set key // 命令2 這裡語法錯誤

redis> exec

上面事務 會執行失敗,因為命令2發生語法錯誤,最終導致命令1也不執行。

當遇到的是執行時錯誤時:

redis> multi

redis> set key 1

redis> sadd key 2

//這裡發生執行錯誤,key是string型別的不能作為集合操作。

redis> set key 3

redis> exec

redis事務沒有關係型資料庫的回滾功能。所以上面的命令3依然會正確執行。

二.watch命令

下面給出個執行失敗的例子:

redis> watch name

okredis> multi

okredis> set name peter

queued

redis> exec

(nil)

以下執行序列展示了上面的例子是如何失敗的:

時間 客戶端 a 客戶端 b

t1 watch name

t2 multi

t3 set name peter

t4 set name john

t5 exec

在時間 t4 ,客戶端 b 修改了 name 鍵的值, 當客戶端 a 在 t5 執行 exec 時,redis 會發現 name 這個被監視的鍵已經被修改, 因此客戶端 a 的事務不會被執行,而是直接返回失敗。

三.生存時間

1.redis中可以用expire來設定鍵的生存時間,超時後redis自動刪除鍵。返回1表示設定成功,0表示鍵不存在或者設定失敗

redis> set name 111

redis> expire name 900

// 900 秒

2.ttl 檢視鍵的神剩餘時間(單位:秒),當鍵不存在了返回-1

redis> ttl name

3.persist 取消鍵的生成時間設定(將鍵變成永久的),成功返回1否則0

四.任務佇列

一般來說,訊息佇列有兩種場景,一種是發布者訂閱者模式,一種是生產者消費者模式。利用redis這兩種場景的訊息佇列都能夠實現。

生產者消費者模式:生產者生產訊息放到佇列裡,多個消費者同時監聽佇列,誰先搶到訊息誰就會從佇列中取走訊息;即對於每個訊息只能被最多乙個消費者擁有。

發布者訂閱者模式:訂閱者可以訂閱乙個或若干頻道(channel),而發布者可以向指定的頻道傳送訊息,所有訂閱此頻道的訂閱者都會收到此訊息。

1.生產者消費者

brpop(blpop)命令 接受兩個引數,第乙個是鍵名,第二個是超時時間(秒)。當超過了任然沒有獲得新元素就會返回nil。若把時間設為0,則永久等待,直到佇列中有資料了。

我們來開啟兩個redis客戶端來模仿下:

redis a> brpop queue

0//如果queue有資料就會立馬返回否則會一直阻塞,直到另乙個客戶端向列表queue加入資料。

redis b> lpush queue aaa //向列表中新增資料 , 此時會喚醒redisa客戶端並且pop掉了列表中的資料 aaa 。

redis b> llen queue

// 結果為 0

2.發布/訂閱模式

publish : 發布者發布訊息。

redis> publish channel1 hello //向channel1頻道發布 hello,返回值是接收到hello的訂閱者數量。

subscribe : 訂閱,可同時訂閱多個頻道。

下面看個例項:

redis a> subscribe channel1 // 訂閱channel1 通道,然後就一直阻塞到這裡。

redis b> publish channel1 helloword //會導致redisa返回乙個helloword字串,然後redisa繼續阻塞,監聽下個。

今天先到這,持續更新…

Latex基礎教程四

在latex環境下,數學公式的使用是最為常見的,下面將介紹幾個比較常用的語法 1.單個方程式的書寫如下 documentclass usepackage begin begin 1 2 3 end end 得到輸出如下 這裡解釋以下 equation下為方程式環境,代表不需要方程式編號,如果需要為方...

ts基礎教程 四

可選鏈不是ts專屬,自ts3.7版本後內建,它確實解決了物件屬性或方法訪問前判斷是否存在的痛點,可選鏈更直觀 來自mdn的解釋 可選鏈操作符?能夠去讀取乙個被連線物件的深層次的屬性的值而無需明確校驗鏈條上每乙個引用的有效性。運算子功能類似於.運算子,不同之處在於如果鏈條上的乙個引用是null 或 u...

Git基礎教程(四)

簡單的做法先儲存當前的修改 然後切換到有問題的分級,先完成別的功能,然後切換回原來做到一半的develop分支,執行reset命令,銜接之前的工作。git reset head 遇到這種情況的時候,可以像上面那樣先commit,然後再reset回來,另外一種做法是,使用stash功能。首先檢視分支狀...