1.Transaction命令
命令 | 作用 | 返回值 |
---|---|---|
watch | 監視一個或多個key | 總是OK |
multi | 聲明事務開始,後續命令將排隊按順序等待exec執行 | 總是OK |
exec | 順序執行multi之後的命令,如果multi之前使用watch命令監視的鍵的值發生變化,執行將失敗 | 執行成功時返回數組包含每個命令執行結果,失敗時原生命令返回null,php-redis擴展方法返回false |
discard | 取消事務 | 總是OK |
unwatch | 取消watch監視,如果watch監視之後執行了exec或discard,會自動取消監視,不必再unwatch | 總是OK |
2.執行事務
<?php
/**
* Created by PhpStorm.
* User: jmsite.cn
* Date: 2019/1/24
* Time: 21:03
*/
try {
$redis = new Redis();
$redis->connect('192.168.75.132', 6379);
//開啓事務
$redis->multi();
$redis->setex('keyTest', 60, 1);
$redis->get('keyTest');
$redis->incr('keyTest');
$redis->get('keyTest');
//執行事務
$ret = $redis->exec();
print_r($ret);
} catch (Exception $e){
echo $e->getMessage();
}
執行結果:以數組形式返回了每個命令執行結果
Array
(
[0] => 1
[1] => 1
[2] => 2
[3] => 2
)
3.取消事務
<?php
/**
* Created by PhpStorm.
* User: jmsite.cn
* Date: 2019/1/24
* Time: 21:03
*/
try {
$redis = new Redis();
$redis->connect('192.168.75.132', 6379);
//先設置緩存keyTest爲1
$redis->setex('keyTest', 60, 1);
//開啓事務
$redis->multi();
$redis->setex('keyTest', 60, 10);
$redis->get('keyTest');
$redis->incr('keyTest');
$redis->get('keyTest');
//取消事務
$redis->discard();
$ret = $redis->get('keyTest');
var_dump($ret);
//查看keyTest
} catch (Exception $e){
echo $e->getMessage();
}
執行結果:keyTest還是原值,並未發生變化
string(1) "1"
4.監視鍵,並執行事務
<?php
/**
* Created by PhpStorm.
* User: jmsite.cn
* Date: 2019/1/24
* Time: 21:03
*/
try {
$redis = new Redis();
$redis->connect('192.168.75.132', 6379);
//先設置緩存keyTest爲1
$redis->setex('keyTest', 60, 1);
//監視keyTest
$redis->watch(array('keyTest'));
//假設在開始監視之後,執行事務之前,keyTest被併發操作redis的其他用戶修改了
$redis->setex('keyTest', 60, 10);
//開啓事務
$redis->multi();
$redis->incr('keyTest');
//執行事務
$ret = $redis->exec();
var_dump($ret);
$ret = $redis->get('keyTest');
var_dump($ret);
//查看keyTest
} catch (Exception $e){
echo $e->getMessage();
}
執行結果:exec返回false
bool(false)
string(2) "10"
Transaction(事務)命令的關鍵在於,redis在給我們提供了高性能的同時,雖然命令是原子性的,但無法和我們的php產生上下文關聯,這個時候,Transaction(事務)命令就派上了用場
原文地址:https://www.jmsite.cn/blog-601.html