1. 程式人生 > >Redis事務管理

Redis事務管理

cau previous 關系型數據庫 不想 是否 san 通過 cnblogs 早就

  用過其他關系型數據庫(比如msql)的肯定都指定,在關系型數據庫裏面的事務可以保證多個命令操作要麽同時成功,要麽同時失敗。並且在執行事務的時候,可以有隔離級別。

  但是在Redis中的事務,只是保證事務同時執行多個命令,並且不會被其他客戶端的命令所打斷,但是,如果在執行的時候發現中斷,錯誤之類的,Redis中的事務是沒有回滾的功能。

  在Redis中提供了DISCART、EXEC、MULTI、UNWATCH、WATCH這個幾個命令來操作事務。

事務的用法

  ①通過MULTI命令,開啟一個事務,這時候,客戶端可以發送任意多條命令,這些命令不會立即執行,而是放到一個隊列中。

  ②通過EXEC命令,可以一次性執行隊列中的命令。

  ③如果命令加入隊列中之後,我們不想執行這個事務了,還可以通過DISCARD來放棄事務,這時候隊列會被清空。

實例:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> get name
QUEUED
127.0.0.1:6379> set name zhangsan
QUEUED
127.0.0.1:6379> pop age
(error) ERR unknown command ‘pop‘
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get name (nil) 127.0.0.1:6379> multi OK 127.0.0.1:6379> get name QUEUED 127.0.0.1:6379> set name zhangsan QUEUED 127.0.0.1:6379> exec 1) (nil) 2) OK 127.0.0.1:6379> exec (error) ERR EXEC without MULTI 127.0.0.1:6379>

可以看到,在pop age這個命令入隊的時候i,發生了錯誤,然後在exec的時候,發現這個事務已經被取消了。

而在後面,get name返回的是nil,但是事務還是被執行了。

需要註意的是,在執行的時候即使在其中某個命令出現錯誤了,redis還是會繼續執行事務裏的其他命令,而不會中止執行操作。

使用CHECK-AND-SET實現樂觀鎖

  樂觀鎖的意思就是鎖定某個資源,但是如果其他客戶端也需要訪問這個資源的時候,則釋放資源給其他客戶端訪問。

  WATCH命令可以用來監視某個鍵,並且可以發覺這些鍵是否被改動了。如果至少有一個被監視的鍵在EXEC執行之前被修改了,那麽整個事務都被被取消,EXEC會返回nil-reply來表示事務已經失敗。

127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379> watch name
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> set address shanghai
QUEUED
#####################
#這時候,在啟動一個客戶端,修改name的值
#####################
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379>
[[email protected] 08:36 ~]# redis-cli
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379>

Redis腳本

  Redis腳本,本身也是一種事務,所以在事務中可以完成的事情都可以通過腳本來完成。並且腳本更加簡單,更加快速。

  但是由於腳本是在Redis2.6版本中才引入的,而事務很早就已經存在了,所以現在的版本中兩種都存在,

  但是不排除以後的版本會刪掉事務的功能。

Redis事務管理