您的位置 首页 php

php redis引入LUA实现原子性操作(误删锁问题)

public function misoaha(){

 $uid=uniqid();
$ Redis  =new \Redis();
$redis->connect(' 127.0.0.1 ',6379);
try{
    do{
        $list =[];
        $key='test_key';
        $value =uniqid();
        $numkey ='storeid'.'11111';
        $redis->watch($numkey);
        if($redis->hget('www',$uid)){
            return ['msg'=>'不能重复'];
        }
            $is_ lock  = $redis->set($key,$value,['nx','ex'=>'10']);
            if($is_lock){

                $arr[$key] =$value;
                $stock = $redis->get($numkey);
                if($stock<=0){
                    if($redis->get($key)==$arr[$key]){
                        $redis->del($key);
                    }
                    return ['msg'=>'结束'];
                }
                $redis->multi();
                $redis->decr($numkey);
                $redis->lPush('list',$uid);
                $redis->exec();
                $redis->hSet('www',$uid,'11111');

                if(isset($arr)){
                    $id = $arr[$key];
                }
                $script = 'if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end';
                //使用 lua 脚本保证原子性
                $redis-> eval ($script, [$key, $id], 1);

                break;
            }else{

                 usleep (5000);
            }

        }while(!$is_lock);
        return $redis->lLen('list');
    }catch (\ Exception  $e){
        $redis->discard();
        return $e->getMessage();

    }  

}

文章来源:智云一二三科技

文章标题:php redis引入LUA实现原子性操作(误删锁问题)

文章地址:https://www.zhihuclub.com/149627.shtml

关于作者: 智云科技

热门文章

网站地图