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操作}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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)