Laksanakan mekanisme kunci menggunakan PHPRedis
P粉515066518
P粉515066518 2023-08-28 18:33:09
0
2
534
<p>Saya mendapat dua fungsi berikut untuk mengunci kekunci Redis. Saya cuba menghalang pelaksanaan serentak blok kod menggunakan Redis. Jadi apa yang saya lakukan ialah menggunakan fungsi berikut untuk menghalang benang yang berbeza daripada melaksanakan kod yang sama. </p> <pre class="brush:php;toolbar:false;">lockRedisKey("ABC"); KOD YANG SAYA TAK MAHU JALANKAN SERENTAK! buka kunciRedisKey("ABC");</pre> <p>Malangnya, ia nampaknya tidak berfungsi dan menyebabkan lockRedisKey() bergelung tanpa had sehingga exit_time dicapai. Apa yang boleh berlaku? </p> <pre class="brush:php;toolbar:false;">kunci fungsi awam statikRedisKey($key, $value = "true") { $redis = RedisClient::getInstance(); $masa = masa mikro(benar); $masa_keluar = $masa + 10; $tidur = 10000; buat { // Kunci Redis dengan PX dan NX $lock = $redis->setnx("kunci:" . $key, $value); jika ($kunci == 1) { $redis->tamat tempoh("kunci:" . $kunci, "10"); kembali benar; } usleep($sleep); } while (microtime(true) < $exit_time); kembali palsu; } fungsi awam statik buka kunciRedisKey($key) { $redis = RedisClient::getInstance(); $redis->del("kunci:" . $key); }</pre> <p>Saya tahu saya mungkin menghadapi kebuntuan, jadi saya memutuskan untuk menggunakan transaksi, tetapi saya masih menghadapi masalah ini. </p> <pre class="brush:php;toolbar:false;">kunci fungsi awam statikRedisKey($key, $value = "true") { $redis = RedisClient::getInstance(); $masa = masa mikro(benar); $masa_keluar = $masa + 10; $tidur = 10000; buat { // Kunci Redis dengan PX dan NX $redis->multi(); $redis->set('kunci:' . $key, $value, array('nx', 'ex' => 10)); $ret = $redis->exec(); if ($ret[0] == benar) { kembali benar; } usleep($sleep); } while (microtime(true) < $exit_time); kembali palsu; } fungsi awam statik buka kunciRedisKey($key) { $redis = RedisClient::getInstance(); $redis->multi(); $redis->del("kunci:" . $kunci); $redis->exec(); }</pre></p>
P粉515066518
P粉515066518

membalas semua(2)
P粉386318086

"masa_keluar" anda terlalu kecil. Saya rasa $exit_time = $time + 10 bermaksud menutupnya selepas 10 saat. Walau bagaimanapun, masa yang ditetapkan ialah masa mikro.

Mungkin anda boleh menggantikan '$exit_time = $time + 10;' dengan '$exit_time = $time + 100000;'. Ditulis oleh Terjemahan Google

P粉336536706

Kunci berfungsi dengan baik. Ini hanya merosakkan kod antara kunci dan menyebabkan kunci tidak dilepaskan :-)

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!