• REDIS中加锁和解锁问题


    使用lua+redis的方法。之所以使用lua是为了保证原子性

    问题:

    1、 redis发现锁失败了要怎么办?中断请求还是循环请求?
    2、 循环请求的话,如果有一个获取了锁,其它的在去获取锁的时候,是不是容易发生抢锁的可能?
    3、 锁提前过期后,客户端A还没执行完,然后客户端B获取到了锁,这时候客户端A执行完了,会不会在删锁的时候把B的锁给删掉?

    针对问题1:使用循环请求,循环请求去获取锁
    针对问题2:针对第二个问题,在循环请求获取锁的时候,加入睡眠功能,等待几毫秒在执行循环
    针对问题3:在加锁的时候存入的key是随机的。这样的话,每次在删除key的时候判断下存入的key里的value和自己存的是否一样

            do {  //针对问题1,使用循环
                $timeout = 10;
                $roomid = 10001;
                $key = 'room_lock';
                $value = 'room_'.$roomid;  //分配一个随机的值针对问题3
                $isLock = Redis::set($key, $value, 'ex', $timeout, 'nx');//ex 秒
                if ($isLock) {
                    if (Redis::get($key) == $value) {  //防止提前过期,误删其它请求创建的锁
                        //执行内部代码
                        Redis::del($key);
                        continue;//执行成功删除key并跳出循环
                    }
                } else {
                    usleep(5000); //睡眠,降低抢锁频率,缓解redis压力,针对问题2
                }
            } while(!$isLock);
    

     

  • 相关阅读:
    php目录递归删除
    php嵌套数据
    HTML 标签
    枚举 递归
    传值传址 结构体
    去超市选择要购买的商品 将数组放入集合
    函数
    集合 ArrayList 类
    特殊集合 Stack Queue Hashtable
    二维数组,多维数组
  • 原文地址:https://www.cnblogs.com/linn/p/11045565.html
Copyright © 2020-2023  润新知