【redis进阶】二、悲观锁

$timeout = 5000;
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
do {
    $microtime = microtime(true) * 1000;
    $microtimeout = $microtime+$timeout+1;
    // 上锁
    $isLock = $redis->setnx('lock.count', $microtimeout);
    if (!$isLock) {
        $getTime = $redis->get('lock.count');
        if ($getTime > $microtime) {
            // 睡眠 降低抢锁频率 缓解redis压力
            usleep(5000);
            // 未超时继续等待
            continue;
        }
        // 超时,抢锁,可能有几毫秒级时间差可忽略
        $previousTime = $redis->getset('lock.count', $microtimeout);
        if ((int)$previousTime < $microtime) {
            break;
        }
    }
} while (!$isLock);
$count = $redis->get('count')? : 0;
// file_put_contents('/var/log/count.log.1', ($count+1));
// 业务逻辑
echo "执行count加1操作~ \n\n";
$redis->set('count', $count+1);
// 删除锁
$redis->del('lock.count');
// 打印count值
$count = $redis->get('count');
echo "count值为:$count \n";


看恩吧
网站不承担任何有关评论的责任
  • 最新评论
  • 总共条评论
取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦