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

全部回复(2)
P粉386318086

您的“exit_time”太小。 我认为'$exit_time = $time + 10;'的含义10秒后将其关闭。 不过,设定的时间是微时间。

也许你可以替换 '$exit_time = $time + 10;'与“$exit_time = $time + 100000;”。 由谷歌翻译撰写

P粉336536706

锁定工作正常。这只是锁定之间的代码崩溃并导致锁定无法释放:-)

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号