自己封装一个加锁的类
<?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;
}
}
然后进行调用加锁和解锁的方法
网友评论