Redis事務管理
用過其他關系型數據庫(比如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事務管理