Laksanakan mekanisme kunci menggunakan PHPRedis
P粉515066518
P粉515066518 2023-08-28 18:33:09
0
2
459

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(); }

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!