Pelayan menggunakan seni bina nginx
php-fpm
dan redis menggunakan sambung untuk menyambung Setiap permintaan rangkaian harus mempunyai proses php-fpm
yang berasingan. Saya menulis gelung dengan blPop/brPop
dan sleep(5)
dalam gelung. Penyemak imbas membuka dua tab dan menjalankannya, dan kemudian lpush
memuatkan 4 data ke dalam list
saya mendapati bahawa tab yang sentiasa berjalan dahulu boleh membaca dua data pertama. Dalam erti kata lain, blPop/brPop
menyekat semua blPop/brPop
yang lain pada keseluruhan pelayan yang mendengar kunci yang sama?
Berikut ialah kod yang saya uji:
//堵塞出隊(duì)列
public function test(){
tool::load('hRedis.php');
$timeOut = 20;//堵塞20秒
$cn = 'test_blist';
$ress = [];
for($i=0;$i<2;$i++){
$ress[] = hRedis::cacheListBPop($cn,$timeOut);//這里面封裝了redis的blPop/brPop
sleep(5);
}
print_r($ress);
}
Mengapa proses yang berjalan kemudian masih disekat semasa tempoh tidur proses yang berjalan dahulu?
Kami melakukan ujian lanjut, mengalih keluar gelung, melaksanakan setiap proses sekali sahaja dan menggunakan redis->close()
selepas setiap bacaan Kami mendapati bahawa masa tamat kedua-dua proses masih berbeza kira-kira 16 saat.
Untuk ujian terakhir, saya meletakkannya pada dua pelayan sekali lagi, kali ini bukan dua proses pada pelayan yang sama, tetapi dua pelayan saya mendapati bahawa masa tamat kedua-dua pelayan, bilangan saat berbeza bilangan saat yang saya masukkan ke dalam dua pelayan Masa antara kepingan data! Tiada kelewatan kali ini!
Pertama sekali, Redis adalah satu utas, dan sebarang permintaan yang dihantar ke pelayan akan dibariskan dan dilaksanakan mengikut urutan Jadi anda berkata bahawa setiap permintaan rangkaian harus mempunyai proses yang berasingan, yang saya fikir adalah salah
arahan blPop , bukan bahagian pelayan, jika tidak, ia akan membawa maut untuk Redis berulir tunggal
Selepas anda membuka dua tab, ia bersamaan dengan membuka 2 tab dan tiada data push, 2 pelanggan ini adalah kedua-duanya dalam keadaan menyekat, dan masa menyekat anda ditetapkan kepada 20 saat
Apabila anda menolak data ke senarai, kedua-dua pelanggan melakukan operasi brpop pada kekunci yang sama, maka klien yang melaksanakan perintah brpop dahulu boleh mendapatkan nilai pop. , iaitu, halaman tab pertama tidur 5s, pop data lain, dan kemudian keluarkannya Selepas pelanggan pertama keluar, jika pelanggan kedua masih melaksanakan baris pop, saya fikir Ia harus mengeluarkan nilai berikutnya antara dua pelanggan adalah sangat singkat, ia mungkin akan keluar Anda boleh melaraskan selang masa pembukaan antara kedua-dua pelanggan dan kemudian beritahu saya jawapannya
Ayat "Setiap permintaan rangkaian harus mempunyai proses yang berasingan" adalah salah dan telah ditukar kepada "Setiap permintaan rangkaian harus mempunyai proses php-fpm
yang berasingan".
Soalan kedua adalah seperti yang anda katakan, pelanggan kedua akan mengeluarkan nilai yang berikutnya, tetapi masa apabila pelanggan kedua mengeluarkan nilai adalah 16 saat kemudian secara purata daripada pelanggan pertama saya ingin tahu mengapa ia sangat lambat, boleh dipendekkan? Mengapa klien kedua tidak boleh mendengar pada masa yang sama dengan klien pertama?