php redis的加锁与解锁
这篇文章主要介绍了关于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 / 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秒;
解锁用 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 0 end '; $this->redis->eval($script, array($key , $value), 1);
具体还可以看看 这篇文章:解锁 Redis 锁的正确姿势
还有php操作redis的文档:PhpRedis 里面有 set()、eval() 函数的解释
注意:用 lua 脚本这里 php.ini 需要开放 shell_exec() 等系统函数
以上代码仅作参考!!
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
Atas ialah kandungan terperinci php redis的加锁与解锁. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Bagaimanakah penyelesaian caching Redis menyedari keperluan senarai kedudukan produk? Semasa proses pembangunan, kita sering perlu menangani keperluan kedudukan, seperti memaparkan ...

Redis memainkan peranan penting dalam penyimpanan dan pengurusan data, dan telah menjadi teras aplikasi moden melalui pelbagai struktur data dan mekanisme kegigihannya. 1) REDIS menyokong struktur data seperti rentetan, senarai, koleksi, koleksi yang diperintahkan dan jadual hash, dan sesuai untuk logik perniagaan cache dan kompleks. 2) Melalui dua kaedah ketekunan, RDB dan AOF, Redis memastikan penyimpanan yang boleh dipercayai dan pemulihan data yang cepat.

Dalam springboot, gunakan redis untuk objek OAuth2Authorization Cache OAuth2. Dalam aplikasi Springboot, gunakan SpringsecurityoAuth2Authorizationsererver ...

IIS dan PHP serasi dan dilaksanakan melalui FastCGI. 1.IIS meneruskan permintaan fail .php ke modul FastCGI melalui fail konfigurasi. 2. Modul FastCGI memulakan proses PHP untuk memproses permintaan untuk meningkatkan prestasi dan kestabilan. 3. Dalam aplikasi sebenar, anda perlu memberi perhatian kepada butiran konfigurasi, debugging ralat dan pengoptimuman prestasi.

Pelbagai panggilan ke session_start () akan menghasilkan mesej amaran dan kemungkinan penggantian data. 1) PHP akan mengeluarkan amaran, menyebabkan sesi telah dimulakan. 2) Ia boleh menyebabkan penggantian data sesi yang tidak dijangka. 3) Gunakan session_status () untuk memeriksa status sesi untuk mengelakkan panggilan berulang.

Kenapa nilai pulangan kosong apabila menggunakan redistemplate untuk pertanyaan batch? Apabila menggunakan Redistemplate untuk operasi pertanyaan batch, anda mungkin menghadapi hasil yang dikembalikan ...

Redis adalah sistem penyimpanan struktur data memori, terutamanya digunakan sebagai pangkalan data, cache dan broker mesej. Ciri-ciri terasnya termasuk model tunggal, multiplexing I/O, mekanisme ketekunan, replikasi dan fungsi clustering. Redis biasanya digunakan dalam aplikasi praktikal untuk caching, penyimpanan sesi, dan beratur mesej. Ia dapat meningkatkan prestasinya dengan memilih struktur data yang betul, menggunakan saluran paip dan urus niaga, dan pemantauan dan penalaan.

AI boleh membantu mengoptimumkan penggunaan komposer. Kaedah khusus termasuk: 1. Pengoptimuman Pengurusan Ketergantungan: AI menganalisis kebergantungan, mengesyorkan kombinasi versi terbaik, dan mengurangkan konflik. 2. Generasi Kod Automatik: AI menjana fail komposer.json yang sesuai dengan amalan terbaik. 3. Meningkatkan Kualiti Kod: AI mengesan masalah yang berpotensi, memberikan cadangan pengoptimuman, dan meningkatkan kualiti kod. Kaedah ini dilaksanakan melalui pembelajaran mesin dan teknologi pemprosesan bahasa semulajadi untuk membantu pemaju meningkatkan kecekapan dan kualiti kod.
