php+redis实现加锁,防止超卖、抢购

全屏阅读
  • 基本信息
自己封装一个加锁的类<?php// 增加redis锁 避免同时下单class Rlock {
  // $scene 为场景值 随意填写
    protected $lockId;// 记录加锁的客户端id
    public function __construct() {
        $redis = new Redis();
        $redis->connect('127.0.0.1',6379);
        
        $redis->auth('123456'); //密码验证
      
        $this->redis = $redis;
    }
    // 加锁
    public function lock($scene){
        $res = false;
        $time = 5;
        while($time-- >0){
            // 加锁 普通盲盒场景下
            $valule = session_create_id();// 生成不重复的字符串
            $res = $this->redis->set($scene,$valule,["NX","EX"=>5]);
            if($res){
                // 加锁成功 记录下当前的value值
                $this->lockId[$scene] = $valule;
                break;// 加锁成功 跳出循环
            }
        }
        return $res;
    }
    
    // 解锁
    public function unLock($scene){
        // 能够删除自己的锁,不应该删除别人的锁
        if($this->lockId[$scene]){
            $value = $this->redis->get($scene); // 从redis当中获取value值
            $id = $this->lockId[$scene];// 当前请求的记录值
            // 从redis当中获取的id 跟当前请求记录的id是否是同一个
            if($value == $id){
                return $this->redis->del($scene); // 删除锁
            }
        }
        return false;
    }
  
  }

然后进行调用加锁和解锁的方法

顶一下
(0)
100%
订阅 回复
踩一下
(0)
100%
» 郑重声明:本文由mpxq168发布,所有内容仅代表个人观点。版权归恒富网mpxq168共有,欢迎转载, 但未经作者同意必须保留此段声明,并给出文章连接,否则保留追究法律责任的权利! 如果本文侵犯了您的权益,请留言。

目前有 0 条留言 其中:访客:0 条, 博主:0 条

给我留言

您必须 [ 登录 ] 才能发表留言!