redis作為乙個非關係型資料庫,其也是有事務操作的。
redis 事務可以一次執行多個命令, 並且帶有以下三個重要的保證:
(1)批量操作在傳送 exec 命令前被放入佇列快取。
(2)收到 exec 命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然被執行。
(3)在事務執行過程,其他客戶端提交的命令請求不會插入到事務執行命令序列中。
乙個事務從開始到執行會經歷以下三個階段:
(1)開始事務。
(2)命令入隊。
(3)執行事務。
但是redis的事務和mysql的事務還是有很大區別的,mysql執行過程**現錯誤,資料會回滾,而redis事務執行過程中失敗則不會回滾。
redis的事務可以看做是乙個批量執行命令的乙個指令碼。
這裡關注的不是事務執行過程中每條命令是否都執行成功,而是,執行當前的事務是否成功。
// 開始事務
127.0.0.1:6379> multi
ok// 設定健值
127.0.0.1:6379>
set a aaaa
queued
// 設定健值
127.0.0.1:6379>
set b bbbb
queued
// 設定健值
127.0.0.1:6379>
set c cccc
queued
// 執行事務,其實redis的事務就是乙個批處理命令的乙個指令碼
127.0.0.1:6379>
exec
1) ok
2) ok
3) ok
// 開啟事務
$res
=$redis->multi();
$res
=$redis->set(
'a','aaa');
var_dump(
$res);
echo"";
$res
=$redis->set(
'b','bbb');
var_dump(
$res);
echo"";
$res
=$redis->set(
'c','bbb');
var_dump(
$res);
echo"";
// 執行事務
$res
=$redis->exec();
var_dump(
$res
);
以上只是對redis事務簡單的應用,大概就是這樣,主要應用其是乙個批處理的命令。
解釋:樂觀鎖(optimistic lock), 顧名思義,就是很樂觀。
每次去拿資料的時候都認為別人不會修改,所以不會上鎖。
watch命令會監視給定的key,當exec時候如果監視的key從呼叫watch後發生過變化,則整個事務會失敗。
也可以呼叫watch多次監視多個key。這樣就可以對指定的key加樂觀鎖了。
注意watch的key是對整個連線有效的,事務也一樣。
如果連線斷開,監視和事務都會被自動清除。
當然了exec,discard,unwatch命令都會清除連線中的所有監視。
// 監視 count 值
$redis->watch(
"count");
// 開啟事務
$redis->multi();
// 操作count
$time
= time();
$redis->set(
"count", $time);
// 模擬併發下其他程序進行set count操作 請執行下面操作
// 在shell命令列中執行 set count issimulate;
sleep(40)
; // 提交事務
$res
=$redis->exec();
$result
=$redis->get(
'count');
if($res
) // 失敗...
echo
"fail:"
.$result
;echo
"";
這段測試**可能要解釋一下:
首先我們先監控鍵count,開啟事務之後,將count鍵的值設定成當前時間戳,程式睡眠40秒,再執行事務操作。這是在理想情況下,就是上邊這段**在沒有任何外力影響的情況下的執行事務成功,輸出
success:1502547852
上面是事務執行成功的結果,我們現在來模擬事務執行失敗的情況,很簡單,還是上邊那段**,在瀏覽器中執行之後,程式會睡眠40秒,我們在這個時間裡模擬另乙個程序修改count鍵的值,在shell中執行set count issimulate;,watch監控的健的值在事務執行過程中被另一程序改變,則此次事務執行失敗。輸出
fail:issimulate
其實回過頭來看,當不同程序修改同乙個值得時候,使用事務,就相當於給其加了乙個樂觀鎖。
序號命令及描述
discard
取消事務,放棄執行事務塊內的所有命令。
exec
執行所有事務塊內的命令。
multi
標記乙個事務塊的開始。
unwatch
取消 watch 命令對所有 key 的監視。
watch key [key ...]
監視乙個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷。
redis事務 redis 優化
redis提供許多批量操作的命令,如mset mget hmset hmget等等,這些命令存在的意義是減少維護網路連線和傳輸資料所消耗的資源和時間。例如連續使用5次set命令設定5個不同的key,比起使用一次mset命令設定5個不同的key,效果是一樣的,但前者會消耗更多的rtt round tr...
redis11 Redis事務 事務鎖
一旦成功所有的成功,乙個失敗,所有一些列連續動作都失敗 事務的基本操作 multi exec 事務定義過程中發現問題,怎麼辦?discard 事務的工作流程 事務的注意事項 手動進行事務回滾 業務場景1 業務分析 基於特定條件的事務執行 鎖 解決方案 watch key1 key2 unwatch ...
Redis學習筆記 Redis事務
redis事務可以一次執行多個命令 按順序地序列執行,執行中不會被其他命令插入,不許加塞 1.簡介 redis事務可以一次執行多個命令 允許在一次單獨的步驟中執行一組命令 特徵 1 批量操作在傳送exec命令前被放入佇列快取 2 收到exec命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然...