php+redis实现加锁与解锁操作


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

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

1.jpg

并发的情况下,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;

// 如果 $key 不存在的话,就设置 $key 的值为 $value,且有效期为 3s;

// return TRUE / FALSE

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读写分离与哨兵机制配置

通过mysql导出查询结果到csv方法的讲解

redis如何修改默认密码

提高工作效率:mysql的优化技巧

redis中set和hset的区别和使用场景

redis数据过期策略详解

redis端口号是多少

使用命令连接redis

更多相关阅读请进入《PHP》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...