本文摘自PHP中文网,作者尚,侵删。

业务背景:在房间棋牌游戏中需要用到锁来防止并发操作引起的 redis 数据脏读问题;例如添加用户进入房间的动作:

并发的情况下,get RoomUsers 会有脏读现象;
解决思路:加锁房间来实现 一个房间每次只允许一个客户端操作,其他并发客户端则等待;也就是-----堵塞锁;
加锁:redis加锁方式有几种: incr、set、setnx、hSetnx,可以参考这篇文章:redis加锁的几种实现
推荐:PHP视频教程
这里我用到 set 这种方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $roomId = $_GET [ 'roomId' ];
$user = $_GET [ 'user' ];
$key = "LockRoom:{$roomId}" ;
$value = $roomId .uniqid();
$ex = 3;
while (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秒;
阅读剩余部分
相关阅读 >>
redis的发布订阅功能
redis阻塞原因详解
redis性能有哪些问题
windows系统添加和删除redis服务的方法
redis的两种安装部署方式(图文详解)
为什么redis是单线程,为什么这么快?
redis->eval() 到底好在哪?
如何通过PHP实现mysql数据库连接、查询、记录集等操作
redis索引是什么
用PHP 读取rss feed的代码示例
更多相关阅读请进入《PHP》频道 >>
机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » php+redis实现加锁与解锁操作