【Redis】Redis事務詳解,Redis事務支持回滾(不支持悲觀鎖)


1、redis事物參考:https://baijiahao.baidu.com/s?id=1613631210471699441&wfr=spider&for=pc

 (php操作redis命令官方大全:https://github.com/phpredis/phpredis

2、總結:redis事物不支持悲觀鎖,支持樂觀鎖,要實現悲觀鎖,看業務,同時也有下面一種方法,循環 【watch > multi > doRedisCommand > exec】

 

3、詳解:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM