Redis adalah satu benang, tetapi mengapa ia begitu pantas? Satu sebab ialah redis menggunakan IO dan pemultipleksan yang tidak menyekat untuk mengendalikan sejumlah besar sambungan pelanggan. Artikel berikut akan membawa anda memahami model IO benang dalam Redis. Saya harap ia akan membantu anda!
Redis ialah aplikasi satu utas dan Nginx kedua-duanya adalah model pelayan berprestasi tinggi. [Cadangan berkaitan: Tutorial video Redis]
Sebab mengapa Redis berbenang tunggal dan begitu pantas:
Satunya adalah kerana semua datanya berada dalam ingatan Semua operasi adalah operasi peringkat memori, jadi apabila menggunakan redis, perhatikan arahan dengan kerumitan masa O(n) Kerana ia berbenang tunggal, jika jumlah data terlalu besar, arahan lain akan disekat dan menunggu; >
Sebab kedua ialah redis menggunakan IO yang tidak menyekat dan pemultipleksan untuk mengendalikan sejumlah besar sambungan pelanggan. IO tidak menyekatApabila kita menggunakan kaedah baca dan tulis soket, ia menyekat secara lalai Iaitu, memanggil kaedah baca dan lulus a parameter n, menunjukkan bilangan maksimum bacaan Kembali selepas mengambil n bait Jika tidak ada satu bait, benang akan terus menunggu dalam kaedah baca sehingga data masuk atau sambungan ditutup pada masa ini dan benang boleh melaksanakan logik berikut,Kaedah tulis secara amnya tidak menyekat Melainkan penimbal tulis yang diperuntukkan oleh kernel untuk soket penuh, kaedah tulis akan menyekat sehingga terdapat ruang kosong dalam penimbal. . Rajah berikut menunjukkan proses terperinci membaca dan menulis soket. IO yang tidak menyekat menyediakan pilihan Non_Blocking apabila menggunakan soket Apabila pilihan ini dihidupkan, kaedah baca dan tulis tidak akan menyekat, tetapi akan membaca sama banyaknya boleh. , anda boleh menulis seberapa banyak yang anda mahukan Berapa banyak yang anda boleh baca bergantung pada bilangan bait data dalam penimbal baca yang diperuntukkan oleh kernel untuk soket data yang diperuntukkan oleh kernel dalam penimbal tulis soket Bilangan bait, kaedah membaca dan menulis akan memberitahu program berapa banyak bait telah dibaca dan ditulis melalui nilai pulangan. IO yang tidak menyekat bermakna benang tidak lagi perlu disekat apabila membaca dan menulis boleh disiapkan serta-merta, dan benang boleh terus melakukan perkara lain. Multiplexing (tinjauan acara)Walaupun IO tidak menyekat adalah pantas, ia juga membawa masalah membaca data dan kembali selepas membaca sebahagian daripadanya. Bilakah data yang tinggal akan terus dibaca? , menulis data, penimbal penuh dan belum ditulis sepenuhnya Bilakah data yang tinggal akan terus ditulis? Apabila anda boleh terus membaca atau terus menulis, anda harus memberi aplikasi pemberitahuan untuk memberitahu aplikasi bahawa anda boleh terus membaca atau terus menulis API pengundian acara digunakan untuk menangani masalah ini.
pilih
Sistem pengendalian menyediakan fungsi pilih kepada program pengguna Input ialah senarai deskriptor baca dan tulis read_fds & write_fds, dan outputnya adalah Untuk peristiwa yang boleh dibaca dan boleh ditulis yang sepadan, juga menyediakan parameter tamat masa paling lama utas akan meneruskan pemprosesan. Jika masa tamat masa melebihi, Kaedah juga akan kembali Jika acara diperoleh, utas boleh memproses acara yang sepadan satu demi satu, ia akan terus memanggil pilih undian api, jadi benang sebenarnya adalah gelung tak terhingga dan terus memilih pemprosesan tanpa henti, berulang-alik, gelung tanpa henti ini dipanggil gelung peristiwa dan gelung ialah kitaran. Pseudokod gelung peristiwa:while True read_events, write_events = select(read_fds, write_fds, timeout) for event in read_events: handle_read(event.fd) for event in write_events: handle_write(event.fd) handle_others() # 做其他的逻辑处理,处理定时任务等等
Pelayan bukan sahaja perlu bertindak balas kepada acara IO, tetapi juga perlu mengendalikan beberapa perkara lain, seperti tugasan berjadual aplikasi itu sendiri Jika urutan menyekat pada panggilan pilih, menunggu pengembalian pilih, ini akan menyebabkan Beberapa tugas berjadual telah tamat tempoh tetapi belum dilaksanakan
Tugas berjadual Redis direkodkan dalam struktur data yang dipanggil timbunan minimum Dalam timbunan ini, tugas terpantas untuk dilaksanakan berada di kedudukan teratas Setiap kitaran Semasa kitaran, redis akan memproses tugasan dalam timbunan yang telah mencapai titik masa Selepas
diproses, ia akan merekodkan masa yang diperlukan untuk tugasan dilaksanakan dalam. timbunan. Apabila pilih dipanggil semula, kali ini akan menjadi Nilai tamat masa bermakna tiada tugas lain yang perlu dilaksanakan dalam tempoh ini dengan yakin bahawa ia akan menyekat paling lama ini, dan kemudian melakukan pemprosesan yang sepadan selepas masa tamat.
Prinsip pemprosesan acara NodeJs dan Nginx adalah serupa dengan Redis.
Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati: Video Pengaturcaraan! !
Atas ialah kandungan terperinci Artikel ini akan membawa anda memahami dengan cepat model IO benang dalam Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!