使用PHPRedis实现锁机制
P粉515066518
P粉515066518 2023-08-28 18:33:09
0
2
351
<p>我得到了以下两个用于锁定 Redis 密钥的函数。我试图防止使用 Redis 并发执行代码块。所以我所做的就是使用以下函数,以防止不同线程执行相同的代码。</p> <pre class="brush:php;toolbar:false;">lockRedisKey("ABC"); CODE THAT I DON'T WANT TO RUN CONCURRENTLY! unlockRedisKey("ABC");</pre> <p>不幸的是,它似乎不起作用,并导致 lockRedisKey() 无限循环,直到达到 exit_time。可能出了什么问题?</p> <pre class="brush:php;toolbar:false;">static public function lockRedisKey($key, $value = "true") { $redis = RedisClient::getInstance(); $time = microtime(true); $exit_time = $time + 10; $sleep = 10000; do { // Lock Redis with PX and NX $lock = $redis->setnx("lock:" . $key, $value); if ($lock == 1) { $redis->expire("lock:" . $key, "10"); return true; } usleep($sleep); } while (microtime(true) < $exit_time); return false; } static public function unlockRedisKey($key) { $redis = RedisClient::getInstance(); $redis->del("lock:" . $key); }</pre> <p>我知道我可能会面临死锁,因此我决定使用事务,但我仍然面临这个问题。</p> <pre class="brush:php;toolbar:false;">static public function lockRedisKey($key, $value = "true") { $redis = RedisClient::getInstance(); $time = microtime(true); $exit_time = $time + 10; $sleep = 10000; do { // Lock Redis with PX and NX $redis->multi(); $redis->set('lock:' . $key, $value, array('nx', 'ex' => 10)); $ret = $redis->exec(); if ($ret[0] == true) { return true; } usleep($sleep); } while (microtime(true) < $exit_time); return false; } static public function unlockRedisKey($key) { $redis = RedisClient::getInstance(); $redis->multi(); $redis->del("lock:" . $key); $redis->exec(); }</pre></p>
P粉515066518
P粉515066518

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!