Rumah  >  Soal Jawab  >  teks badan

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>
P粉515066518P粉515066518442 hari yang lalu623

membalas semua(2)saya akan balas

  • P粉386318086

    P粉3863180862023-08-29 12:37:10

    "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

    balas
    0
  • P粉336536706

    P粉3365367062023-08-29 11:16:33

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

    balas
    0
  • Batalbalas