使用PHPRedis实现锁机制
P粉515066518
P粉515066518 2023-08-28 18:33:09
[PHP讨论组]

我得到了以下两个用于锁定 Redis 密钥的函数。我试图防止使用 Redis 并发执行代码块。所以我所做的就是使用以下函数,以防止不同线程执行相同的代码。

lockRedisKey("ABC");
CODE THAT I DON'T WANT TO RUN CONCURRENTLY!
unlockRedisKey("ABC");

不幸的是,它似乎不起作用,并导致 lockRedisKey() 无限循环,直到达到 exit_time。可能出了什么问题?

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);

    }

我知道我可能会面临死锁,因此我决定使用事务,但我仍然面临这个问题。

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();

    }

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
随时随地碎片化学习

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