首页 > 数据库 >PHP redis 分布式锁 实现

PHP redis 分布式锁 实现

时间:2023-02-10 17:11:22浏览次数:46  
标签:return lockId lock redis scene PHP config 分布式

<?php
/**
* redis 分布式锁
*/
class RedisLock{
private $config;
private $redis;
public function __construct($config = []){
$this->config = $config ? $config : ['host' => '127.0.0.1', 'port' => 6379];
$this->redis = $this->connect();
}
public function connect(){
$redis = new \Redis();
$redis->connect($this->config['host'], $this->config['port']);
return $redis;
}

/**
* @param $scene 锁场景
* @param $expire 锁有效期
* @return bool
*/
public function lock($scene = null , $expire = 10){
if (!$scene || !$expire){
return false;
}
// 生成随机值,锁标识
$lockId = md5(uniqid());
$result = $this->redis->set($scene, $lockId, ['NX', 'EX' => $expire]) ;

if($result)
return $lockId;
else
return $result;
}

/**
* 解锁
*/
public function unLock($scene, $lockId){

$lua = <<<SCRIPT
local key=KEYS[1]
local value=ARGV[1]
if(redis.call('get', key) == value)
then
return redis.call('del', key)
end
SCRIPT;
// 执行lua脚本
return $this->redis->eval($lua, [$scene, $lockId], 1);
}
}

//实现
$lock = new \Tests\Feature\RedisLock();
//第一次加锁
$res = $lock->Lock("test", 30);
var_dump($res); // 返回lockId
echo "<br>";
//第二次加锁
$res1 = $lock->Lock("test", 25);
var_dump($res1); //加锁失败 false
//解锁
if($res){
$lock->unLock("test", $res);
}


标签:return,lockId,lock,redis,scene,PHP,config,分布式
From: https://www.cnblogs.com/cocoqi/p/17109674.html

相关文章

  • php安装程序
      1.下载ZBlog,解压文件。复制黏贴到php路径下  2.重启Nginx,在浏览器输入127.0.0.1,进配置安装Zblog 3.安装完成后进入navicatpremium,新建一个数据库。  4.......
  • Java连接redis的工具类
    importorg.springframework.data.redis.core.StringRedisTemplate;importorg.springframework.stereotype.Component;importjavax.annotation.Resource;importjav......
  • 4种 Redis 集群方案及优缺点对比
    4种Redis集群方案及优缺点对比在服务开发中,单机都会存在单点故障的问题,及服务部署在一台服务器上,一旦服务器宕机服务就不可用,所以为了让服务高可用,分布式服务就出......
  • 【转】分布式架构概述及设计
     转,原文: https://blog.csdn.net/l6108003/article/details/94835586----------------------------------------引言随着越来越多的人参与到互联网的浪潮来,曾经的单体......
  • PHP 检测访问设备是移动端还是PC端
    $userAgent=$_SERVER['HTTP_USER_AGENT'];$devices=array("iPhone"=>"(iPhone)","Android"=>"(Android)","WindowsPhone"=>"(WindowsPhone)","i......
  • 分布式锁的三种实现方式
    分布式锁三种实现方式:1231.基于数据库实现分布式锁;2.基于缓存(Redis等)实现分布式锁;3.基于Zookeeper实现分布式锁; 一,基于数据库实现分布式锁......
  • 学习笔记——redis集群(定义、集群连接、查看集群、节点分配方式、插槽、集群中录入值
    2023-02-10 一、集群的定义1、redis集群实现了对redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在N个节点中,每个节点存储总数据的1/N。2、redis集群通过分区......
  • phpLDAPadmin 创建用户
    登陆phpLDAPadmin 点击左侧「cn=admin,dc=example,dc=org」 点击 ......
  • redis-命令操作-String&hash,list,set&sortedset,通用命令
    redis-命令操作-String&hashString类型存储:setkeyvalue获取:getkey删除:delkey   Hash类型存储:hsetkeyfieldvalue  获取:hgetkeyfield:获取指......
  • redis命令操作
    redis命令操作——list列表类型list:可以添加一个元素到列表的头部(左边)或者尾部(右边)添加:1、lpushkeyvalue:将元素加入列表左边2、rpushkeyvalu......