redis對事務的支援目前還比較簡單。redis只能保證乙個client發起的事務中的命令可以連續的執行,而中間不會插入其他client的命令。 由於redis是單執行緒來處理所有client的請求的所以做到這點是很容易的。一般情況下redis在接受到乙個client發來的命令後會立即處理並 返回處理結果,但是當乙個client在乙個連線中發出multi命令有,這個連線會進入乙個事務上下文,該連線後續的命令並不是立即執行,而是先放到一 個佇列中。當從此連線受到exec命令後,redis會順序的執行佇列中的所有命令。並將所有命令的執行結果打包到一起返回給client.然後此連線就 結束事務上下文。下面可以看乙個例子
redis-cli -h ip( 命令 連線redis伺服器)
incr qa ,decr qb命令發出後並沒執行而是被放到了佇列中。呼叫exec後倆個命令被連續的執行,最後返回的是兩條命令執行後的結果
我們也可以用discard取消這個事務
但是由於事務上下文的命令只排隊並不立即執行,所以事務中的寫操作不能依賴事務中的讀操作結果,在redis 2.1後新增了watch命令,可以用來實現樂觀鎖。watch 命令會監視給定的key,當exec時候如果監視的key從呼叫watch後發生過變化,則整個事務會失敗。也可以呼叫watch多次監視多個key.這 樣就可以對指定的key加樂觀鎖了。注意watch的key是對整個連線有效的,事務也一樣。如果連線斷開,監視和事務都會被自動清除。當然了 exec,discard,unwatch命令都會清除連線中的所有監視
我們看下面的2個例子
multi:標記乙個事務塊的開始。事務塊內的多條命令會按照先後順序被放進乙個佇列當中,最後由 exec 命令原子性(atomic)地執行。
exec:執行所有事務塊內的命令。假如某個(或某些) key 正處於 watch 命令的監視之下,且事務塊中有和這個(或這些) key 相關的命令,那麼 exec 命令只在這個(或這些) key沒有被其他命令所改動的情況下執行並生效,否則該事務被打斷(abort)。
discard:取消事務,放棄執行事務塊內的所有命令。如果正在使用 watch 命令監視某個(或某些) key,那麼取消所有監視,等同於執行命令 unwatch
watch:監視乙個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷,watch不會開啟事務。
unwatch:取消 watch 命令對所有 key 的監視。如果在執行 watch 命令之後, exec 命令或 discard 命令先被執行了的話,那麼就不需要再執行 unwatch 了。因為 exec 命令會執行事務,因此 watch 命令的效果已經產生了;而 discard 命令在取消事務的同時也會取消所有對 key 的監視,因此這兩個命令執行之後,就沒有必要執行 unwatch 了。
參考文章
事務的簡單了解
事務就是資料庫在進行sql的執行的過程,可以是乙個也可以是多個sql。就是一組sql指令,要麼全部執行成功,若因為某個原因其中一條指令執行有錯誤,則撤銷先前執行過的所有指令。更簡答的說就是 要麼全部執行成功,要麼撤銷不執行。事務的原子性 表示事務執行過程中的任何失敗都將導致事務所做的任何修改失效。事...
事務簡單了解
事務簡單了解 serializable 序列化 可避免髒讀 不可重複讀 幻讀的發生。repeatable read 可重複讀 可避免髒讀 不可重複讀的發生。read committed 讀已提交 可避免髒讀的發生。read uncommitted 讀未提交 最低級別,任何情況都無法保證。type包含...
redis簡單了解
redis 是單程序程式 redis與memcache對比 1 redis能夠用不同的兩種方式將資料寫入磁碟 時間點轉儲即快照 只追加檔案aof,將所有修改了資料庫的命令都寫入乙個只追加檔案裡面,使用者可以根據資料的重要程度,將只 追加寫入設定為從不同步 每秒同步一次或者每寫入乙個命令就同步一次 2...