php和redis实现加解锁的方法
发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,这篇文章将为大家详细讲解有关php和redis实现加解锁的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。业务背景:在房间棋牌游戏中需要用到锁来防止并发操作引起的
千家信息网最后更新 2025年11月09日php和redis实现加解锁的方法
这篇文章将为大家详细讲解有关php和redis实现加解锁的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
业务背景:在房间棋牌游戏中需要用到锁来防止并发操作引起的 redis 数据脏读问题;例如添加用户进入房间的动作:

并发的情况下,get RoomUsers 会有脏读现象;
解决思路:加锁房间来实现 一个房间每次只允许一个客户端操作,其他并发客户端则等待;也就是-----堵塞锁;
加锁:redis加锁方式有几种: incr、set、setnx、hSetnx,可以参考这篇文章:redis加锁的几种实现
这里我用到 set 这种方式
$roomId = $_GET['roomId'];$user = $_GET['user']; // '张三'$key = "LockRoom:{$roomId}";$value = $roomId.uniqid();$ex = 3;// 如果 $key 不存在的话,就设置 $key 的值为 $value,且有效期为 3s; // return TRUE / FALSEwhile(true){ $res = $this->redis->set($key, $value, ['nx', 'ex' => $ex]); if($res) { break; } usleep(5000);}// 将用户添加进房间$roomUsers = $this->redis->get("Room:{$roomId}:Users"); // ['李四', '王五']$roomUsers[] = $user;$this->redis->set("Room:{$roomId}:Users", $roomUsers); // ['李四', '王五', '张三']解锁:操作完当然要解锁了,不解锁起码要等待 3秒;
解锁用 delete 删除 key; 但是这里有个坑,不能直接用 delete,因为假设 client01 获得了锁,在添加用户进入房间的过程中 时间超过了 3秒 ,这个时候client02 就会同样获得锁并且设置3S,然后当client01 操作完之后 delete key , 就把 client02 设置的锁删除了;
这里推荐用 lua 代码执行删除,因为lua 执行具有原子性。
// 将用户添加进房间$roomUsers = $this->redis->get("Room:{$roomId}:Users"); // ['李四', '王五']$roomUsers[] = $user;$this->redis->set("Room:{$roomId}:Users", $roomUsers); // ['李四', '王五', '张三']// lua 脚本解锁// 先判断 key的值是否为 value, TRUE 才会删除, 所以 $value 的设计要有随机唯一性$script = 'if redis.call("get",KEYS[1]) == ARGV[1]then return redis.call("del",KEYS[1])else return 0end ';$this->redis->eval($script, array($key , $value), 1);关于php和redis实现加解锁的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
房间
用户
李四
王五
篇文章
张三
方法
客户
客户端
方式
更多
参考
不错
实用
有效
业务
也就是
代码
内容
动作
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
赛克数据库管理系统
思科网络技术学院教程有几本
健康科技互联网医疗全产业链
面试网络安全一般需要笔试吗
上海莜贝网络技术有限公司
宏达新材网络安全
服务器机房到底有没有辐射
学校网络安全风险评估
工业软件开发和软件开发一样吗
客户端访问ftp服务器时端口
远程公司网络安全吗
无法连接数据库怎么改密码
数据库结构化的分类
裸金属服务器网络类型有哪些
linux 服务器防护墙
重量级软件开发方法
怎么架设vps服务器
软件开发想跳槽五月份可以吗
服务器正在忙碌请稍后
昆虫识别软件开发
吉林软件开发中心
服务器数据全部被清空
软件开发内部运营管理
服务器系统更新显示器不亮
网络安全变成机器人格斗
网络安全高级培训
华讯网络技术面过了
南京华锐软件开发公司
网吧cpu取决于服务器吗
球球大作战可以换服务器吗