Laksanakan mekanisme kunci menggunakan PHPRedis
<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>