cari

Rumah  >  Soal Jawab  >  teks badan

redis - Acara loteri PHP ditambah kunci memori, apakah prinsipnya?

Apakah prinsip menambah kunci memori pada acara loteri PHP?

 fungsi awam memperoleh($key) {
        //Jika anda perlu memperoleh dua kunci pada masa yang sama
        if ( is_array($key) && count($key) == 2 ) {
            manakala (BENAR) {
                $res = array();
                foreach($kunci sebagai $k => $v) {
                    $res[$k] = $this->acquire($v);
                    jika ( !$res[$k] ) {
                        pecah;
                    }
                }
                //Jika kunci pertama tidak diperoleh, kembalikan terus
                jika ( !$res[0] ) {
                    $err = SysErr baharu(System::MEMCACHE_ACQUIRE_LOCK_ERROR);
                    ErrorHandle::throwErr($err);
                } elseif( !$res[1] ) {
                    //Lepaskan kunci pertama, tunggu dan cuba lagi
                    $this->release($key[0]);
                    usleep(LockConfig::LOCK_TIMEWAIT);
                } lain {
                    kembalikan BENAR;
                }
            }
        } lain {
            $lock_key = LockConfig::LOCK_PREFIX .
            $i = 0;
            buat {
                $lock = $this->_memcache->add( $lock_key, 1, LockConfig::LOCK_TIMEOUT );
                //Jika kunci tidak diperoleh buat kali pertama, tunggu masa yang ditentukan dan cuba lagi.
                jika ($i > 0) {
                    usleep(LockConfig::LOCK_TIMEWAIT);
                }
                $i++;
                //Keluar selepas melebihi bilangan percubaan semula
                jika ($i > LockConfig::LOCK_RETRY_TIMES) {
                    $err = SysErr baharu(System::MEMCACHE_ACQUIRE_LOCK_ERROR);
                    ErrorHandle::throwErr($err);
                }
            } while( !$lock );

            // log rekod
            jika ($i > 1) {
                LogHelper::warning('lock.log', "Peroleh kunci '{$lock_key}' untuk {$i} kali");
            }
            pulangkan $lock;
        }
    }
    
    
      /**
     * Lepaskan kunci ingatan
     *
     * @param string $key Nilai kekunci selepas mengalih keluar awalan kunci memori
     * @return bool Mengembalikan TRUE jika berjaya dikeluarkan
     */
    keluaran fungsi awam($key) {
        $lock_key = LockConfig::LOCK_PREFIX .
        kembalikan $this->_memcache->delete($lock_key);
    }
仅有的幸福仅有的幸福2756 hari yang lalu606

membalas semua(1)saya akan balas

  • 为情所困

    为情所困2017-05-16 13:11:23

    Anda tidak memerlukan kunci memori untuk loteri. Anda boleh menggunakan baris gilir atau transaksi Redis dan menambah kunci Mysql. .

    Saya tidak tahu sama ada kunci memori yang anda mahukan ialah ini:
    $kunci = new CacheLock('key_name');
    $lock->lock(); );
    Kunci proses CacheLock digunakan terutamanya untuk pemerolehan cache satu proses apabila cache gagal menghalang permintaan SQL yang berlebihan daripada menembusi pangkalan data Ia digunakan untuk menyelesaikan kawalan kunci PHP semasa konkurensi dan melakukan penguncian antara proses melalui fail /eaccelerator Jika tidak Gunakan eccelerator untuk memproses kunci fail, dan hasilkan kunci dengan butiran yang sepadan dalam direktori yang sepadan, pemprosesan dilakukan dalam ingatan, dan prestasinya agak tinggi. Kunci berbeza dilaksanakan secara selari -kunci peringkat mysql innodb.

    balas
    0
  • Batalbalas