PHP使用Redis的Transaction(事務)命令

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章