zoukankan      html  css  js  c++  java
  • 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);
    

     

  • 相关阅读:
    Spring 集成 MemCache
    memCachedClient 客户端调用时注意的问题,坑
    二)spring 集成 ehcache jgroups 集群
    三)mybatis 二级缓存,整合ehcache
    四)mybatis 二级缓存 ehcache 常见问题
    都有哪些 cache ?
    【转】高并发的核心技术-幂等的实现方案
    如何学习一门编程语言
    WebService学习记录
    代理
  • 原文地址:https://www.cnblogs.com/linn/p/11045565.html
Copyright © 2011-2022 走看看