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.
lockRedisKey("ABC"); KOD YANG SAYA TAK MAHU JALANKAN SERENTAK! buka kunciRedisKey("ABC");
Malangnya, ia nampaknya tidak berfungsi dan menyebabkan lockRedisKey() bergelung tanpa had sehingga exit_time dicapai. Apa yang boleh berlaku?
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); }
Saya tahu saya mungkin menghadapi kebuntuan, jadi saya memutuskan untuk menggunakan transaksi, tetapi saya masih menghadapi masalah ini.
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(); }
"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
Kunci berfungsi dengan baik. Ini hanya merosakkan kod antara kunci dan menyebabkan kunci tidak dilepaskan :-)