redis中事務(Transaction)的使用

2021-08-08 16:55:07 字數 2608 閱讀 3868

redis是乙個開源的使用ansi c語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、key-value資料庫,提供多種語言的api,支援多種資料儲存方式。開發中一般用於快取,佇列,資料庫使用。

redis中的事務與傳統關係型資料庫(如mysql)的事務是不同的。

redis中的事務是一組命令的集合,事務與命令都是最小執行單位,原理是先將屬於乙個事務的命令傳送給redis,然後redis一次執行這些命令。

redis的事務可以保證乙個事務內的命令一次執行而不被其他命令插入影響。

如果事務塊中某一條命令出錯,關係型資料庫的事務會執行回滾,而redis不會執行回滾,而是會繼續執行後續的命令。因為redis的事務沒有關係型資料庫的回滾(rollback)功能。因此需要開發者在事務執行出錯時自己處理。

1.watch

用於監視乙個或多個key,如果在事務執行之前這個或(這些)key被其他命令所改動,事務將被中斷。

2.unwatch

用於取消watch命令對所有key的監視。

3.multi

用於標記乙個事務塊的開始,之後的所有命令都存放在佇列,等遇到exec命令再執行。

4.exec

用於執行事務塊內所有的命令,如果命令被中斷,返回false

1.使用redis事務,事務正常執行

<?php

$redis

=new redis;

$redis

->connect('localhost', 6379);

// 監聽

$redis

->watch('mykey1','mykey2');

// 開啟事務塊

$redis

->multi();

// 事務塊語句

$redis

->

set('mykey1', date('y-m-d h:i:s'));

$redis

->

set('mykey2', time());

// 執行事務

$result

=$redis

->exec();

// 取消監聽

$redis

->unwatch();

var_dump($result);

?>

輸出:

array (size=2)

0 => boolean true

1 => boolean true

進入redis檢視這兩個key的值

127.0.0.1:6379> mget "mykey1"

"mykey2"

1) "2017-09-24 17:14:02"

2) "1506244442"

表示事務塊語句 set mykey1,mykey2執行成功。

2.使用redis事務,事務被中斷

我們模擬在事務執行過程中值被修改,因此在事務塊中加入sleep延遲執行,然後在延遲的時候修改監聽key的值。

<?php

$redis

=new redis;

$redis

->connect('localhost', 6379);

// 監聽

$redis

->watch('mykey1','mykey2');

// 開啟事務塊

$redis

->multi();

// 事務塊語句

$redis

->

set('mykey1', date('y-m-d h:i:s'));

$redis

->

set('mykey2', time());

// 延遲5秒

sleep(5);

// 執行事務

$result

=$redis

->exec();

// 取消監聽

$redis

->unwatch();

var_dump($result);

?>

在延遲的時候,進入redis,手動執行以下命令修改mykey2的值。

127.0.0.1:6379> set mykey2 123

ok

因為監聽的key的值被修改,因此事務執行中止。

輸出:

boolean

false

進入redis檢視這兩個key的值

127.0.0.1:6379> mget "mykey1"

"mykey2"

1) "2017-09-24 17:14:02"

2) "123"

表示事務塊語句 set mykey1,mykey2沒有執行。

Redis中的事務

flushall清除所有的鍵值 1 multi 開啟事務,事務塊中的多條語句會按照順序放入佇列中。multi incr counter1 incr counter2 incr counter3 ping get counter1 2 exec 執行事務塊中的命令 3 watch 監視乙個或者多個ke...

redis中的事務

redis支援簡單的事務 redis與 mysql事務的對比 mysql redis 開啟 start transaction muitl 語句 普通sql 普通命令 失敗 rollback 回滾 discard 取消 成功 commit exec 注 rollback與discard 的區別 如果...

Redis 中的事務

redis支援簡單的事務 redis與 mysql 事務的對比 mysql redis 開啟start transaction muitl 語句普通sql 普通命令 失敗rollback 回滾 discard 取消 成功commit exec 注 rollback 與discard 的區別如果已經成...