Redis附加功能之Redis事務

2021-09-06 18:20:40 字數 2556 閱讀 2400

一、事務

redis 的事務功能允許使用者將多個命令包裹起來,然後一次性地、按順序地執行被包裹的所有命令。在事務執行的過程中,伺服器不會中斷事務而改去執行其他命令請求,只有在事務包裹的所有命令都

被執行完畢之後,伺服器才會去處理其他命令請求。

事務示例:

現在, 讓我們假設 setex 命令並不存在於 redis , 並且 set 命令也不支援 ex seconds 引數, 如果我們要自己來實現乙個 setex 命令的話, 那麼我們可能會使用以下**:

def setex(key, seconds, value):

set key value

expire key seconds

在一般情況下,這個自製的 setex 命令可以達到設定鍵值對並設定生產時間的效果,但是這個自製的setex 存在乙個缺陷:如果伺服器在成功地執行 set 命令並儲存資料之後崩潰,那麼 expire 命令將沒辦法執行。

這時雖然我們已經設定了鍵, 但並沒有為鍵設定過期時間, 如果我們沒有發覺的話, 那麼這個本來應該定期被刪除的鍵就會一直留在資料庫裡面占用著記憶體, 甚至造成之後的程式出錯。

二、事務命令

為了避免遇上以上所說的情況, 我們需要用到 redis 的事務功能, 通過事務, 我們可以讓 redis一次性地執行多個命令, 並且確保事務中的命令要麼就全部都執行,要麼就乙個都不執行

multi : 開始乙個新的事務

discard : 放棄事務

exec : 執行事務中所有命令

以下分別對事務命令進行描述:

multi

開始乙個事務。

在這個命令執行之後,客戶端傳送的所有針對資料庫或者資料庫鍵的命令都不會被立即執行,而是被放入到乙個事務佇列裡面,並返回 queued 表示命令已入隊。

redis>multi # 開始乙個事務

okredis> set msg "

hello world

"# 將這個 set 命令放入事務佇列

queued

redis> expire msg 10086

# 將這個 set 命令放入事務佇列

queued

discard

取消事務,放棄執行事務佇列中的所有命令。

redis>multi

okredis> set msg "

hello world

"queued

redis> expire msg 10086

queued

redis>discard # 事務已被取消

okredis> set msg "

hello world

"ok

exec

執行事務,按照命令被入隊到事務佇列中的順序,執行事務佇列中的所有命令。

命令的返回值是乙個列表,列表裡包含了事務佇列中所有被執行命令的返回值。

redis>multi

okredis> set msg "

hello world

"queued

redis> expire msg 10086

queued

redis>exec

1) ok # set 命令的返回值

2) (integer) 1 # expire 命令的返回值

使用事務保證操作的安全性

之前的自製 setex 的定義,帶有安全缺陷:

def setex(key, seconds, value):

set key value

expire key seconds # 如果伺服器在 set 命令執行之後崩潰,那麼 expire 將無法執行

使用事務實現的自製 setex 的定義,沒有安全缺陷,伺服器保證要麼兩個命令都執行,要麼就兩個命令都不執行:

def setex(key, seconds, value):

multi

set key value

expire key seconds

exec

三、流水線和事務的區別

流水線:確保多條命令會被一起傳送

事  務 :確保多條命令會被一起執行

(pipeline_start)

set msg 「hello world」 # 這兩條命令會被一起傳送至伺服器

expire msg

10086

(pipeline_end)

multi

set msg 「hello world」 # 這兩條命令會一起被伺服器執行

expire msg

10086

exec

redis之訂閱功能

redis 通過 publish subscribe 等命令實現了訂閱與發布模式。舉例1 qq群的公告,單個發布者,多個收聽者 命令publish channel msg 將資訊 message 傳送到指定的頻道 channel subscribe channel channel 訂閱頻道,可以同時...

redis之(十一)redis實現快取的功能

一 redis實現快取的原理 利用鍵的失效時間設定實現快取技術 由於redis的記憶體有限,可以在redis的配置檔案裡設定maxmemory的引數。來限制redis最大可用記憶體的大小。單位是位元組 當超出這個限制的時候,redis可以依據maxmemory policy引數指定的策略來刪除不需要...

三 redis的高階功能之redis事務

redis單條執行命令是具有原子性的,但是如果遇到多條執行命令的時候,redis如何保證原子性,這時候redis就提供了事務的功能。redis事務是把一組命令一起執行。它會將執行命令先放入到queue中按順序執行,且不會收到其他客戶端的請求的影響,且事務不能巢狀。開啟事務 multi 需要執行的命令...