开发者社区> 问答> 正文

请问 这种并发锁的原理是什么?

自己见过的锁都是类似先定义一个变量 = true, 相关操作完成之后再把相关的值变成false.

$lock_num = 0;
 while(!redis_helper::lock("lottery")) {
     if($lock_num >= 300) {
         return "亲,好多人在排队抢红包啊,请重新进入页面";
     }
     // 0.1s
     usleep(100000);
     $lock_num ++;
 }

下面是并发锁定的相关函数, 自己能明白这个锁每6s会变换一次真假值,但是不明白结合上面的$lock_num针对的并发情况到底是啥? 没6s变换真假值,6s/0.1s = 60次,怎么会达到300,页面卡住了,其他人恰好重新将锁设置为假?

/**
 * 并发锁定
 * @param string $name 锁名称
 * @param int $expires 超时失效的时间,单位秒
 * @return bool true:获取锁成功,false:获取锁失败
 */
public static function lock($name, $expires = 5)
{
    self::init_redis();

    $key = $name . '_lock';
    $now = time();
    $val = $now + $expires + 1;
    if(self::$redis->setnx($key, $val)) {
        return true;
    } else {
        $old_val = self::$redis->get($key);

展开
收起
爵霸 2016-03-09 11:44:14 2623 0
2 条回答
写回答
取消 提交回答
  • 这种锁叫 自旋锁

    2019-07-17 18:55:44
    赞同 展开评论 打赏
  • 我的理解是尝试300次获取锁,如果失败了,就告诉用户失败。
    成功获取锁的话,有6秒的独占时间。这个时间用来给程序处理后续的业务逻辑,比如生成订单。6秒过后,下一个用户进来,继续获取锁。

    `
    lock ->do sth. ->release
    lock ->do sth. ->release
    lock ->do sth. ->release
    lock ->do sth. ->release
    `

    2019-07-17 18:55:44
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
多线程 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多