zoukankan      html  css  js  c++  java
  • php,redis分布式锁防并发

     
     

    解决死锁

      如果只用SETNX命令设置锁的话,如果当持有锁的进程崩溃或删除锁失败时,其他进程将无法获取到锁,问题就大了。

    解决方法是在获取锁失败的同时获取锁的值,并将值与当前时间进行对比,如果值小于当前时间说明锁以过期失效,进程可运用Redis的DEL命令删除该锁。

    setnx的作用和memcache的add方法类似

    class rediss
        {
            private $redis;
            function __construct()
            {
                $this->redis= $this->redis();
            }
            public function redis(){
                $redis = new Redis();
                $redis->connect('127.0.0.1','6379') or die('con not redis');
                $redis->auth('1234');
                return $redis;
            }
            public function lock($key,$expire){
    
                $is_lock = $this->redis->setnx($key,(time()+$expire));
                
                //如果setnx赋值成功,则$is_lock返回1,否则返回空
                $is_lock=!empty($is_lock) ? 'true' : 'false';
                if($is_lock=='true'){
                    $this->redis->expire($key,$expire); //给键值加有效时间
                }
                return $is_lock;
            }
            public function delLock($key){
                return $this->redis->del($key);
            }
        }
        $bb = new rediss();
    
        $key='hua'; //键名
        $val=5;//传的参数
        
        $lock = $bb->lock($key,$val);
        if($lock=='false'){
            $hua = $bb->redis()->get($key);
            if(time()>$hua){
                $bb->delLock($key);
                echo "删除";
            }
        }else{
            echo $bb->lock($key,$val);
            //该区域进行sql操作
        }

    class rediss{private $redis;function __construct(){$this->redis= $this->redis();}public function redis(){$redis = new Redis();$redis->connect('127.0.0.1','6379') or die('con not redis');$redis->auth('1234');return $redis;}public function lock($key,$expire){
    $is_lock = $this->redis->setnx($key,(time()+$expire));//如果setnx赋值成功,则$is_lock返回1,否则返回空$is_lock=!empty($is_lock) ? 'true' : 'false';if($is_lock=='true'){$this->redis->expire($key,$expire); //给键值加有效时间}return $is_lock;}public function delLock($key){return $this->redis->del($key);}}$bb = new rediss();
    $key='hua'; //键名$val=5;//传的参数$lock = $bb->lock($key,$val);if($lock=='false'){$hua = $bb->redis()->get($key);if(time()>$hua){$bb->delLock($key);echo "删除";}}else{echo $bb->lock($key,$val);//该区域进行sql操作}

  • 相关阅读:
    第一次JAVA课,第一次课堂考,课后感受【代码部分】
    第一次JAVA课,第一次课堂考,课后感受
    小学期的开始【9.2进度报告】
    暑假的最后一周【8.26进度报告】
    一周质量报告【8.19进度报告】
    人月神话读后感(一)
    Web版记账本开发记录(二)开发过程遇到的问题小结1 对数据库的区间查询
    Web版记账本开发记录(一)代码和功能展示
    tomcat错误The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
    库存物资管理系统
  • 原文地址:https://www.cnblogs.com/hualingyun/p/9447677.html
Copyright © 2011-2022 走看看