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操作}

posted on   泽一年  阅读(5163)  评论(1编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示